首页 > 其他分享 >Android 屏幕适配

Android 屏幕适配

时间:2024-06-17 17:32:49浏览次数:24  
标签:适配 分辨率 ppi 像素 Android 屏幕 dpi

目录

一、目的

        最近在调试一款设备,发现视图的样式尺寸偏大,像老人机。那时候也清楚是屏幕适配问题,但是脑子也仅想着通过修改分辨率的大小尝试修复该问题,没有想到其他手段调试。
        该问题也是一个Android开发者需应具备的基本知识点,这驱使我去了解Android屏幕相关的概念,及弄清楚该问题的原因。

二、环境

  1. 平台:UIS7870SC
  2. 版本:Android 13

三、相关概念

3.1 屏幕尺寸(screen size)

        屏幕大小是手机对角线的物理尺寸,单位是:英寸(inch),1 inch =2.54 cm(厘米)

3.2 屏幕分辨率(Resolution)

        分辨率就是是指屏幕上垂直方向和水平方向上的像素个数,一般描述为:横像素 * 纵像素,如 720 * 1280,就是在纵方向上有1280个像素点,在横方向上有720个像素点。
        日常所说的分辨率有两个概念,一个指显示器的分辨率,另一个指图像的分辨率。显示器分辨率指显示器所能显示的像素多少(720px*1280px),显示器可显示的像素越多,画面就越精细。图像分辨率则是单位英寸中所包含的像素点数,比如photoshop 里新建画布时设置的图像分辨率72ppi,其定义更趋近于分辨率本身的定义。

3.3 像素(pixel)

        Pixels 我们看到屏幕上的图像由一个个像素组成,像素里包含色彩信息。如常说的手机分辨率:1080 x 1920 指的是手机宽度可展示1080像素,高度可展示1920像素。

3.4 ppi

        ppi(Pixels Per Inch)即像素密度,指每英寸包含的物理像素的数量。ppi 是设备在物理上的属性值,取决于屏幕自身。设备的宽高都属于客观不可改变的值,所以 ppi 也是无法修改的,是硬件上一个客观存在无法改变的值。其计算公式如下:

\[ppi = \frac{\sqrt{(宽^2 + 高^2)(单位px)}}{屏幕尺寸(单位inch)} \]

3.5 dpi

        dpi(Dots Per Inch)原先用于在印刷行业中描述每英寸包含有多少个点,在 Android 开发中则用来描述屏幕像素密度。屏幕像素密度决定了在软件概念上单位距离对应的像素总数,是手机在出厂时就会被写入系统配置文件中的一个属性值,一般情况下用户是无法修改该值的,但在开发者模式中有修改该值的入口,是软件上一个可以修改的值。
        个人理解:dpi(dots per inch)、ppi(pixels per inch),前者突出图像的打印像数密度,后者突出设备的像数密度。

3.6 dp/dip

        density-independent pixels,dip是缩写,也可以更简单些称作dp。该单位的目的是屏蔽不同设备密度差异。
        根据不同的屏幕分辨率,与px有不同的倍数关系。规定:1dp等于屏幕像素密度为160ppi时1px的长度,因此dp在整个系统大小是固定的。公式:1dp=(屏幕ppi/ 160)px。为简便起见,Android 将所有屏幕密度分组为六种通用密度,具体如下表:

类别 dpi density
(屏幕ppi/ 160)
ldpi(低) 120dpi 0.75
mdpi(中) 160dpi 1.0
hdpi(高) 240dpi 1.5
xhdpi(超高) 320dpi 2.0
xxhdpi(超超高) 480dpi 3.0
xxxhdpi(超超超高) 640dpi 4.0

3.7 sp

        sp(Scaled Pixels):通常用于指定字体的大小,当用户修改手机显示的字体时,字体大小会随之改变。

四、Q&A

4.1 为啥dpi = 160?

(1)这个在Google的官方文档中有给出了解释,因为第一款Android设备(HTC的T-Mobile G1)是属于160dpi的。
(2)如果以 160 dpi作为基准的话,只要尺寸的 DP是4的公倍数,XHDPI下乘以2,HDPI下乘以 1.5,LDPI下乘以 0.75 即可满足所有尺寸下都是整数 pixel,而其他的dpi不配。

4.2 为啥Android要引入dp概念?

        Android屏幕尺寸的碎片化很严重,各种分辨率尺寸的设备层出不穷。如果以px作为单位,会出现如下现象:
(1)不同分辨率的设备,对应的px的长度不一致;
图二设备:分辨率1280x720,dpi=240,即屏幕的宽为720/1.5=480dp;
图一设备:分辨率1920x1080,dpi=360,即屏幕的宽为1080/2.25=480dp;

五、代码仓库地址

Demo地址:  https://gitee.com/linzhiqin/custom-demo

六、参考资料

https://blog.51cto.com/u_9420214/6336492
https://blog.csdn.net/qq_39312146/article/details/129271291
https://blog.51cto.com/u_16213653/7742791

https://j.eastday.com/p/161600562077011931

标签:适配,分辨率,ppi,像素,Android,屏幕,dpi
From: https://www.cnblogs.com/zhiqinlin/p/18252863

相关文章

  • 电脑屏幕录制怎么录制?这7个录制屏幕的技巧值得一试!
    电脑屏幕录制怎么录制?屏幕录制是什么? 简单地说,电脑屏幕录制就是在你的设备屏幕上录制视频。它可以捕捉屏幕上正在发生的事情,并让你与其他人分享。记录电脑、手机或笔记本电脑屏幕的原因有很多:1.一个简单的屏幕录制可以用来向潜在客户展示你的产品是如何工作的。2.在远程......
  • Android Studio 插件分享——Gradle Utilities
    插件地址GradleUtilities这个插件可以用来管理Gradle相关的文件,同时用来升级Gradle这个插件提供了一些有用的实用程序来支持Gradle的日常工作:列出所有正在运行的Gradle守护进程及其状态。此外,还可以执行终止守护程序或查看其命令行的操作。管理Gradle主页:清除......
  • Android Studio 插件分享——Gradle Utilities
    插件地址GradleUtilities这个插件可以用来管理Gradle相关的文件,同时用来升级Gradle这个插件提供了一些有用的实用程序来支持Gradle的日常工作:列出所有正在运行的Gradle守护进程及其状态。此外,还可以执行终止守护程序或查看其命令行的操作。管理Gradle主页:清除......
  • android ConcurrentModificationException 错误
    错误代码valsubList=newList.subList(position,endPosition+1)valmergeList:MutableList<IChatTab>=mutableListOf()//展开文件里面的tab,放到一个folder里面valtabIterator:Iterator<IChatTab>=subList.iterator()whi......
  • 安卓应用开发——Android Studio中This project contains Java compilation errors, w
    这个提示信息表明你的Java项目中存在编译错误,这些错误可能会导致自定义视图(customviews)的渲染失败。要解决这个问题,你需要先修复这些编译问题。以下是一些步骤,你可以按照这些步骤来查找并修复Java编译错误:查看编译错误:在你的集成开发环境(IDE)中,通常会有一个编译错误或警......
  • Trusty qemu + android环境搭建详细步骤
    下载源码mkdirtrustycdtrustyrepoinit-uhttps://android.googlesource.com/trusty/manifest-bmasterreposync-j32编译./trusty/vendor/google/aosp/scripts/build.pygeneric-arm64查看编译结果lsbuild-root/build-generic-arm64/lk.bin安装运行依赖sud......
  • Android 使用绑定式调用service中的方法
    在Android中,Service有两种启动方式:startService()和bindService()。startService()启动Service时,Service会被创建并且调用onCreate()和onStartcommand()方法。Service会一直保持运行状态,直到调用stopService()或者stopSelf()方法。bindService()启动Service时,Service会被创建......
  • Android面试题之Java 泛型和Kotlin泛型
    本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点定义:JDK5引入的一种参数化类型特性继承和实现接口可以多个staticclassA{}staticinterfaceB{}staticinterfaceC{}//类必须在接口的前面staticclassD<......
  • 按键精灵的每隔10秒点击屏幕中央的代码
    要在按键精灵中设置每隔10秒点击屏幕中央的代码,你可以参考以下步骤和代码: 步骤确定坐标:首先,你需要确定屏幕中央大门的精确坐标。你可以使用按键精灵的“抓抓”工具来获取这些坐标。编写脚本:在按键精灵中创建一个新的脚本,并编写以下代码。代码plaintext//设置循环,每隔1......
  • Android Media Framework(六)插件式编程与OMXStore
    必读:AndroidMediaFramework-开篇OpenMAXILSpec阅读到上一节就结束了,这一节开始正式进入到Framework阅读阶段,我们将了解OpenMAX框架是如何与AndroidFramework连接的。1、插件式编程插件式编程(Plugin-basedProgramming)是一种软件开发模式,它允许开发者通过编写独立的、......