android屏幕自适应

来源:互联网 发布:ubuntu navicat 乱码 编辑:程序博客网 时间:2024/06/05 03:50

市场上手机种类繁多,尺寸大小与分辨率也不尽相同,因此对于android软件开发人员来说,屏幕的适应能力成了所要解决的问题。


首先要使设计的界面适应屏幕,可多用LinearLayout和RelativeLayout,尽量不要使用绝对布局;控件的长、宽值多使用match_parent或者wrap_content,或者在布局中可多使用layout_weight属性;如需要固定的长度,采用单位为设备独立像素(dp/dip/sp),并且将其定义在dimens资源文件中再引用,而非直接写在layout中。


一、layout_weight属性的使用

LinearLayout或其子类具有layout_weight属性,使用layout_weight属性,可以使屏幕自适应能力更强,但在使用时有些需要注意的地方,下面以LinearLayout为例展开说明。

当LinearLayout的orientation属性值为horizontal时(子视图以横向排列),那么使用layout_weight时应将子视图的layout_width属性设置为0dp,否则layout_weight属性不起作用;此时layout_weight表示横向比重。

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal" >    <View        android:id="@+id/view1"        android:layout_width="0dp"        android:layout_height="wrap_content"        android:layout_weight="2" />        <View        android:id="@+id/view2"        android:layout_width="0dp"        android:layout_height="wrap_content"        android:layout_weight="3" /></LinearLayout>
 如上代码,表示view1与view2横向排列,view1的宽度占LinearLayout宽度的2/(2+3)即2/5,view2的宽度占LinearLayout宽度的3/5。

同样,如果LinearLayout的orientation属性值为vertical时,子视图以纵向排列,那么使用layout_weight时应将子视图的layout_height属性设置为0dp,否则layout_weight属性不起作用;此时layout_weight表示纵向比重,占比重的算法与横向一致。


二、图片自适应

在编写界面时,难免用到图片,使图片适应不同分辨率的手机。如果是色块的话,最好使用在代码中颜色值填充的方式,如不是色块比较好的方式就是采用.9的图片,如无法制作成.9的图片,可以采用在res建立多个文件夹,在不同的文件夹存放不懂分辨率的图片来达到自适应。

drawable:存放对分辨率要求不高的图片和xml配置文件

drawable-ldpi:存放低分辨率图片 0.75

drawable-mdpi:存放中等分辨率图片(适应于主流分辨率手机的图片存放位置) 1

drawable-hdpi:存放较高分辨率图片 1.5

drawable-xhdpi:存放高分辨率图片 2

drawable-xxhdpi:存放超高分辨率图片 3

那么如何制作一组图片,然后存放在不同文件夹,使其自适应不同分辨率的手机呢?

首先可先确定出适应于主流分辨率手机的图片,如图片分辨率是1的话,要对应作出0.75、1、1.5、2、3这5中不同分辨率的图片,分别放在以上文件夹。为了防止图片失真,一般先做超高分辨率的图片,然后再依次缩小。如,现需要一张像素为100*100图片可适应于主流分辨率手机,那么,应先做300*300的图片存放在drawable-xxhdpi文件夹,然后将其分别缩为200*200的存放在drawable-xhdpi文件夹,缩为150*150存放在drawable-hdpi文件夹,缩为100*100存放drawable-mdpi文件夹,以及缩为75*75的存放在drawable-ldpi。

特别说明:同一组图片的文件名称需一致。


三、尺寸自适应

文章最前面有提到有些必须使用绝对长度时,需将其定义在dimens资源文件中再引用,而非直接写在layout中,这是由于我们可以使用多个文件夹来存放dimens.xml,在不同文件夹下的dimens文件中定义不同的值,可达到自适应的效果。

value:存放默认值,如果没有找到对应尺寸的value文件,则会适应此value的值。如找不到对应尺寸的value文件,在value中又没有定义,那么程序在运行时会出错。

value-sw320dp:存放手机最短边尺寸为320dp的对应的值。如屏幕配置为240*320 的ldpi、320*480的mdpi和480*800的hdpi设备。

value-sw480dp:存放手机最短边尺寸为480dp的对应值。

value-sw600dp:存放手机最短边尺寸为600dp的对应值。

value-sw720dp:存放手机最短边尺寸为720dp的对应值。

value-sw1080dp:存放手机最短边尺寸为1080dp的对应值。

看到这里,也许大家已经明白,为什么我们在设置尺寸是要使用dp/dip/sp。和文件夹的名称一样,如在value-sw320dp文件夹中定义的dimen 值为320dp,那么在value-sw480dp文件夹中就该是480dp,其余文件夹以此类推。

细心的猿们会发现,文件夹value-sw320dp中的320不止与手机短边分辨率,还与其密度相关。如240*320 ldpi的时候之所以是value-sw320dp类型,是因为240/0.75=320;320*480 mdpi为320/1=320,;480*800 hdpi为480/1.5=320。

特别说明:同一组图片的文件名称需一致。


四、布局自适应

这种方式较少用,因为相当于需要写多套布局,正常情况下同时使用二和三已经能够满足。

其也是使用多个文件夹的方式来实现,

layout:存放一些通用布局xml文件,如界面顶部和底部的布局,不会随着屏幕大小变化的布局。

layout-small:屏幕尺寸小于3英寸左右的布局

layout-normal:屏幕尺寸小于4.5英寸左右的布局

layout-large:屏幕尺寸4到7英寸之间布局

layout-xlarge:屏幕尺寸7-10英寸之间布局

layout-xxlarge:屏幕尺寸10英寸以上布局


参考:

长度单位dp介绍:http://baike.baidu.com/link?url=4EcoFjiJF_1M0-l8lpIT7urLlytj64ZYSg7gHVHKFuT80k_UiEAXQxfNL6GOtYswdFETRgWowxu3UqctZsOhIq

不同手机屏幕分辨率自适应:http://blog.csdn.net/xsl1990/article/details/16931709

dpi和分辨率的关系:http://blog.csdn.net/ueryueryuery/article/details/20048401

不同分辨率自适应总结:http://www.cnblogs.com/tianjian/archive/2011/11/25/2262866.html

资源文件名称修饰语介绍:http://zhidao.baidu.com/link?url=oXlqoyxRCDBw32Ozw_M6hb71ImfsiiSECN_recW7VCQ3SYbomt6DPH-UsbhGj1rKTh9H2O3Nyt9JjGHfXD9pwbq7I-Jo2Ha5X8aaadQhZGa

0 0