千家信息网

Android布局中的长度单位是什么

发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,这篇文章主要介绍了Android布局中的长度单位是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android布局中的长度单位是什么文章都会有所收获,下面我们一起来看
千家信息网最后更新 2025年02月23日Android布局中的长度单位是什么

这篇文章主要介绍了Android布局中的长度单位是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇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:ldpidensityDpi=160:mdpidensityDpi=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; }

关于"Android布局中的长度单位是什么"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"Android布局中的长度单位是什么"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

单位 长度 属性 不同 代码 分辨率 屏幕 系统 换算 布局 像素 设备 取决于 实际 效果 文件 知识 问题 测试 之间 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 安徽联新网络技术 服务器带宽bgp哪里办理 宝鸡网络技术调试 博兴crm软件开发服务 绿盟网络安全证书考试流程 没读大学如何学软件开发 武汉鑫坤网络技术有限公司 道法老师讲网络安全 公安网络安全人才培养的目的 t640服务器降低风扇转速 大学生网络安全宣传月主题 卫生院网络安全工作组织领导情况 暗黑2 与游戏服务器交换数据时 如皋小学网站网络安全处罚 软件开发大棒模式什么意思 网络安全对软件工程的认识 软件开发都找35岁以下的 abs网络安全计划 软件开发大学毕业要去培训吗 恐怖黎明数据库调中文 电脑服务器管理配置工具 海康服务器管理地址是多少 赣州互助软件开发 网络技术服务费账务 网络安全普法工作开展情况 手机数据库的照片在哪里 腾讯云轻量应用服务器怎么联网 无线网络技术谁发明的 南京等级保护网络安全方案 长春软件开发招聘信息
0