Android碎片化之屏幕适配

Android碎片化之屏幕适配Android 碎片化之屏幕适配现如今 因 Android 系统的开放性 市场上出现了不同厂商出厂的各种 android 版本 分辨率 型号等设备 那对我们开发来说 碎片化绝对是一个让人头脑炸裂的问题 Android 系统碎片化 Android 机型屏幕尺寸碎片化 Android 屏幕分辨率碎片化 市面上安卓手机的主流屏幕尺寸种类繁多 就算搞定了屏幕尺寸问题 各种分辨率又让人眼花缭乱 面对测试同学抛过来的适配问

Android碎片化之屏幕适配

现如今,因Android系统的开放性,市场上出现了不同厂商出厂的各种android版本、分辨率、型号等设备。那对我们开发来说,碎片化绝对是一个让人头脑炸裂的问题,Android系统碎片化、Android机型屏幕尺寸碎片化、Android屏幕分辨率碎片化。市面上安卓手机的主流屏幕尺寸种类繁多,就算搞定了屏幕尺寸问题,各种分辨率又让人眼花缭乱。面对测试同学抛过来的适配问题,心肝肺都要颤一颤。今天我们就谈谈屏幕适配的解决步骤。

一、解决屏幕适配的方案都有:

“布局”匹配:使用相对布局(RelativeLayout),禁用绝对布局(AbsoluteLayout)。根据屏幕的配置来加载相应的UI布局,尺寸(size)限定符。

“布局组件”匹配:使用”wrap_content”、”match_parent”和”weight“来控制视图组件的宽度和高度

“图片资源”匹配:使用自动拉伸位图:Nine-Patch的图片类型

二、Android屏幕适配的一些名词含义:

屏幕尺寸: 也就是我们平时所说的某某手机是几寸屏, 比如HTC one V这款手机是3.7寸的, 这里的寸说的是英寸(inch),国际上习惯使用的单位,1inch = 2.54cm,3.7寸指的是屏幕的对角线的长度。

屏幕分辨率: 指屏幕的宽和高的像素数, 比如HTC one V是480*800的。

屏幕密度: 每inch的像素数,比如HTC one V, 是252 px/inch。

px: 像素。一块显示屏是由很多的光点组成的,每一个光点就是一个像素。由于这些光点很小很密,想想看,在上面提到的3.7寸的手机上,横向有480个光点,纵向有800个光点,所以显示出来的文字或者图片才很细腻平滑。

ppi: 和屏幕密度一个意思, 全称是pixel per inch. 是专业一点的叫法.

dpi: dot per inch,每英寸的点数。在电子显示范畴内它和PPI是一个意思。 只有在打印时这个缩写才有意义,在打印领域不存在 PPI的叫法,只说DPI,它表示打印机每英寸打印几个像素点。宽高同样像素下,dpi越大,打印出来的图案越小。

dip: 或者叫dp,这是Android开发中特有的一种度量,称作屏幕无关像素, 它不表示任何具体的长度或者像素点, 这个值只有在 具体屏幕密度的手机上,才会被转换为具体的像素值。 这个时候才会有实际意义。 具体怎么转换,接下来会讲解。

Android项目的res目录下一般加上我们自己创建的,会有6个目录,分别是:drawble drawble-ldpi drawble-mdpi drawble-hdpi drawble-xhdpi drawble-xxhdpi, 这里就不包括更为特殊的drawble目录了,(比如drawlbe-land-hdpi, 表示水平方向的高分辨率的图片,这些都目录不管多么长,它们都是按一丁点规律匹配的, 我们的目的是, 从个别中发现规律,从而应用到整体)。

三、屏幕尺寸、分辨率、像素密度三者关系

像素密度=Sqrt(横向像素×横向像素+纵向像素×纵向像素)/屏幕尺寸

四、控件的屏幕尺寸和屏幕密度的适配问题的解决操作步骤。

百分比适配方法,步骤如下:

步骤1:以某一分辨率为基准,生成所有分辨率对应像素数列表

lay_x.xml(宽) <?xml version="1.0" encoding="utf-8"?> <resources><dimen name="x1">1.0px</dimen> <dimen name="x2">2.0px</dimen> <dimen name="x3">3.0px</dimen> <dimen name="x4">4.0px</dimen> <dimen name="x5">5.0px</dimen> <dimen name="x6">6.0px</dimen> <dimen name="x7">7.0px</dimen> <dimen name="x8">8.0px</dimen> <dimen name="x9">9.0px</dimen> <dimen name="x10">10.0px</dimen> 
<dimen name="x300">300.0px</dimen> <dimen name="x301">301.0px</dimen> <dimen name="x302">302.0px</dimen> <dimen name="x303">303.0px</dimen> <dimen name="x304">304.0px</dimen> <dimen name="x305">305.0px</dimen> <dimen name="x306">306.0px</dimen> <dimen name="x307">307.0px</dimen> <dimen name="x308">308.0px</dimen> <dimen name="x309">309.0px</dimen> <dimen name="x310">310.0px</dimen> <dimen name="x311">311.0px</dimen> <dimen name="x312">312.0px</dimen> <dimen name="x313">313.0px</dimen> <dimen name="x314">314.0px</dimen> <dimen name="x315">315.0px</dimen> <dimen name="x316">316.0px</dimen> <dimen name="x317">317.0px</dimen> <dimen name="x318">318.0px</dimen> <dimen name="x319">319.0px</dimen> <dimen name="x320">320px</dimen> </resources> lay_y.xml(高) <?xml version="1.0" encoding="utf-8"?> <resources><dimen name="y1">1.0px</dimen> <dimen name="y2">2.0px</dimen> <dimen name="y3">3.0px</dimen> <dimen name="y4">4.0px</dimen> ... <dimen name="y480">480px</dimen> </resources> 

找到基准后,是时候把其他分辨率补全了,现今以写1080×1920的分辨率为例:

因为基准是320×480,所以1080/320=3.375px,1920/480=4px,所以相应文件应该是

lay_x.xml <?xml version="1.0" encoding="utf-8"?> <resources><dimen name="x1">3.375px</dimen> <dimen name="x2">6.65px</dimen> <dimen name="x3">10.125px</dimen> ... <dimen name="x320">1080px</dimen> </resources> lay_y.xml <?xml version="1.0" encoding="utf-8"?> <resources><dimen name="y1">4px</dimen> <dimen name="y2">8px</dimen> <dimen name="y3">12px</dimen> <dimen name="y4">16px</dimen> ... <dimen name="y480">1920px</dimen> </resources> 

步骤2:把生成的各像素数列表放到对应的资源文件
将生成像素数列表(lay_x.xml和lay_y.xml)存放在res目录下对应的values文件(注意宽、高要对应),如下图:
res目录下对应的values文件

步骤3:根据UI设计师给出某一分辨率设计图上的尺寸,找到对应像素数的单位,然后设置给控件即可
如下图:

<FrameLayout > <Button android:layout_gravity="center" android:gravity="center" android:text="@string/hello_world" android:layout_width="@dimen/x160" android:layout_height="@dimen/y160"/> </FrameLayout> 

总结
使用上述的适配方式,应该能进行90%的适配了,但其缺点还是很明显:
由于实际上还是使用px作为长度的度量单位,所以和google的要求使用dp作为度量单位会有所背离

必须尽可能多的包含所有分辨率,因为这个是使用这个方案的基础,如果有某个分辨率缺少,将无法完成该屏幕的适配

过多的分辨率像素描述xml文件会增加软件包的大小和维护的难度

“图片资源”匹配

本质:使得图片资源在不同屏幕密度上显示相同的像素效果

做法:提供备用位图(符合屏幕尺寸的图片资源)

由于 Android 可在各种屏幕密度的设备上运行,因此我们提供的位图资源应该始终可以满足各类密度的要求:

密度类型 代表的分辨率(px) 系统密度(dpi)
低密度(ldpi) 240×320 120
中密度(mdpi) 320×480 160
高密度(hdpi) 480×800 240
超高密度(xhdpi) 720×1280 320
超超高密度(xxhdpi) 1080×1920 480

步骤1:根据以下尺寸范围针对各密度生成相应的图片。

比如说,如果我们为 xhdpi 设备生成了 200×200 px尺寸的图片,就应该按照相应比例地为 hdpi、mdpi 和 ldpi 设备分别生成 150×150、100×100 和 75×75 尺寸的图片

即一套分辨率=一套位图资源(这个当然是Ui设计师做了)

步骤2:将生成的图片文件放在 res/ 下的相应子目录中(mdpi、hdpi、xhdpi、xxhdpi),系统就会根据运行您应用的设备的屏幕密度自动选择合适的图片

步骤3:通过引用 @drawable/id,系统都能根据相应屏幕的 屏幕密度(dpi)自动选取合适的位图。
注:
如果是9图或者是不需要多个分辨率的图片,放在drawable文件夹即可,对应分辨率的图片要正确的放在合适的文件夹,否则会造成图片拉伸等问题。

不知不觉已经更得差不多了,今天就先讲到这里,后续会继续给大家分享经验与心得,最后和大家推荐想快速发现、解决android屏幕适配问题,可以点击传送门,了解优测,感兴趣可以马上加官群优测官方群:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231122.html原文链接:https://javaforall.net

(0)
上一篇 2026年1月27日 下午12:01
下一篇 2026年1月27日 下午12:22


相关推荐

  • 详细介绍scrollIntoView()方法属性

    详细介绍scrollIntoView()方法属性因为工作中用到了锚点设置,常用的总是出问题,后来扒拉出了这个属性,详细研究了下方便日后使用介绍scrollIntoView()的详细属性简介该scrollIntoView()方法将调用它的元素滚动到浏览器窗口的可见区域。PS:根据其他元素的布局,元素可能无法完全滚动到顶部或底部。TIPS:页面(容器)可滚动时才有用!语法element.scrollIntoView();//等同于element.scrollIntoView(true)element.scrollIntoV

    2022年6月15日
    73
  • Java中Map接口的解析

    Java中Map接口的解析Map详解:先看图,便于宏观了解Map的地位。Map接口中键和值一一映射.可以通过键来获取值。给定一个键和一个值,你可以将该值存储在一个Map对象.之后,你可以通过键来访问对应的值。 当访问的值不存在的时候,方法就会抛出一个NoSuchElementException异常. 当对象的类型和Map里元素类型不兼容的时候,就会抛出一个ClassCastException异常。…

    2022年7月8日
    26
  • linux终端怎么下载软件_linux查看文件类型

    linux终端怎么下载软件_linux查看文件类型今天小编要跟大家分享的文章是关于Linux终端下载文件的方法有哪些?如果您坚持使用Linux终端,例如在服务器上,该如何从终端下载文件?本文中你将学习两种在Linux中使用命令行下载文件的方法。我在这里使用的是Ubuntu,但除了安装之外,其余的命令同样适用于所有其他Linux发行版。一、使用wget命令从Linux终端下载文件wget可能是Linux和类UNIX系统中使用最多的命令行下载管理器。…

    2022年8月24日
    7
  • 腾讯加速AI战略布局,重构混元大模型研发体系

    腾讯加速AI战略布局,重构混元大模型研发体系

    2026年3月13日
    2
  • crontab每小时运行一次

    crontab每小时运行一次先给出 crontab 的语法格式对于网上很多给出的每小时定时任务写法 可以说绝大多数都是错误的 比如对于下面的这种写法 00 每隔一小时执行一次 00 1 与上面是相同的任务这种是正确的吗 对照最前面给出的语法格式来看 这个定时任务在 0 分 每小时 每天 每月 每星期执行 看起来似乎很合理啊 前一个小时的 0 分和后一个小时的 0 分不就是相隔一个小时吗 这样的话

    2026年3月26日
    2
  • redis的incr和incrby命令

    redis的incr和incrby命令

    2021年11月9日
    69

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号