Android多分辨率适配总结
2015-02-03 13:57
381 查看
1、屏幕大小
屏幕的实际大小,用屏幕对角线长度来衡量,单位为英寸,1英寸≈2.54CM,这里一定要注意,单位是英寸,而不是寸
案例:
![](http://img.blog.csdn.net/20150127192854781?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb3FxVGltMTI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
2、屏幕密度DPI
DPI:1英寸长度中,像素点的数量
假设一寸距离:
![](http://img.blog.csdn.net/20150127195833109?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb3FxVGltMTI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
xxxhdpi -640dpi:
![](http://img.blog.csdn.net/20150127195805783?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb3FxVGltMTI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
表示将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下的资源文件,对应关系如下:
![](http://img.blog.csdn.net/20150130154718212?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb3FxVGltMTI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
那么问题来了,同一张图片放在不同的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>
程序运行截图:
![](http://img.blog.csdn.net/20150130183720923?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb3FxVGltMTI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
同一张图片,在不同目录下大小是不同的,那么我们在使用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,看上面的结论。
屏幕的实际大小,用屏幕对角线长度来衡量,单位为英寸,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相关文章推荐
- Android多分辨率适配总结
- Android 完美适配多分辨率总结
- Android 完美适配多分辨率总结
- android解决多分辨率适配总结
- 关于Android引导画面的多分辨率适配
- Android适配多分辨率注意事项
- android 分辨率适配总结
- Android与iOS多分辨率适配
- 关于Android引导画面的多分辨率适配
- android屏幕分辨率适配总结
- cocos2d-x android多分辨率适配
- android屏幕自适配多分辨率
- Android屏幕适配总结
- 【移动开发】Android中强大的适配功能----Fragment(碎片)总结 推荐
- 播放器适配经验总结――Android
- android知识点总结 包括数据库的使用 listview适配 contextmenu的使用 和 contentprovider使用
- Android-屏幕适配需要注意的地方总结
- 关于Android引导画面的多分辨率适配
- Android屏幕适配总结
- Android屏幕适配总结