首页
IT
登录
6mi
u
盘
搜
搜 索
IT
Android 系统当中各种尺寸单位的定义及使用
Android 系统当中各种尺寸单位的定义及使用
xiaoxiao
2025-05-04
39
一,Android 各种标尺单位的含义:
px:表示屏幕实际的象素。例如,320*480的屏幕在横向有320个象素,在纵向有480个象素。 pt:表示一个点,是屏幕的物理尺寸。大小为1英寸的1/72。 in:表示英寸,是屏幕的物理尺寸。每英寸等于2.54厘米。例如,形容手机屏幕大小,经常说,3.2(英)寸、3.5(英)寸、4(英)寸就是指这个单位。这些尺寸是屏幕的对角线长度。如果手机的屏幕是3.2英寸,表示手机的屏幕(可视区域)对角线长度是3.2*2.54 = 8.128厘米。读者可以去量一量自己的手机屏幕,看和实际的尺寸是否一致。 mm:表示毫米,是屏幕的物理尺寸。 常见的有 px(pixel) 与 pt(point) 两种。
二,Android 中dp与sp标尺单位的由来及计算方法:
由于Google对Android的开放政策,使得所有厂商都可以加入到智能手机的研发中来。于是乎,Android手机一时间百花齐放,出现了各种不同的手机样式。 240*320 320*240 320*480 480*800 480*854 640*960 720*1280,…… 屏幕物理尺寸3.2、3.5、3.75、4.0、4.3、5.0、7、9.3、10.1 为了更好的描述这种多样化引发的问题,我们需要引入一个新的概念density,也就是密度。它指的是在一定尺寸的物理屏幕上显示像素的数量,一般使用dpi(dots per inch,每英寸像素数)作为单位。比如一台分辨率为240x320,屏幕物理尺寸为1.5英寸x2英寸的手机,他的密度可以用分辨率/尺寸,240/1.5或者320/2,密度为160dpi。对于用户来说,密度越大的屏幕显示效果越精细,因为每英寸显示的像素数量更多。 如果是要使用px和pt给程序贴图,假设生成了一条240px的直线,在240*320的屏幕上刚好可以铺满,而放到480x800的分辨率下才刚刚到一半的位置。 如果要解决这样的问题,那么程序在实现的时候就必须为每个分辨率都写一个配置,否则就会出现图形在低密度的屏幕上显示的更大,而在高密度的屏幕上显示的更小。最麻烦的事情在于,一旦出现新的分辨率,所有程序都没办法直接运行了。这明显不符合手机快速发展的客观规律。 为了解决这个问题,Google为Android引入了一套新的单位dp和sp。 首先登场的是dp,Density Independent Pixel,可以翻译为密度无关像素。和px相比,dp在不同密度的屏幕中实际显示比例将保持一致。根据规定,一个dp相当于160dpi屏幕中的一个px。在320dpi的屏幕中,一个dp相当于2个px。通过这样的成比例放缩,Android解决了需要多个不同屏幕中的大小显示问题。 具体而言,当屏幕的的分辨率为320x480时,无论实际的物理尺寸大小,密度都会被设置为160dpi,也就意味着这个设备上,一行最多可以放置320dp,而对于480x800的设备,只需屏幕尺寸在3寸到4.3寸之间,密度都会被设置为240dpi,一行同样可以放置320dp。 因此在开发中,用dp作为单位,只需要设置一次,就可以适配到多个屏幕上。 同样,sp,scaled pixels,这个单位也采用了和dp同样的设计理念,将需要独立设置的pt转化为可以自动适配的sp,从而解决了文字的优化显示。
三,具体的 dpi(dot per inch每英寸像素数) 计算方法:
譬如1280x720物理分辨率,5英寸大小的屏幕,其dpi 的计算方法是:sqrt(1280*1280+720*720)/5 = 293.72 dpi
四,px 与 dp 的转换方法:
譬如1280x720物理分辨率,5英寸大小的屏幕上,<dimen name="indicator_bar_width_large">54dp</dimen> 这个高度如何转换成 px 呢,计算方法是:54dp*293.72/160+0.5f = 99.6305px,约为 100px。
那么我们就可以给这个长度去让UI工程师提供切图了。 import android.content.Context; public class DensityUtil { /** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public static int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 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); } }
五,屏幕像素密度 dpi 分类:
譬如1280x720物理分辨率,5英寸大小的屏幕 需要对应哪一种界面布局或者图片资源呢? 图片资源有 drawable,drawalbe-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi,drawable-xxhdpi,drawable-xxxhdpi(2K屏)等等 界面布局:layout-small,layout-normal,layout-mdpi,layout-hdpi,layout-xhdpi, 甚至还可以有 layout-480x854 这种特殊尺寸的布局 ldpi:low-dpi 低像素密度 mdpi:middle-dpi 中像素密度 hdpi:high-dpi 高像素密度 xhpi:extreame high-dpi 超高像素密度 可以查看下图:
那么根据上面算出来的 293.72dpi 可以算为 xhdpi 超高像素密度了。
六,编程建议(如何做到自适应屏幕大小):
1, 需要根据物理尺寸的大小准备多套布局,layout(放一些通用布局xml文件,比如界面中顶部和底部的布局,不会随着屏幕大小变化,类似windos窗口的title bar),layout-small(屏幕尺寸小于3英寸左右的布局),layout-normal(屏幕尺寸小于4.5英寸左右),layout-hdpi(4英寸-7英寸之间),layout-xhdpi(7-10英寸之间) 2, 需要根据dpi值准备5套图片资源,drawable,drawalbe-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi Android有个自动匹配机制去选择对应的布局和图片资源 3, 在XML布局,使用wrap_content和fill_parent来填充整个父窗口; 4, 使用FrameLayout的,而不是AbsoluteLayout,减少界面布局对屏幕大小的依赖; 5, 使用dp 来代替 px 作为图片长度单位;文字用 sp 代替 px 来作为字号大小; 6, 根据density 和 resolution 为不同的设备准备合适的图片资源,见上面第五条。
参考文献:
【1】dp和px,那些不得不吐槽的故事——Android平台图片文字元素单位浅析 http://blog.sina.com.cn/s/blog_6499f8f101014ipq.html
【2】Android手机分辨率基础知识(DPI,DIP计算) http://blog.csdn.net/moruite/article/details/6028547
【3】Android中dp和px之间进行转换 http://blog.csdn.net/arui319/article/details/6777133
【4】Android中的长度单位详解(dp、sp、px、in、pt、mm)http://blog.csdn.net/nokiaguy/article/details/5509638
【5】Android屏幕密度(Density)和分辨率的解释 http://www.apkbus.com/android-15796-1-1.html
转载请注明原文地址: https://ju.6miu.com/read-1298754.html
最新回复
(
0
)