您的位置:首页 > 移动开发 > Android开发

Android多分辨率适配总结

2015-02-03 13:57 381 查看
1、屏幕大小
屏幕的实际大小,用屏幕对角线长度来衡量,单位为英寸,1英寸≈2.54CM,这里一定要注意,单位是英寸,而不是寸
案例:



2、屏幕密度DPI

DPI:1英寸长度中,像素点的数量

假设一寸距离:



xxxhdpi -640dpi:



表示将1寸距离,平分为640个段,那么每段的长度约等于

3.33/640≈0.005cm

常用的dpi有:

ldpi (low) ~120dpi

mdpi (medium) ~160dpi

hdpi (high) ~240dpi

xhdpi (extra-high) ~320dpi

xxhdpi (extra-extra-high) ~480dpi

xxxhdpi (extra-extra-extra-high) ~640dpi

3、像素px

这里需要注意,px是一个相对单位,跟屏幕dpi有关,假如屏幕dpi=160,那么

1px = 1 英寸 / 160 ≈ 0.015cm

同理,dpi=320,那么

1px = 1英寸/320 =0.0079cm

1px = 1 英寸/DPI 相对单位

4、设备独立像素DIP(简称DP)

不同设备有不同的显示效果,这个和设备硬件有关。比较抽象,经过多轮验证,发现在目前google定义里面,dp成了绝对长度:

1dp=1英寸/160 =0.015cm 绝对单位

因此,google推荐使用dp,因为不管是什么样密度的手机,在手机上展示的长度都是相同的;

5、屏幕分辨率

显示分辨率就是屏幕上显示的设备独立像素个数。假设我们说手机分辨率800*400,那么也就是说,手机高度有800个像素点,手机宽度有400个像素点。

综上举例:

华为U9508,分辨率1280*720,屏幕4.5英寸,屏幕密度DPI为320。根据这些公开数据,可以得出:

屏幕4.5英寸 : 屏幕对角线长度 2.54*4.5=11.43 cm

屏幕密度DPI为320 : 每英寸有320个像素点,1px = 2.54 /320 = 0.0079cm

分辨率1280*720 :

屏幕宽度 720px = 720*0.0079=5.688cm

屏幕高度 1280px = 1280*0.0079 = 10.112cm

1dp=0.015cm 绝对单位

经过测量,以上数据属实。据以上原理,得出广为流程dp <--> px 装换公式

[java] view
plaincopy

/**

* 根据手机的分辨率从 dp 的单位 转成为 px(像素)

*/

public static int dip2px(Context context, float dpValue)

{

final float scale = context.getResources().getDisplayMetrics().density;

return (int) (dpValue * scale + 0.5f);//最后的0.5f只是为了四舍五入

}

/**

* 根据手机的分辨率从 px(像素) 的单位 转成为 dp

*/

public static int px2dip(Context context, float pxValue)

{

final float scale = context.getResources().getDisplayMetrics().density;

return (int) (pxValue / scale + 0.5f);//最后的0.5f只是为了四舍五入

}

6、屏幕坐标

在开发中经常会设置屏幕坐标点,那么问题来了,屏幕坐标的单位是什么?px 还是 dp?

简单想一下,在获取屏幕高度和宽度时候,获取的结果都是屏幕分辨率,那么说明屏幕坐标的单位就是屏幕分辨率的单位,因此是px-像素点。

举例:

[java] view
plaincopy

<Button

android:id="@+id/test1"

android:text="拉取升级信息"

android:layout_width="100dp"

android:layout_height="100dp"/>

获取这个view的高度和宽度,在DPI为320时,获取到的值为200,说明屏幕坐标指的就是屏幕像素点。

7、各种drawable的差别

首先,常用drawable有ldpi 、mdpi 、hdpi 等等,在不同DPI的手机会优先使用对应drawable下的资源文件,对应关系如下:



那么问题来了,同一张图片放在不同的drawable下面,究竟会有什么不同?做个实验,将一张46*43的PNG图片放在不同的drawable下面,展示出来看看有什么不同,布局文件如下:

[html] view
plaincopy

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent">

<!-- test_ldpi -->

<ImageView

android:id="@+id/test_ldpi"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center"

android:src="@drawable/icon_drawable_ldpi"

android:background="@color/gray"

android:layout_marginTop="8dp"/>

<!-- test_drawable -->

<ImageView

android:id="@+id/icon_drawable"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center"

android:src="@drawable/icon_drawable"

android:background="@color/gray"

android:layout_below="@id/test_ldpi"

android:layout_marginTop="8dp"/>

<!-- test_mdpi -->

<ImageView

android:id="@+id/test_drawable_mdpi"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center"

android:src="@drawable/icon_drawable_mdpi"

android:background="@color/gray"

android:layout_below="@id/icon_drawable"

android:layout_marginTop="8dp"/>

<!-- test_hdpi -->

<ImageView

android:id="@+id/test_drawable_hdpi"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center"

android:src="@drawable/icon_drawable_hdpi"

android:background="@color/gray"

android:layout_below="@id/test_drawable_mdpi"

android:layout_marginTop="8dp"/>

</RelativeLayout>

程序运行截图:



同一张图片,在不同目录下大小是不同的,那么我们在使用wrap_content就要注意了,不要因为放错PNG文件而导致展示效果不理想。

经过验证,一个图片在不同drawable下面,展示长度遵循以下公式:

图片实际展示的宽(高)(单位dp)=图片分辨率宽(高) * 160 / 当前drawable下对应的dpi

测试图片的高度为46,手机dpi为320,带入计算,在不同drawable下展示高度为:

drawable-ldpi : 46*160/120 = 61 dp

drawable : 46*160/160 = 46 dp

drawable-mdpi : 46*160/320= 46 dp

drawable-hdpi : 46*160/320 = 23 dp

主要,单位是dp,实际展示的时候会根据上面的公式换算成px

根据google的建议,不同尺寸放不同分辨率图片:

36x36适合于低密度
48x48适合于中等密度
72x72适合于高密度
96x96适合于超高密度

最后注意一句:drawable-nodpi下的资源,根据资源的实际像素值展示,不进行任何换算,例如46*43图片,实际展示的时候就是46px*43px,至于是多少dp,看上面的结论。

8、各种layout的差别

需要判断注意的是,对于layout、layout-800x480、layout-v16等等目录,符合什么条件才会使用不同目录下的布局文件,整理如下:

目录名称使用场景
layout默认使用该目录下的布局
layout-land横屏情况下使用
layout-port竖屏情况下使用
layout-[dpi]-[high x width]dpi:ldpi、mdpi、hdpi等

high x width:例如layout-hdpi-800x480表示

当屏幕满足dpi=hdip、分辨率800x480条件时候,使用指定目录下的布局文件

layout-800x480表示:分辨率800x480,不考虑dpi
layout-v[api lever]例如:layout-v16表示只在api level=16(Android 4.1)

的手机上展示的布局文件。需要注意,有对应layout-[dpi]-[high x width]满足条件的,优先使用layout-[dpi]-[high x width]下的布局,没有才会使用layout-v[api lever]下的布局

9、各种values的差别

values目录就一句话,所有规则同layout
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: