android 分辨率适配与dip(dp)的使用

AWS 小白书 [1] 全球架构 小白应该知道的 AWS 知识 阅读详情
from:http://www.eoeandroid.com/thread-193122-1-1.html
如果想在不同型号手机对同一个应用做适配,如果你在xml中全部使用dp没有使用px,那么适配上依然很有可能出问题!


无数人存在误区,认为自己使用的都是dp,为什么在手机A上面和手机B上面看上去比例不一样,为什么在A手机上显示正好而手机B上却显示到屏幕外面

每次解释的都很累,所以写此blog

首先先明确几个概念
density值表示每英寸有多少个显示点(*)

dip/dp: device independent pixels(设备独立像素)
注意:dip与屏幕密度有关,屏幕密度与硬件有关,硬件设置不正确,有可能导致dip不能正常显示。在屏幕密度为160的显示屏上,1dip=1px

下面是一些分辨率信息

名称 分辨率 屏幕密度
QVGA 320*240 120
WQVGA400 400*240 120
WQVGA432 432*240 120
HVGA 640*480 160
WSVGA 1024*600 160
WXGA800 1280*800 160
WVGA800 800*480 240
WVGA854 854*480 240
WXGA720 1280*720 320

下面没有特殊说明的话,屏幕的宽度都指其像素数
我们在手机A上面放了一张图片,120px宽,手机屏幕240px宽,也就是说图片的宽度占了整个屏幕的一半
如果把应用安装在手机B上,B的宽度=320px,那么我们希望图片宽度为多少呢?如果大家希望按着比例缩放,那图片宽度应该是160px,占屏幕宽度的50%

如果我们在xml中使用的单位为dp,下面看看如何保持这个比例:
px = (density/160)dp(density这里是(*)的意思)
我们把所期待的比例记为rate,baseDensity=160,屏幕的宽度(像素数)为x,屏幕密度为density
那么rate=((density/baseDensity)*dp)/x;
这里baseDensity是已知的=160,dp也是已知的,因为是你写的嘛。
未知的是density屏幕密度和屏幕宽度x

rate可以写为:
rate=(dp/baseDensity)*(density/x);
现在情况就比较明朗了,rate=K(常数)*(density/x);
如果想保持rate不变,那么需要保证density/x保持比例

给数学不好的同学多解释两句
想保持rate的话,必须要手机A的屏幕密度/屏幕宽度=手机B的屏幕密度/屏幕宽度
或者说手机A的屏幕密度/手机B的屏幕密度=手机A的屏幕宽度/手机B的屏幕宽度

同样,如果你要保持纵向也保持等比缩放,那么也同样需要保持比例。
只有这样,你的应用才能看上去是等比缩放的。
使用dp保持比例只和这些有关,和你屏幕大小半点关系都没有。

还有另一种方式来保持比例:就是直接使用比例方式定义组件大小
但是很有局限性,只有LinearLayout中可以使用android:layout_weight属性

其实很容易理解,给大家举个例子
很多人觉得,如果项目中全部使用dp,那么就可以完美移植。
我们的一个移植项目,任务是把应用从A(分辨率为WXGA720=1280*720)移植到B(分辨率WVGA800=800*480)
其中A的密度=320,B的密度为240

我们现在来看看A横向有多少个dp
A dp数=720/(320/160)=360
B dp数=480/(240/160)=320

手机A横向有360个dp,如果你的图片占用360个dp,B去哪找你多出来的40dp呢!必然它会显示在屏幕外面阿!


ps:下面是一点相关内容
下面是函数void android.util.DisplayMetrics.setToDefaults()
public void setToDefaults() {
    widthPixels = 0;
    heightPixels = 0;
    density = DENSITY_DEVICE / (float) DENSITY_DEFAULT;
    densityDpi = DENSITY_DEVICE;
    scaledDensity = density;
    xdpi = DENSITY_DEVICE;
    ydpi = DENSITY_DEVICE;
    noncompatWidthPixels = 0;
    noncompatHeightPixels = 0;
}




其中density变量注释如下

density变量注释 写道

  1. float android.util.DisplayMetrics.density
  2. The logical density of the display. 
  3. This is a scaling factor for the Density Independent Pixel unit, where one DIP is one pixel on an approximately 160 dpi screen (for example a 240x320, 1.5"x2" screen), providing the baseline of the system's display. 
  4. Thus on a 160dpi screen this density value will be 1; on a 120 dpi screen it would be .75; etc.
  5. This value does not exactly follow the real screen size (as given by xdpi and ydpi, but rather is used to scale the size of the overall UI in steps based on gross changes in the display dpi. 
  6. For example, a 240x320 screen will have a density of 1 even if its width is 1.8", 1.3", etc. 
  7. However, if the screen resolution is increased to 320x480 but the screen size remained 1.5"x2" then the density would be increased (probably to 1.5).
  8. See Also:
  9. DENSITY_DEFAULT
复制代码
粗略的翻译了一下:

  1. 浮android.util.DisplayMetrics.density
  2. 逻辑密度的显示。
  3. 这是一个比例因子的密度独立像素单元,其中一个是一个像素上蘸一个大约160 dpi屏幕(例如240 x320,1.5 " x2 "屏幕),提供基线系统的显示。
  4. 因此在一个160 dpi屏幕这密度值是1;在一个120 dpi屏幕会。75;等等。
  5. 这个值并不完全遵循真正的屏幕大小(由xdpi和ydpi,而是用来规模大小的整体UI在步骤基于总改变显示dpi。
  6. 例如,一个240 x320屏幕将会有一个密度的1即使它的宽度为1.8”,1.3”,等等。
  7. 然而,如果屏幕分辨率是增加到320 x480,但是屏幕大小保持1.5 " x2”然后密度会增加(可能是1.5)。
  8. 参见:
  9. 密度默认

复制代码
 
[Unity]-[UI]-[Image] 关于UI精灵图资源导入设置的详细解释 如果纹理存储了有特定含义的信息,并且您需要着色器中的确切值(例如,平滑度或金属度),请禁用此属性。此选项允许将纹理编码为特定格式(RGBM 或 dLDR,具体取决于平台)并通过后期处理步骤对纹理数据进行处理(推拉式扩张通道)。使用在3D模型的专业法线贴图。通用的纹理类型,一般在Material上的材质图片参数使用,比如漫反射、法线贴图这些。​​Compression​​:ASTC 6x6(移动端)或DXT5(PC)​​Compression​​:BC5(PC)或ASTC 6x6(移动端) 阅读详情

相关推荐

ROS四旋翼无人机快速上手指南(3):工作环境文件框架与各功能包整体讲解

这一章节主要讲解无人机平台的控制文件架构和各个功能包组成和用法。

The Road of Engineer 2406

[高通SDM450][Android9.0]屏幕显示DPI可动态配置

文章目录开发平台基本信息问题描述解决方法去除默认dpi限制 开发平台基本信息 芯片: 高通SDM450 版本: Android 9.0 kernel: msm-4.9 问题描述 正常我们要修改屏幕的DPI,最简单的方法就是在编译的mk里面,给ro.sf.lcd_density这个属性赋值自己想设置的DPI。但是,我们有一款机器作为微信人脸支付硬件厂商,需要对接各个软件厂商,而不同的客户软件可能需要定制不同的DPI,因为ro属性不允许重写,那意味着即使不同厂商定制仅有dpi差别,也得分不同的固件,这样维护起

小小码农 1889

使用GDScript(godot)生成仿杀戮尖塔地图

使用GDScript(godot)生成仿杀戮尖塔地图 extends Node2D export (PackedScene) var Ball var 被连接数 = {} # 每个怪物被下层怪物连接的数量 最多为2 var 连接1 = {} # 第一次连接的上层怪物位置 var 连接2 = {} # 第二次连接的上层怪物位置 var 怪物数量 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0] # 每层怪物的数量 var 总层数 =8 # 总层数 var 怪物坐标行 = {} #

weixin_45038716的博客 3010

Android经典面试题目及解答(三)

1、Android支持的容器组件? ViewGroup的子类都支持,五大布局。 2、如何让

超级面试的专栏 573

1999年-2022年 上市公司-企业劳动生产率数据(原始数据、代码、最终结果、参考文献)

上市公司企业劳动生产率数据集为企业和市场参与者提供了一个深入分析企业生产效率和劳动效益的工具。通过这些数据,企业可以不断探索创新的发展模式和管理方式,努力提高生产效率,为提升市场竞争力和盈利能力做出贡献。数据名称:上市公司-企业劳动生产率数据数据年份:1999-2022年数据来源:国泰安数据库1999年-2022年 上市公司-企业劳动生产率数据(原始数据、代码、最终结果、参考文献)

2401_84585615的博客 882

06-esp32-idf开发调试方法(内置JTAG,OpenOCD调试)

使用VS Code和ESP-IDF进行ESP32开发和调试 在我们搭建 **IDF** 框架后,**OpenOCD** 已经自动下载好了, 我们通过 **JTAG** 接口连接使用 **OpenOCD** 进行调试。而**ESP32**芯片中内置 了**JTAG** 电路,无需额外芯片即可调试,更加方便,所以这里我们讲解使用模块自带的usb-jtag接口进行调试。

宁子希的博客 1万+

Android源码阅读笔记:DisplayMetrics类

Android源码阅读:DisplayMetrics类概述常量成员变量方法 概述 DisplayMetrics类主要是用来描述设备显示的一些信息,像是设备大小、密度以及字体的缩放。 常量 设备设置密度Density的相关数值 public static final int DENSITY_LOW = 120; public static final int DENSITY_140 = 140; public static final int DENSITY_MEDIUM = 160;

weixin_45519413的博客 1006

【学习笔记】人群归因分数 PAF 以及combined PAF

人群归因风险比例(Population Attributable Fraction,PAF)是一个流行病学指标,它估计了在总体中,如果能消除一个特定的危险因素,能预防多少百分比的疾病或健康结果。简单来说,PAF回答的是:“如果没有这个风险因素,总体中会有多少病例是可以避免的?

weixin_53499537的博客 4901

Android获取屏幕宽度高度并动态设置控件宽度,比例等

1、Android获取屏幕宽度的几种方法: //1、通过WindowManager获取 DisplayMetrics dm = new DisplayMetrics(); int heigth = dm.heightPixels;// 表示屏幕的像素高度,单位是px(像素) int width = dm.widthPixels;/...

冷冷清清里风风火火是我 2786

Agent Harness Engineering: AI Agent 执行管控与安全沙箱 原理与最佳实践

我们正站在计算范式转移的历史节点上。2024-2026 年间,AI 系统从被动的内容生成器(Generative AI)演变为主动的行动执行者(Agentic AI)。这一转变的根本特征是:根据 2026 年初的行业数据:然而,能力的提升伴随着风险的指数级增长。2024-2026 年间发生的多起标志性安全事件揭示了 Agent 系统的脆弱性:案例 1:Slack AI 数据外泄事件(2024 年 8 月)案例 2:制造业供应链攻击(2026 年 Q3)案例 3:Arup 深度诈骗案(2026 年 9 月)这

AI天才研究院 1669

图解联合概率密度、边缘概率密度、条件概率密度之间的关系

简要图解联合概率密度、边缘概率密度、条件概率密度之间的关系

一个搬运知识的笨小孩 2万+

RK3399 Android7.1修改安兔兔等读到的显示屏尺寸大小

diff --git a/frameworks/base/core/java/android/view/DisplayInfo.java b/frameworks/base/core/java/android/view/DisplayInfo.java index bc40849..7db5229 100755 --- a/frameworks/base/core/java/android/view/DisplayInfo.java +++ b/frameworks/base/core/java/andro

u011774634的博客 1131

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

安卓java分辨率_android 分辨率适配与dip(dp)的使用

如果想在不同型号手机对同一个应用做适配,如果你在xml中全部使用dp没有使用px,那么适配上依然很有可能出问题!无数人存在误区,认为自己使用的都是dp,为什么在手机A上面和手机B上面看上去比例不一样,为什么在A手机上显示正好而手机B上却显示到屏幕外面每次解释的都很累,所以写此blog首先先明确几个概念density值表示每英寸有多少个显示点(*)dip/dp: device independent...

weixin_39972264的博客 300

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

DRV8818PWPR与PIC24HJ256GP610双极步进电机驱动方案详解

步进电机驱动在工业自动化与机器人领域至关重要,其核心在于精确的电流控制与脉冲时序。双极步进电机通过H桥实现换向,需依赖集成驱动芯片完成微步细分与电流调节,以确保低速大扭矩和定位精度。采用DRV8818PWPR集成双H桥与PIC24HJ256GP610高性能MCU,可构建稳定可靠的控制系统,支持梯形加减速与动态电流调节,有效解决发热与丢步问题。该方案广泛应用于精密位移平台、机械臂关节及3D打印设备,为工程师提供从硬件连接到固件实现的完整参考。

weixin_34054866的博客 401

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

android 项目移植/分辨率适配与dip(dp)的使用

androiddip分辨率适配移植 如果想在不同型号手机对同一个应用做适配,如果你在xml中全部使用dp没有使用px,那么适配上依然很有可能出问题!   无数人存在误区,认为自己使用的都是dp,为什么在手机A上面和手机B上面看上去比例不一样,为什么在A手机上显示正好而手机B上却显示到屏幕外面   每次解释的都很累,所以写此blog   首先先明确几个概念 density值表

潇湘夜雨的专栏 907

Android 中 px和dp 的转换

安卓开发中,布局文件中我们习惯使用dp单位,但是很多java代码的api中默认使用的是px单位(如 setPadding、setButtom、setLeft 等),这就需要我们在很多场景下进行dp和px的转换。代码片段如下:public class DensityUtil { /** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) *

小单的博客专栏 7952

Android中px、dp、dip、sp详解

众所周知,Android厂商非常多,各种尺寸的Android手机、平板层出不穷。导致了Android生态环境的碎片化现象越来越严重。Google公司为了解决分辨率过多的问题,在Android的开发文档中定义了px,dp,dip,sp,方便开发者适配不同分辨率的Android设备。

飞翔的小鸟 1万+
上一篇: Android中shape的使用
下一篇: Selenium AndroidDriver使用(一)
andych008
博客等级 码龄19年 23粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值