Android布局之屏幕自适应

      Android布局之屏幕自适应

         在做应用时发现程序没有屏幕自适应功能,变换手机使用之后,界面就很混乱了,字体也很奇怪。经过百度的帮助,找到自适应方法。

1          字体的自适应

这里又有关于Android下表示大小的单位的相关知识。

下面列出几种表示单位:

1.1     dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGAHVGAQVGA WVGA=800x480HVGA=480x320, QVGA=320x240)推荐使用这个,不依赖像素。

1.2     px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。

1.3    pt: point,是一个标准的长度单位,1pt1/72英寸,用于印刷业,非常简单易用;

1.4    sp: 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-hdpidrawable-mdpidrawable-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。

你可能感兴趣的:(编程,android,百度,layout,手机,360)