Android布局之屏幕自适应
在做应用时发现程序没有屏幕自适应功能,变换手机使用之后,界面就很混乱了,字体也很奇怪。经过百度的帮助,找到自适应方法。
1字体的自适应
这里又有关于Android下表示大小的单位的相关知识。
下面列出几种表示单位:
1.1dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA (WVGA=800x480,HVGA=480x320, QVGA=320x240)推荐使用这个,不依赖像素。
1.2px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。
1.3pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用;
1.4sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。可以根据用户的字体大小首选项进行缩放
根据上面对单位的分析,使用sp为单位就可以实现自适应字体大小啦。亲测,比较好用。
在你的res文件夹中创建一个文件夹,叫做values-320x240。其中320x240是你手机屏幕的分辨率,根据你手机屏幕的情况做不同的命名,例如values-800x480。在该文件夹下创建一个dimens.xml文件,定义各种字体的大小。那么系统就会自动根据你手机屏幕的分辨率去调用响应的文件夹。
另外,值得提醒的是,记得在你默认的values文件下的dimens.xml文件中也要写上相应的字体大小哦,因为当系统无法认识你手机屏幕大小的时候,它会自动去找你默认文件中的东西,没有写的话程序会崩溃。
2布局自适应
下面的介绍,就是今天让我几度抓狂的东西。
首先先介绍百度告知的几种自适应的方法:
2.1不同的layout
Android手机屏幕大小不一,有480x320,640x360, 800x480,854x480.怎样才能让App自动适应不同的屏幕呢?其实很简单,只需要在res目录下创建不同的layout文件夹,比如layout-640x360,layout-800x480,所有的layout文件在编译之后都会写入R.java里,而系统会根据屏幕的大小自己选择合适的layout进行使用。但是需要注意的是根据分辨率添加layout文件时,layout这个原来的文件夹及资源一定要存在,否则会出现错误。同时在命名layout文件夹时,必须遵守这样的规则.layout-640x360 大数放在小数的前面,否则会报错。下图为需要定义的文件夹和文件:
drawable-hdpi、drawable-mdpi、drawable-ldpi的区别:
(1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)
(2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480)
(3)drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320)
备注:三者的解析度不一样,就像你把电脑的分辨率调低,图片会变大一样,反之分辨率高,图片缩小。
2.2利用weight属性
保证页面的布局随着屏幕的大小变化而变化,最好使用相对布局方式,少使用绝对赋值。
将你控件的layout中的width、height设置为fill-parent,不要使用wrap——content。因为wrap-content的大小是不固定的。而weight(权重)这个属性很好的解决了这个问题。当包裹在控件外面的Layout的width、height属性都设置为fill-parent时,可以利用weight的反比特性。即如果控件A设置weight为9,控件B设置weight为20,那么A所占的空间为20/(9+20),B所占的空间为9/(9+20)。这样的反比属性对任何分辨率下的手机都是合适的。
这种方法虽然解决了自适应问题,但是在我使用的时候发现我有需要使用wrap_content属性的时候,就会出现layout无法填满的现象。(也有可能是我的布局有问题)。
2.3在程序中制定
获得屏幕的大小,在程序中设置height和width属性。
//得到屏幕的高度
Int heigh = (Activity)m_context).getWindowManager().getDefaultDisplay().getHeight();
textview.setHeight((int)( heigh /14);
这种方法感觉不太适合复杂布局,但是我正在编写的应用时够了~
以上各种总结可能会有错误,以后发现会积极改正。经过一天乱七八糟的抓狂编程,觉得自己还是没有细细的去研究这些要点,而且使用非常死板,没有灵活运用API。