屏幕分辨率、屏幕尺寸以及屏幕适配和图片分辨率
来源:互联网 发布:ipad4软件更新打不开 编辑:程序博客网 时间:2024/05/02 00:13
1、术语和概念
1.1屏幕尺寸
屏幕的物理尺寸,以屏幕的对角线长度作为依据(比如2.8寸,3.5寸)。简而言之,Android把所有的屏幕尺寸简化为三大类:大,正常,和小。
程序可以针对这三种尺寸的屏幕提供三种不同的布局方案,然后系统会负责把你的布局方案以合适的方式渲染到对应的屏幕上,这个过程是不需要程序员用代码来干预的。
1.2、屏幕长宽比
屏幕的物理长度与物理宽度的比例。程序可以为制定长宽比的屏幕提供制定的素材,只需要用系统提供的资源分类符long和notlong。1.3分辨率
屏幕上拥有的像素的总数。注意,虽然大部分情况下分辨率都被表示为“宽度×长度”,但分辨率并不意味着屏幕长宽比。在Android系统中,程序一般并不直接处理分辨率。1.4密度
1.5密度无关的像素(DIP)
1.6dip, dp, px, sp区别
dip: device independent pixels(设备独立像素). dp:同dip
字号最好使用 sp 做单位,而且查看TextView的源码可知 Android 默认使用 sp 作为字号单位
1.7分辨率和对应的资源文件
2、屏幕
小屏幕
·QVGA(240×320),2.6~3.0寸
普通屏幕
·WQVGA(240×400),3.2~3.5寸
·FWQVGA(240×432),3.5~3.8寸
·HVGA(320×480),3.0~3.5寸
·WVGA(480×800),3.3~4.0寸
·FWVGA(480×854),3.5~4.0寸
大屏幕
·WVGA(480×800),4.8~5.5寸
·FWVGA(480×854),5.0~5.8寸
分辨率:整个屏是多少点,比如800x480,它是对于软件来说的显示单位,以px为单位的点。 density(密度)值表示每英寸有多少个显示点,与分辨率是两个概念。apk的资源包中,
2 屏幕适配的注意事项
2.1 基本设置
2.1.1 AndroidManifest.xml设置
在中Menifest中添加子元素
android:anyDensity="true"时,应用程序安装在不同密度的终端上时,程序会分别加载xxhdpi、xhdpi、hdpi、mdpi、ldpi文件夹中的资源。
相反,如果设为false,即使在文件夹下拥有相同资源,应用不会自动地去相应文件夹下寻找资源:
1) 如果drawable-hdpi、drawable-mdpi、drawable-ldpi三个文件夹中有同一张图片资源的不同密度表示,那么系统会去加载drawable_mdpi文件夹中的资源;
2) 如果drawable-hpdi中有高密度图片,其它两个文件夹中没有对应图片资源,那么系统会去加载drawable-hdpi中的资源,其他同理;
3) 如果drawable-hdpi,drawable-mdpi中有图片资源,drawable-ldpi中没有,系统会加载drawable-mdpi中的资源,其他同理,使用最接近的密度级别。
2.1.2 横屏竖屏目录区分
1) drawable
a) drawable-hdpi该图片即适用于横屏,也适用于竖屏;
b) drawable-land-hdpi,当屏幕为横屏,且为高密度时,加载此文件夹的资源;
c) drawable-port-hdpi,当屏幕为竖屏,且为高密度时,加载此文件夹中的资源。其他同理。
2) layout
在res目录下建立layout-port和layout-land两个目录,里面分别放置竖屏和横屏两种布局文件,以适应对横屏竖屏自动切换。
2.2 多屏幕适配的4条黄金原则
1) 在layout文件中设置控件尺寸时应采用fill_parent、wrap_content、match_parent和dp;
具体来说,设置view的属性android:layout_width和android:layout_height的值时,wrap_content,match_parent或dp比px更好,文字大小应该使用sp来定义。
2) 在程序的代码中不要出现具体的像素值,在dimens.xml中定义;
为了使代码简单,android内部使用pix为单位表示控件的尺寸,但这是基于当前屏幕基础上的。为了适应多种屏幕,android建议开发者不要使用具体的像素来表示控件尺寸。
3) 不使用AbsoluteLayout(android1.5已废弃) ,可以使用RelativeLayout替代;
4) 对不同的屏幕提供合适大小的图片。
不同大小屏幕用不同大小的图片,low:medium:high:extra-high图片大小的比例为3:4:6:8;举例来说,对于中等密度(medium)的屏幕你的图片像素大小为48×48,那么低密度(low)屏幕的图片大小应为36×36,高(high)的为72×72,extra-high为96×96。
2.3 使用9-patch PNG图片
使用图片资源时,如果出现拉伸,因为图片处理的原因,会变形,导致界面走形。9-patch PNG图片也是一种标准的PGN图片,在原生PNG图片四周空出一个像素间隔,用来标识PNG图片中哪些部分可以拉伸、哪些不可以拉伸、背景上的边框位置等。
“上、左”定义可拉伸区域
“右、下”定义显示区域,如果用到完整填充的背景图,建议不要通过android:padding来设置边距,而是通过9-patch方式来定义。
Android SDK中提供了编辑9-Patch图片的工具,在tools目录下draw9patch.bat,能够立刻看到编辑后的拉伸效果,也可以直接用其他图片编辑工具编辑,但是看不到效果。
2.4 不同的layout
Android手机屏幕大小不一,有480x320, 640x360, 800x480……
怎样才能让Application自动适应不同的屏幕呢?
其实很简单,只需要在res目录下创建不同的layout文件夹,比如:layout-640x360、layout-800x480……所有的layout文件在编译之后都会写入R.java里,而系统会根据屏幕的大小自己选择合适的layout进行使用。
2.5 测试验证
一般使用AVD Manager创建多个不同大小的模拟器,如果条件具备,也可以直接用真机测试,这个比较靠谱。
3、android开发图片分辨率
手机屏幕分辨率和屏幕密度是两码事!并不是800*480的分辨率手机图片就应该放在hdpi文件夹中。5.0英寸 800*480属于mdpi
也可以通过代码获取:
- DisplayMetrics metric = new DisplayMetrics();
- getWindowManager().getDefaultDisplay().getMetrics(metric);
- int width = metric.widthPixels; // 屏幕宽度(像素)
- int height = metric.heightPixels; // 屏幕高度(像素)
- float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)
- int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240)
android会根据屏幕本身的尺寸与密度特性,自动载入对应的资源,并把它们从逻辑像素(DIP,用于定义界面布局)转换成屏幕上的物理像素。
首先看看 系统是如何通过Resources的getDrawable(int id)方法找图片的
- public Drawable getDrawable(int id) throws NotFoundException {
- TypedValue value;
- synchronized (mAccessLock) {
- value = mTmpValue;
- if (value == null) {
- value = new TypedValue();
- } else {
- mTmpValue = null;
- }
- getValue(id, value, true);
- }
- Drawable res = loadDrawable(value, id);
- synchronized (mAccessLock) {
- if (mTmpValue == null) {
- mTmpValue = value;
- }
- }
- return res;
- }
- public void getValue(int id, TypedValue outValue, boolean resolveRefs)
- throws NotFoundException {
- boolean found = mAssets.getResourceValue(id, 0, outValue, resolveRefs);
- if (found) {
- return;
- }
- throw new NotFoundException("Resource ID #0x"
- + Integer.toHexString(id));
- }
最后通过loadDrawable(value, id)得到drawable,该方法到了底层的C代码,大致意思就是通过TypedValue中的方法和属性就可以获得我们想要的属性值,然后加载图片
OK,下面来做个实验.
试验一: 手机是1280*720 4.3英寸 属于xdpi 图片分辨率为960*640 (按正常图片不缩放 图片放在手机里面 应该不会充满 整个手机) 我把图片放在不
文件夹 加载时间(ms) 图片显示 说明
drawable 311 充满屏幕 图片有拉伸
drawable-nodpi 130 未充满屏幕 图片显示正常
drawable-ldpi 442 充满屏幕 图片有拉伸
drawable-mdpi 383 充满屏幕 图片有拉伸
drawable-hdpi 226 充满屏幕 图片有拉伸
drawable-xhdpi 109 未充满屏幕 图片显示正常
试验二: 手机是800*480 4.3英寸 属于hdpi 图片分辨率为960*640 (按正常图片不缩放 图片放在手机里面 应该充满 整个手机) 我把图片放在不同drawable文件夹中
文件夹 加载时间(ms) 图片显示 说明
drawable 290 充满屏幕 图片拉伸
drawable-nodpi 127 充满屏幕 图片显示正常
drawable-ldpi 369 充满屏幕 图片拉伸
drawable-mdpi 346 充满屏幕 图片拉伸
drawable-hdpi 124 充满屏幕 图片显示正常
drawable-xhdpi 241 未充满屏幕 图片缩放
得到结论:
drawable-nodpi 中 图片不会被拉伸
系统在得到图片时候,会先到设备对应的dpi的文件夹下去去找资源文件,找到后应该不会做缩放直接返回图片。
如果没有在对应的dpi文件夹中找到,回去其他文件夹中查找,找到后会做相应的缩放。
在高dpi找到的图片会缩放,在低dpi的会拉伸
还有就是 源码中可以看出 loadDrawable的过程实在C层做的。通过系统资源id加载会比java层直接加载图片更便捷。
- 屏幕分辨率、屏幕尺寸以及屏幕适配和图片分辨率
- 分辨率和屏幕尺寸
- [整理]Android屏幕适配(不同的屏幕分辨率和尺寸)
- Android屏幕适配(不同的屏幕分辨率和尺寸)
- [整理]Android屏幕适配(不同的屏幕分辨率和尺寸)
- Android屏幕适配(不同的屏幕分辨率和尺寸)
- android应用如进行屏幕尺寸和分辨率适配
- Android 屏幕尺寸和分辨率的适配
- iOS 屏幕尺寸和分辨率
- iPhone屏幕尺寸和分辨率
- iPhone屏幕尺寸、分辨率及适配
- iPhone屏幕尺寸、分辨率及适配
- iPhone屏幕尺寸、分辨率及适配
- iPhone屏幕尺寸、分辨率及适配
- iPhone屏幕尺寸、分辨率及适配
- iPhone屏幕尺寸、分辨率及适配
- iPhone屏幕尺寸、分辨率及适配
- iPhone屏幕尺寸、分辨率及适配
- 测试备库应用主库日志时有无using current logfile选项的区别
- SVN服务器客户端以及环境的搭建和使用
- 微软数据结构+算法面试100题
- erlang lists操作
- 【蓝桥杯练习系统】 基础练习 查找整数
- 屏幕分辨率、屏幕尺寸以及屏幕适配和图片分辨率
- iOS开发学习笔记 (一)表视图基础 Table Views
- Android复习之GridView
- 获取农历方法
- 周一的感觉就像失恋一样 周二的感觉就像找不到对象一样
- android中正确导入第三方jar包
- JQuery插件第四十一:表单输入框获取指定小数位并且四舍五入
- 判断日期是今天,昨天还是明天
- 总有一段时间我们会期待被放逐放逐到无尽的开阔