转载请注明出处:http://blog.csdn.net/my_truelove/article/details/66584865

扫描左侧二维码,关注我的公众号,及时获取最新文章推送!


文章目录

  • 1 概念扫盲 inch、px 与 dpi
    • 1.1 屏幕尺寸之 inch
    • 1.2 屏幕分辨率之 px
    • 1.3 像素密度之 dpi
  • 2 碎片化下的 dip 与 sp
    • 2.1 密度无关像素之 dip
    • 2.2 缩放无关像素之 sp
  • 3 从 H, XH, XXH 说起
  • 4 layout weight 的用法
  • 5 px 与 dp 的相互转换

1 概念扫盲 inch、px 与 dpi

1.1 屏幕尺寸之 inch

不论是电视、平板,还是手机,所说的屏幕尺寸是指 屏幕对角线的长度,单位是英寸(inch),1 英寸相当于 2.54 厘米;

即:1 inch ≈ 2.54 cm

1.2 屏幕分辨率之 px

屏幕分辨率指 设备屏幕上的像素个数,每个像素点的边长为 1px,其是组成手机屏幕的最小单位。

常说的手机分辨率为 1920*1080,即手机横向有 1080 个像素点,竖向有 1920 个像素点。屏幕尺寸一样的情况下,分辨率越高,显示效果就越精细和细腻。

注:在 Android 开发中,涉及与 View 尺寸(宽高)、位置(坐标)相关的数据,最终都是以 px 为单位进行度量和绘制的。

1.3 像素密度之 dpi

像素密度,单位是 dpi,即 dot-per-inch,顾名思义,表示 每英寸上的像素点数

像素密度 与之前提及的 屏幕尺寸屏幕分辨率 息息相关,确保理解了前面的内容再继续向下学习。

举个栗子

以 Google 亲儿子 Nexus 5 为例,其屏幕尺寸为 4.95 inch,分辨率为 1920 * 1080,则其像素密度为:

√(1920² + 1080²) / 4.95 (√ 代表开根号)

注释:分辨率为 1920 * 1080,表示纵向、横向分别由 1920 和 1080 个像素点组成,那么屏幕对角线的像素点数就是√(1920² + 1080²);又屏幕尺寸(即对角线长度)为 4.95 inch,所以单位英尺上的像素点数即为:√(1920² + 1080²) / 4.95 = 445,也就是像素密度。

2 碎片化下的 dip 与 sp

在开始之前,先聊聊老生常谈的 Android 碎片化问题。

Android 的开源,让各大厂商趋之若鹜,各种定制硬件和 ROM,从而导致 Android 设备碎片化严重。手机尺寸与分辨率就是硬件层碎片化的一个体现:同样大小的手机屏幕,分辨率可能不一样;异或分辨率一样的手机,屏幕尺寸又大小不一。

开发者根本无法通过某一个因素(尺寸或分辨率)来适配 UI,所以写出来的布局无法在每一个手机上都能很好的 work。

看到这,你估计犯嘀咕了:这可咋办?别急,Google 为我们提供了 密度无关像素缩放无关像素 来应对不同分辨率的问题,继续看。

2.1 密度无关像素之 dip

密度无关像素,单位为 dip(简称 dp,下同),即 density-independent pixels ,顾名思义,该单位与手机的屏幕像素没有绝对关系。

注:注意区分此处的 dp 和前面说的 dpi。

所以,dp 才是开发中适配屏幕的最佳单位。在 xml 中写布局时,可以直接以 dp 为单位;在 Java 代码中则可以将 dp 转换为 px 以进行适配。

前面说过,在开发中所有与尺寸、宽高都是以 px 进行度量的,那么我们使用的 dp 与 px 之间到底是如何换算的呢?带着问题继续往下看。

在此提醒下,请确保对于前面的概念都理解了。为了更好的学习后面的知识,容我再啰嗦的回顾下:

  • 尺寸之 inch:屏幕对角线的长度;
  • 分辨率之 px:纵、横方向上的像素点数;
  • 像素密度之 dpi:,每英寸上的像素点数;

复习完,我们继续往下看 px、dpi 与 dp 的相互关系,敲黑板划重点了啊:

dp 与 px 之间的换算,取决于当前设备的 dpi。

嗯,就这一句重点。别激动同学,放下你手中的鞋子,容我再举个栗子。

以前面说的 Nexus 5 为例,其 dpi ≈ 445,此时 1dp = 3px。这里的 3 当然不是我蒙的,有对照表:

120dpi - 160dpi 1dp = 1px
160dpi - 240dpi 1dp = 1.5px
240dpi - 320dpi 1dp = 2px
320dpi - 480dpi 1dp = 3px
480dpi - 640dpi 1dp = 4px

同学,先别着急背换算倍数,dp 与 px 的换算倍数在开发中是可以通过 Api 获取的,我们后面会说。

2.2 缩放无关像素之 sp

缩放无关像素,即 scale-independent pixels(简称 sp),为降低理解难度,这么说:

sp 与 dp 可以理解为同种类型的度量单位,区别于 dp 用来度量 尺寸、宽高,sp 用来度量字体的大小。

dp 能够根据不同的屏幕密度相应的转换成不同的 px,以适配屏幕;sp 则其可以根据文字大小首选项进行缩放,达到适配不同屏幕的效果。

从基本的 inch、px 与 dpi,聊到 Android 碎片化,再到碎片化的解决方案 dp 与 sp,基础知识都介绍到了,后面再融会贯通,说说如何使用。

3 从 H, XH, XXH 说起

在开发中涉及图片资源时,为了适配屏幕,我们经常会在不同的 drawable 目录下各放置一套资源,这样在不同 dpi 的设备上,对程序进行编码时,会使用对应 drawable 目录下的资源。以下是对照表(顺便整合 dp 与 px 的换算):

dpi drawable dp / px
120dpi - 160dpi mdpi 1
160dpi - 240dpi hdpi 1.5
240dpi - 320dpi xhdpi 2
320dpi - 480dpi xxhdpi 3
480dpi - 640dpi xxxhdpi 4

4 layout weight 的用法

weight 表示权重,我们知道权重是一个相对的概念,那么在布局中有什么作用呢?

假设有这样的需求:

  • 横向上有两个按钮,各占屏幕宽度的一半,咋写?
  • 或者是三个按钮,各占屏幕宽度三分之一,咋写?
  • 或者两个按钮,右侧的自适应,左侧的占剩下的区域呢?

不妨动手写写,篇幅有限就不举栗子了,这样的需求使用 weight 实现将十分的简单。注意看代码中控件的 android:layout_weight 属性,其决定了该控件的权重。

第一个:

<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:background="@color/colorPrimary"android:text="Button 1" /><Buttonandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:background="@color/colorAccent"android:text="Button 2" /></LinearLayout>

效果如下:

第二个和第一个类似,不再举例,看第三个:

<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:background="@color/colorPrimary"android:text="Button 1" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@color/colorAccent"android:text="Button 2" /></LinearLayout>

效果如下:

看了上面的示例代码,你或许会很疑惑,下面说说 Android 是如何根据 weight 布局的。

其实 weight 的用法很简单,理解之后就是一句话,以上面讨论的宽度为例:

View 的实际宽度 = layout_height 设置的值 + 父布局剩余宽度 * layout_weight 所占权重

以第一个示例中,button 1 和 button 2 的宽度 layout_width = 0,权重 layout_weight = 1,假设屏幕宽度为 w,套公式。

则 button 1 的宽度 = 0 + (w - 0 - 0) * 1/(1 + 1) = w/2

其中:

  • w - 0 - 0 表示父布局剩余宽度,因为两个 button 宽度都为 0;
  • 1/(1 + 1) 表示 button 1 在剩余宽度中所占的权重,因为 button 1 的权重为 1,button 2 的权重为 1,所以总权重就是 1 + 1。

button 2 宽度的计算与 button 1 一样,结果同样为 w/2。可以看出,button 1 和 button 2 各占屏幕宽度 w 的一半。

以同样的方式理解第三个例子:

button 2 的宽度 layout_width = "wrap_content",宽度未知,那假设为 w’,屏幕宽度仍为 w。

则 button 1 的宽度为:0 + (w - 0 - w’) * 1/(1 + 0) = w - w’

计算方式不再解释,最后的结果可以看出,无论 button 2 宽度怎么自适应,button 1 和 button 2 宽度都为 w,也就实现了 button 1 填充剩余区域的效果。

注:weight 只在 LinearLayout 中起作用,限于篇幅很多没有展开,更多使用技巧可以参考 Android Develop 网站 或其它博客,值得学习。

5 px 与 dp 的相互转换

前面介绍 sp、dpi 与 dp 的关系时,提到了在不同 dpi 下 dp 与 px 转换比例不同。那么,开发中如何获取这一比例呢?下面为大家提供了一个现成的辅助类,欢迎拿走使用,但记得稍微看一下代码。

/*** Android 中 dp 与 px 的转换* <p/>* Created by ruicbAndroid on 2017/3/26.*/
public class DpAndPxHelper {private static float scale;private static float getScale(Context context) {if (scale == 0) {DisplayMetrics metrics =context.getResources().getDisplayMetrics();scale = metrics.density;}return scale;}/*** px to dp*/public static int px2dp(Context context, int px) {//+0.5 向上取整return  (int) (px / getScale(context) + 0.5f);}/*** dp to px*/public static int dp2px(Context context, int dp) {//+0.5 向上取整return (int) (dp * getScale(context) + 0.5f);}
}

以上就是本次分享的全部内容了,如果觉得对你有帮助,点赞表示一下。

若有任何问题,欢迎留言交流,或关注我的公众号了解更多。

Android 屏幕适配扫盲、教程相关推荐

  1. android屏幕适配教程,Android屏幕适配方案,android屏幕适配

    Android屏幕适配方案,android屏幕适配 文章转载禁止用于商业用途,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处莫高雷草原以及作者@JiongBull. Android屏幕适配方 ...

  2. 鸿洋android屏幕适配四部曲-传送门

    鸿洋android屏幕适配四部曲-传送门 两分钟理解Android中PX.DP.SP的区别 https://blog.csdn.net/donkor_/article/details/77680042 ...

  3. Android 屏幕适配

    一.适配方式之dp 名词解释 分辨率:480*800,1280*720.表示物理屏幕区域内像素点的总和.(切记:跟屏幕适配没有任何关系) 因为我们既可以把1280*720 的分辨率做到4.0 的手机上 ...

  4. android屏幕适配详解

    android屏幕适配详解 官方地址:http://developer.android.com/guide/practices/screens_support.html 一.关于布局适配建议 1.不要 ...

  5. Android屏幕适配全攻略(最权威的官方适配指导)(转),共大家分享。

    Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习 ...

  6. Android屏幕适配全攻略(最权威的官方适配指导) (转)

    招聘信息: Cocos2d-X 前端主程 [新浪微博]手机客户端iOS研发工程师 20k-40k iOS 开发工程师 iOS高级开发工程师(中国排名第一的企业级移动互联网云计算公司 和创科技 红圈营销 ...

  7. android 屏幕分辨率 屏幕密度,Android屏幕适配——多分辨率多屏幕密度

    为什么要适配,适配的好处等等这里就不说了,直接说我们要怎么适配,请看下面的内容. 1.重要概念 px:pixel,像素Android原生API,UI设计计量单位,如获取屏幕宽高. 屏幕分辨率:指在纵向 ...

  8. 【收藏】Android屏幕适配全攻略(最权威的Google官方适配指导)

    来源:http://blog.csdn.net/zhaokaiqiang1992 更多:Android AutoLayout全新的适配方式, 堪称适配终结者 Android的屏幕适配一直以来都在折磨着 ...

  9. Android 屏幕适配攻略(六)设置通知样图标与启动图标适配

    Android 屏幕适配攻略(六)设置通知样图标与启动图标适配 1 Android中资源文件中的图片加载分析 Android中对屏幕的像素适配处理分类 屏幕密度 对应的标签 对应的像素 120dip ...

最新文章

  1. lucene源码分析的一些资料
  2. 自建web3 provider服务
  3. java 初始化的加载顺序问题
  4. jMeter工具里左边树形结构里一些节点属性的介绍
  5. python代码设计测试用例_Python单元测试与测试用例简析
  6. python怎么开发工具_为程序员和新手准备的8大Python开发工具
  7. Hawq超过最大允许连接数
  8. HTTP协议原理+实践 Web开发工程师必学(笔记)
  9. java mybatis分页查询语句_mybatis分页查询的实现(一)
  10. ADO 动态链接数据库
  11. Flask-SQLAlchemy - 不使用外键连表查询。记得常回来看我
  12. python实现分层随机抽样算法_python分层随机抽样
  13. Pigeon 工具类ExtensionLoader
  14. ArrayList,LinkedList,Vector三者的异同
  15. 服务器要删除文件访问被拒绝,删除文件提示:文件夹访问被拒绝 需要来自administrator权限执行操作...
  16. Python用户管理系统,宠物管理系统
  17. PHP将PDF转图片-实战
  18. python批处理原始核磁数据用于DPABI
  19. MATLAB马氏链分析工具
  20. spring boot框架常用的一些玩意儿

热门文章

  1. WebUploader上传图片插件
  2. 一条SQL返回多个统计求和
  3. Java之~~包(package)
  4. 【100个 Unity小知识点】☀️ | Unity 中怎样读取Excel文件
  5. 图像修复 python_50.图像修复
  6. 拉依达准则的python代码
  7. VtkCamera总结
  8. dapper(dapper框架)
  9. STM32实战总结:HAL之FSMC控制TFT-LCD
  10. ffmpeg推送rtsp流或者视频文件到rtsp服务器