屏幕尺寸及资源文件的学习总结
一:常识性概念
Android上常见度量单位:
px (pixels)像素 -- 是像素,就是屏幕上实际的像素点单位。Eg. furtuna: 960*540
dip或dp (device independent pixels) 一种基于屏幕密度的抽象单位,与密度无关的像素,设备独立像素,在每英寸160点的显示器上,1dp = 1px。 与设备屏幕有关。
sp (scaled pixels — best for text size)放大像素-- 主要处理字体的大小。
dpi:屏幕像素密度。
in(英寸):长度单位,如我们常说的手机屏幕时4.5寸的。
pt(磅):1/72英寸,point。
分辨率 :屏幕上拥有的像素的总数。注意,虽然大部分情况下分辨率都被表示为“宽度×长度”,但分辨率并不意味着屏幕长宽比。在 Android系统中,程序一般并不直接处理分辨率。
密度 :以屏幕分辨率为基础,沿屏幕长宽方向排列的像素。 密度较低的屏幕,在长和宽方向都只有比较少的像素,而高密度的屏幕通常则会有很多 ——甚至会非常非常多——像素排列在同一区域。屏幕的密度是非常重要的,举个例子,长宽以像素为单位定义的界面元素(比如一个按钮),在低密度的屏幕上会 显得很大,但在高密度的屏幕上则会显得很小。
密度无关的像素( dip,dp ):指一个抽象意义上的像素,程序用它来定义界面元素。它作为一个与实际密度无关的单位,帮助程序员构建一个布局方案(界面元素的宽度,高度,位置)。
一个与密度无关的像素,在逻辑尺寸上,与一个位于像素密度为 160DPI的屏幕上的像素是一致的,这也是Android平台所假定的默认显示设备。在运行的时候,平台会以目标屏幕的密度作为基准,“透明地”处理所 有需要的DIP缩放操作。要把密度无关像素转换为屏幕像素,可以用这样一个简单的公式: pixels = dips * (density / 160)。举个例子,在 DPI为 240的屏幕上, 1个 DIP等于 1.5个物理像素。强烈推荐用 DIP来定义你程序的界面布局,因为这样可以保证你的 UI在各种分辨率的屏幕上都可以正常显示。
小工具:ScreenTest1.apk
应用: FORTUNALTE 1718 布局文件 与1716,1715布局文件差异较大,只能自己手动修改。
使用画图工具,查明 相差12pixels 根据公式
pixels = dips * (density / 160)。
12 = 8 * ( 240 / 160)
android:layout_marginTop="7dp"
android:layout_marginTop="-1dp"
修改OK
二:常见分辨率及与DPI关系:
需要补充一点的是:
2K手机分辩率较常见的是:2560*1440
三星note10.1 分辩率为:2560*1600
手机中QHD分辨率为:960*540
1.2 分辨率对应DPI
" QVGA ldpi 120"
"HVGA mdpi 160"
"WVGA hdpi 240"
"FWVGA hdpi 240"
"QHD hdpi 240"
"720P xhdpi 320"
"1080P xxhdpi 480"
一般情况下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。xxhdi是480
drawable- hdpi、drawable- mdpi、drawable-ldpi的区别:
(1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)
(2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480)
(3)drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320)
(4)drawable-xhdpi,720p的屏幕
()drawable-xxhdpi,1080p的屏幕
分辨率及像素密度dpi获得的代码:
DisplayMetrics dm =getResources().getDisplayMetrics();
int w_screen = dm.widthPixels;
int h_screen = dm.heightPixels;
Log.i("Chunlei",
"像素宽:" + dm.widthPixels +
"像素高:" + dm.heightPixels +
"密度 = " + dm.densityDpi
);
系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。
各个组件常用的图片等资源的像素:
如何区分屏幕的大小:
三:找自己型号的dpi://JPB_MAIN/Maple/JBP98x/model/device/wilcox3g_common/device_common.mk是什么dpi
中CUSTOM_LOCALES := hdpi
PRODUCT_AAPT_CONFIG := normal hdpi
PRODUCT_AAPT_PREF_CONFIG := hdpi
//JPB_MAIN/Maple/JBP98x/model/device/wilcox3g_common/BoardConfigCommon.mk走哪个数字的dpi
SEC_DEV_APP_LOCAL_AAPT_FLAGS := -c sw360dp
SEC_DEV_APP_FRAMEWORK_LOCAL_AAPT_FLAGS := -c sw360dp
最确切的可以安装DisplayInfo.apk等小apk查看详情,多试几次,可能不准。
四: 屏幕适配的注意事项
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文件中设置控件尺寸时应采用wrap_content、match_parent和dp;
具体来说,设置view的属性android:layout_width和android:layout_height的值时,wrap_content,match_parent或dp比px更好,文字大小应该使用sp来定义。
例外:三星手机能调节字体,调节到最大时,就有可能有问题:
android:textSize="14dp"
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进行使用。
关于Android的nodpi,xhdpi,hdpi,mdpi,ldpi 首先是几个基本概念:
1.屏幕尺寸Screen size
即显示屏幕的实际大小,按照屏幕的对角线进行测量。
四种屏幕尺寸分类:: small, normal, large, and xlarge
四种密度分类: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high)
一般情况下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。xxhdi是480
左边:23pixels,右边:29 pixels
android:layout_width="wrap_content"
android:layout_margin="@dimen/con_btn_turn_off_margin"
用dimen固定 边距,长度等,比较麻烦,需要N个布局
android:layout_width="match_parent"
android:layout_weight="1" --- 各个组件权重为1
只需一个通用的布局
间隙就相等了