适配

  1. 尺寸的基本概念

①    像素

    单位:px

    px = dp*(dpi/160)

②    屏幕密度

    单位:dpi

    指一定区域内的像素数,Android中以160dpi为基本线   

③    密度独立像素

    单位:dp

    1dp = 屏幕密度为160dpi的一个像素的宽度,1dp的宽度不受屏幕密度的影响。


2.  屏幕密度分类

ldpi:~120dpi

mdpi:~160dpi

hdpi:~240dpi

xhdpi:~320dpi

xxhdpi:~480dpi

xxxhdpi:~640dpi


3. 运行时获取屏幕信息

1
2
3
4
5
6
7
8
WindowManager wm = (WindowManager) context .getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics =  new  DisplayMetrics();
wm.getDefaultDisplay().getMetrics(outMetrics);
//获取屏幕横/竖方向像素值
outMetrics.widthPixels
outMetrics.heightPixels
//获取像素密度
outMetrics.densityDpi


4.屏幕适配技巧

Google建议控件定义宽高时尽可能使用fill_parent、wrap_content(需要为不同dpi的机子提供不同的资源),如果要指定宽高,则使用dp为单位,而不是使用px为单位,这样使相同的layout在不同的机子上有相同的大小。

其实,我们可以在工程文件中为不同的机子定义不同的屏幕尺寸。

当我们在xx_layout.xml文件中定义layout/view时不要指定为固定值,尽量使用@dimens/...

如:

1
2
3
4
5
6
7
< ImageView
                android:layout_width = "@dimen/info_image_width"
                android:layout_height = "@dimen/info_image_height"
               android:id = "@+id/info_imageView"
               android:background = "@drawable/info_about_eye"
               android:contentDescription = "@null"
/>

这里指定宽/高值为

1
2
android:layout_width="@dimen/info_image_width"
android:layout_height="@dimen/info_image_height"

我们只需为不同尺寸的屏幕建立多个dimens,并在dimens中定义不同的尺寸即可,如

res/values                         (默认值)

res/values-sw480dp        (最小屏幕尺寸大于480dp)

res/values-sw600dp        (最小屏幕尺寸大于600dp)

...


res/values/dimens.xml

1
2
< dimen  name = "info_image_width" >320dp</ dimen >
< dimen  name = "info_image_height" >320dp</ dimen >

res/values-sw600dp/dimens.xml

1
2
< dimen  name = "info_image_width" >540dp</ dimen >
< dimen  name = "info_image_height" >540dp</ dimen >

这样不同尺寸的机子在运行时,就会根据当前的屏幕环境为view/layout分配不同的尺寸

PS:values-sw600dp 表示最小屏幕尺寸大于600dp(smallest width 600dp),也可理解为宽度大于600dp


你可能感兴趣的:(适配)