Android多分辨率适配总结
来源:互联网 发布:kinyo lolita淘宝店铺 编辑:程序博客网 时间:2024/06/04 18:52
1、屏幕大小
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 装换公式
- /**
- * 根据手机的分辨率从 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-像素点。
举例:
- <Button
- android:id="@+id/test1"
- android:text="拉取升级信息"
- android:layout_width="100dp"
- android:layout_height="100dp"/>
7、各种drawable的差别
首先,常用drawable有ldpi 、mdpi 、hdpi 等等,在不同DPI的手机会优先使用对应drawable下的资源文件,对应关系如下:
那么问题来了,同一张图片放在不同的drawable下面,究竟会有什么不同?做个实验,将一张46*43的PNG图片放在不同的drawable下面,展示出来看看有什么不同,布局文件如下:
- <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等等目录,符合什么条件才会使用不同目录下的布局文件,整理如下:
high x width:例如layout-hdpi-800x480表示
当屏幕满足dpi=hdip、分辨率800x480条件时候,使用指定目录下的布局文件
layout-800x480表示:分辨率800x480,不考虑dpilayout-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的差别
- Android多分辨率适配总结
- Android多分辨率适配总结
- android分辨率适配总结
- Android分辨率常识&多分辨率适配
- 总结Android多分辨率支持
- Android 多分辨率自适应总结
- Android 多分辨率自适应总结
- Android 多分辨率自适应总结
- Android 多分辨率自适应总结
- android多分辨率适配
- android多分辨率适配
- android多分辨率适配
- android多分辨率适配
- Android 多分辨率适配
- android多分辨率适配
- android多分辨率适配
- android多分辨率适配
- android多分辨率适配
- eclipse 更换jdk版本后,工程出现红色感叹号 解决办法
- win7删除多余开机启动菜单的方法(图文)
- 横竖折对称方正
- 项目管理包括哪些过程?
- easyUI分页
- Android多分辨率适配总结
- Linux内核学习之系统调用
- 区间dp
- Oracle-Function&Procedure&Package
- 21世纪网:利用meta实现定时刷新,清除缓存保证每次加载最新数据等功能
- 外部系统集成BIEE 11g页面同时去掉顶部工具栏和仪表盘菜单
- seajs加载模板引擎实现前端模板化开发
- 利用哈达玛变换对真彩色图像进行压缩
- linux下I2C编程的一些琐碎