要想使自己的布局在不同设备达到精准空置,理清理顺android布局长度单位之间关系很有必要,否则你也许会经常挠头为什么显示出来的布局不是自己定义的效果呢,有些东西,虽然基础,但是弄个透彻也需要花些功夫,废话不多说,下面开始。
1.先了解一下android有支持哪些长度单位:
px: pixels(像素). 不同设备显示效果相同,比如我们800*480的屏幕宽度就是 800px
dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,通常屏幕大时,density就大,屏幕小时,density就小
屏幕实际分辨率为240px*400px时,densityDpi=120
屏幕实际分辨率为320px*533px,densityDpi=160
屏幕实际分辨率为480px*800px,densityDpi=240
而dip与px之间的换算关系是:
pixs =dips * (densityDpi/160),也就是说当densityDpi=160时,1dip=1px
sp: scaled pixels(放大像素),sp的大小取决于系统metrics.scaledDensity值大小
pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业(基本用不到)
pt与px的换算关系:pixs = pt*xdpi * (1.0f/72);xdpi表示1英寸像素个数
in(英寸)长度单位(基本用不到)
in与px的换算关系:pixs = in*xdpi
mm(毫米)长度单位(基本用不到)
mm与px的换算关系:pixs = mm * xdpi * (1.0f/25.4f)
2.看了上面具体长度单位的含义你会产生一个疑问,不同单位换算取决于系统的一些属性,比如densityDpi的值,xdpi的值,那么系统这些值在哪里获取了,直接看我写的测试用例:
public void testgetdisplay(){
WindowManager wm = (WindowManager) this.getInstrumentation().getContext().getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics mDisplayMetrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(mDisplayMetrics);
System.out.println("display.height="+wm.getDefaultDisplay().getHeight());
System.out.println("display.width="+wm.getDefaultDisplay().getWidth());
System.out.println("densityDpi="+mDisplayMetrics.densityDpi);
System.out.println("xdpi="+mDisplayMetrics.xdpi);
System.out.println("density="+mDisplayMetrics.density);
}
3.densityDpi与drawable-(hdpi,mdpi,ldpi)之间的关系
系统drawable有hdpi,mdpi,ldpi三个文件夹下面存放不同尺寸的图片,使用哪个文件下的文件,与系统densityDpi值是有关系的
densityDpi=120:ldpi
densityDpi=160:mdpi
densityDpi=240:hdpi
前面我又说过densityDpi取决于显示屏,这样你就了解了为什么不同显示屏WVGA,HVGA,QVGA会采用不同drawable-(hdpi,mdpi,ldpi)图片
分辨率为240px*400px,densityDpi=120-->QVGA:ldpi
分辨率为320px*533px,densityDpi=160 -->HVGA:mdpi
分辨率为480px*800px,densityDpi=240 -->WVGA:WVGA
4.尽管了解上面这些理论值,但是有时候发现设置了不同长度单位,可显示出来的效果却出人预想,我曾经就碰到过这种挠头的问题,为解决这个问题,只有
深入代码,一探究竟了。
在深入代码前我们首先要搞清楚一个问题,那就是代码中所有长度值的单位都是px,
手上没有现成的例子就以现在我研究的/Launcher2/res/layout-land/workspace_screen.xml为例,看一个自定义属性:
launcher:cellWidth="105pt"
该属性自定义了一个桌面快捷图标的宽度,若读者自己测试,自己写个测试view,设置属性
android:layout_width="800px"
是一样的。
当view 被创建的时候,xml中的属性值存在参数AttributeSet attrs中
public CellLayout(Context context, AttributeSet attrs, int defStyle)
继续看该构造函数的实现代码
public CellLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
//获取自定义属性组CellLayout中的所有自定义属性,关于自定义属性,这里不作展开说明
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CellLayout, defStyle, 0);
//获取属性cellWidth的值,长度单位将转换为px
mCellWidth = a.getDimensionPixelSize(R.styleable.CellLayout_cellWidth, 10);
。。。
}
实现长度单位换算的关键代码就在a.getDimensionPixelSize(R.styleable.CellLayout_cellWidth, 10),直接深入到关键代码:
public int getDimensionPixelSize(int index, int defValue)
public static int complexToDimensionPixelSize(int data,DisplayMetrics metrics)
public static float applyDimension(int unit, float value,DisplayMetrics metrics){
switch (unit) {
case COMPLEX_UNIT_PX:
return value;
case COMPLEX_UNIT_DIP:
return value * metrics.density;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
}
return 0;
}
unit就是指单位类型,这个怎么来的我没有,但我想它肯定是在解析xml是根据不同单位转换的。
内容就这些,希望对你有用,欢迎拍砖!
分享到:
相关推荐
android 布局 android 布局android 布局android 布局
android 布局生成图片,封装工具类 ,简单实用,viewgroup生成图片分享微信,快速转化
android之Junit 深入研究的工程代码,为我们更好的理解如何来使用androidTestCase进行单元测试开发提供了方便。
常用的几种安卓布局历程,eclipse平台,可以直接导入
设计Android应用程序的界面经常用到xml格式的布局文件。一个布局文件的作用是描述了: - 界面包含哪些控件(也叫组件或视图;示例有按钮,下拉框); - 控件之间的位置关系; - 如何显示界面的整体外观和各个...
Android布局显示模板加载,空,错误等状态
android 布局的详细分析 android 布局的详细分析 android 布局的详细分析
LinearLayout 线性布局 控制组件 横向 或者 纵向 排列 RelativeLayout 相对布局 子组件的位置总是相对兄弟组件,父容器来决定的 FrameLayout 帧布局、框架布局 创建一个空白区域, 一个区域成为一帧 TableLayout 表格...
android不同的布局资源介绍,包括LinearLayout、RelativeLayout等
Android布局高级.doc
Android 相对布局实例 ,RalateLayout
android 布局别名的应用
安卓布局讲解。各个控件的讲解,及其属性。代码展示。 1 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="fill_parent" 5...
Android xml布局文件工具
android布局属性详解.全面讲解各种技术。值得学习。
对初次学习Android布局的人有很大的帮助更好的了解属性
android布局属性,在平时开发中不断总结的,很值得参考
android最全的布局属性总结,各种Layout如linearlayout ,relativeLayout,frameLayout,各种widget属性说明
Android的计量单位px,in,mm,pt,dp,dip,sp Android的计量单位px,in,mm,pt,dp,dip,sp
Android布局控件之RelativeLayout详解