Android复习(五)设备兼容—>屏幕适配
1. 适配使用的布局
目前版本Google还是希望开发者通过 ConstraintLayout 布局完成适配
2. 对于特定屏幕
创建备用布局,即在res/layout/目录下创建对应尺寸的布局文件 例: layout-w600dp,例如用户启动多窗口时
另在 Android Studio 3.0或更高版本中创建备用布局
- 打开默认布局,然后点击工具栏中的 Orientation for Preview 图标
。 - 在下拉列表中,点击以创建一个建议的变体(如 Create Landscape Variant),或点击 Create Other。
- 如果您选择 Create Other,系统将显示 Select Resource Directory。在此窗口中,在左侧选择一个屏幕限定符,然后将其添加到 Chosen qualifiers 列表。添加完限定符后,点击 OK。(有关屏幕尺寸限定符的信息,请参阅下面几部分。)
此时系统会在相应的布局目录中创建一个重复的布局文件,以便您可以开始自定义该屏幕变体的布局。
3. 设定最小宽度值
最小宽度限定符指定屏幕两侧的最小尺寸,而不考虑设备当前的屏幕方向,因此这是一种指定布局可用的整体屏幕尺寸的简单方法。
下面是其他最小宽度值与典型屏幕尺寸的对应关系:
- 320dp:典型手机屏幕(240x320 ldpi、320x480 mdpi、480x800 hdpi 等)。
- 480dp:约为 5 英寸的大手机屏幕 (480x800 mdpi)。
- 600dp:7 英寸平板电脑 (600x1024 mdpi)。
- 720dp:10 英寸平板电脑(720x1280 mdpi、800x1280 mdpi 等)。
图 4 提供了一个更详细的视图,说明了不同屏幕 dp 宽度与不同屏幕尺寸和方向的一般对应关系。

图 4. 建议的宽度断点以支持不同的屏幕尺寸
请记住,最小宽度限定符的所有数值都是密度无关像素,因为重要的是系统考虑像素密度(而不是原始像素分辨率)之后可用的屏幕空间量。
注意:您使用这些限定符指定的尺寸不是实际屏幕尺寸,而是 Activity 的窗口可用的宽度或高度(以 dp 为单位)。Android 系统可能会将部分屏幕用于系统界面(如屏幕底部的系统栏或顶部的状态栏),因此部分屏幕可能不可供您的布局使用。如果您的应用在多窗口模式下使用,则它只能使用该窗口的尺寸。该窗口进行大小调整时,会使用新窗口尺寸触发配置更改,以便系统可以选择适当的布局文件。因此,在声明尺寸时,您应具体说明 Activity 需要的尺寸。在声明为布局提供多少空间时,系统会考虑系统界面使用的所有空间。
4. 使用布局别名
如果同时支持低于和高于 Android 3.2 的版本,那么您必须同时对布局使用最小宽度限定符和 large 限定符。因此,您应创建一个名为 res/layout-large/main.xml 的文件,该文件可能与 res/layout-sw600dp/main.xml 完全相同。
为避免同一文件出现这种重复,您可以使用别名文件。例如,您可以定义以下布局:
res/layout/main.xml # single-pane layout
res/layout/main_twopanes.xml # two-pane layout
并添加以下两个文件:
res/values-large/layout.xml:<resources>
<item name="main" type="layout">@layout/main_twopanes</item>
</resources>res/values-sw600dp/layout.xml:<resources>
<item name="main" type="layout">@layout/main_twopanes</item>
</resources>
这两个文件的内容完全相同,但它们实际上并未定义布局,而只是将 main 设为 main_twopanes 的别名。由于这些文件具有 large 和 sw600dp 选择器,因此无论使用的是哪个 Android 版本,它们都适用于大屏幕(低于 3.2 版本的平板电脑和 TV 与 large 匹配,高于 3.2 版本的平板电脑和 TV 与 sw600dp 匹配)
5. dp单位转像素单位的说明
在某些情况下,您需要以 dp 表示尺寸,然后将其转换为像素。dp 单位转换为屏幕像素很简单:
px = dp * (dpi / 160)
假设在某一应用中,用户的手指至少移动 16 像素之后,系统会识别出滚动或滑动手势,那么在基准屏幕上,用户的手指必须至少移动 16 pixels / 160 dpi,相当于 1 英寸的 1/10(2.5 毫米),相应手势才能被识别;而在配备高密度显示屏 (240dpi) 的设备上,用户的手指必须至少移动 16 pixels / 240 dpi,相当于 1 英寸的 1/15(1.7 毫米)。此距离短得多,因此用户会感觉应用在该设备上更灵敏。
要解决此问题,手势阈值必须在代码中以 dp 表示,然后再转换为实际像素。例如:
kotlin
// The gesture threshold expressed in dp
private const val GESTURE_THRESHOLD_DP = 16.0f
...
private var mGestureThreshold: Int = 0
...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Get the screen's density scale
val scale: Float = resources.displayMetrics.density
// Convert the dps to pixels, based on density scale
mGestureThreshold = (GESTURE_THRESHOLD_DP * scale + 0.5f).toInt()
// Use mGestureThreshold as a distance in pixels...
}
java
// The gesture threshold expressed in dp
private static final float GESTURE_THRESHOLD_DP = 16.0f;
// Get the screen's density scale
final float scale = getResources().getDisplayMetrics().density;
// Convert the dps to pixels, based on density scale
mGestureThreshold = (int) (GESTURE_THRESHOLD_DP * scale + 0.5f);
// Use mGestureThreshold as a distance in pixels...
DisplayMetrics.density 字段根据当前像素密度指定将 dp 单位转换为像素时必须使用的缩放系数。对于中密度屏幕,DisplayMetrics.density 等于 1.0;对于高密度屏幕,等于 1.5;对于超高密度屏幕,等于 2.0;对于低密度屏幕,等于 0.75。此数字是一个系数,用其乘以 dp 单位,即可得出当前屏幕的实际像素数。
使用预缩放的配置值
您可以使用 ViewConfiguration 类来获取 Android 系统常用的距离、速度和时间。例如,可通过 getScaledTouchSlop() 来获取框架用作滚动阈值的距离(以像素为单位):
kotlin:
private val GESTURE_THRESHOLD_DP = ViewConfiguration.get(myContext).scaledTouchSlop
java:
private static final int GESTURE_THRESHOLD_DP = ViewConfiguration.get(myContext).getScaledTouchSlop();
ViewConfiguration 中以 getScaled 为前缀的方法都会返回以像素为单位的值,无论当前像素密度是多少,该值都会正确显示。
6. 备用图片的说明以及ldpi等说明:
表 1. 适用于不同像素密度的配置限定符。
| 密度限定符 | 说明 |
|---|---|
ldpi |
适用于低密度 (ldpi) 屏幕 (~ 120dpi) 的资源。 |
mdpi |
适用于中密度 (mdpi) 屏幕 (~ 160dpi) 的资源(这是基准密度)。 |
hdpi |
适用于高密度 (hdpi) 屏幕 (~ 240dpi) 的资源。 |
xhdpi |
适用于加高 (xhdpi) 密度屏幕 (~ 320dpi) 的资源。 |
xxhdpi |
适用于超超高密度 (xxhdpi) 屏幕 (~ 480dpi) 的资源。 |
xxxhdpi |
适用于超超超高密度 (xxxhdpi) 屏幕 (~ 640dpi) 的资源。 |
nodpi |
适用于所有密度的资源。这些是与密度无关的资源。无论当前屏幕的密度是多少,系统都不会缩放以此限定符标记的资源。 |
tvdpi |
适用于密度介于 mdpi 和 hdpi 之间的屏幕(约 213dpi)的资源。这不属于“主要”密度组。它主要用于电视,而大多数应用都不需要它。对于大多数应用而言,提供 mdpi 和 hdpi 资源便已足够,系统将视情况对其进行缩放。如果您发现有必要提供 tvdpi 资源,应按一个系数来确定其大小,即 1.33*mdpi。例如,如果某张图片在 mdpi 屏幕上的大小为 100px x 100px,那么它在 tvdpi 屏幕上的大小应该为 133px x 133px。 |
要针对不同的密度创建备用可绘制位图资源,您应遵循六种主要密度之间的 3:4:6:8:12:16 缩放比。例如,如果您有一个可绘制位图资源,它在中密度屏幕上的大小为 48x48 像素,那么它在其他各种密度的屏幕上的大小应该为:
- 36x36 (0.75x) - 低密度 (ldpi)
- 48x48(1.0x 基准)- 中密度 (mdpi)
- 72x72 (1.5x) - 高密度 (hdpi)
- 96x96 (2.0x) - 超高密度 (xhdpi)
- 144x144 (3.0x) - 超超高密度 (xxhdpi)
- 192x192 (4.0x) - 超超超高密度 (xxxhdpi)
7. 在AndroidStuido中使用矢量图形
矢量图形通常以 SVG(可缩放矢量图形)文件的形式提供,但 Android 不支持此格式,因此您必须将 SVG 文件转换为 Android 的矢量图格式。
您可以在 Android Studio 中使用 Vector Asset Studio 轻松地将 SVG 转换为矢量图,具体步骤如下:
- 在 Project 窗口中,右键点击 res 目录,然后依次选择 New > Vector Asset。
- 选择 Local file (SVG, PSD)。
找到要导入的文件并进行任何调整。

图 3. 使用 Android Studio 导入 SVG 文件
您可能会注意到 Asset Studio 窗口中出现了一些错误,指出文件的某些属性不受矢量图支持。但这不会阻止您导入,只是会忽略不受支持的属性。
点击 Next。
在下一个屏幕上,确认您希望从中查找项目文件的源集,然后点击 Finish。
因为可以对所有像素密度使用一个矢量图,所以此文件位于默认的 drawable 目录中(您不需要使用特定于密度的目录):
res/
drawable/
ic_android_launcher.xml如需详细了解如何创建矢量图形,请阅读矢量图文档。
Android复习(五)设备兼容—>屏幕适配的更多相关文章
- Android 尺寸单位转换和屏幕适配相关
Android 尺寸单位转换和屏幕适配相关 各种尺寸单位的意义 dp: Density-independent Pixels 一个抽象的单元,基于屏幕的物理密度. (dp和dip的意义相同,所以不用区 ...
- iPhone设备及屏幕适配
// // Common.h // 微信 // // #ifndef Common_h #define Common_h // iPhone设备及屏幕适配 //4的设备 #define KDevice ...
- Android SO文件的兼容和适配
开发Android应用时,有时候Java层的编码不能满足实现需求,就需要到C/C++实现后生成SO文件,再用System.loadLibrary()加载进行调用,这里成为JNI层的实现.常见的场景如: ...
- Android 浅谈 设计与屏幕适配 【1.6235449734285716】
extends: http://www.ui.cn/detail/45435.html http://www.2cto.com/kf/201501/372699.html http://www.cnb ...
- android技巧(三)屏幕适配
屏幕适配策略: 1.控件使用wrap_content.match_parent控制某些视图组件的宽度和高度,而不是硬编码的尺寸. “wrap_content”系统就会将视图的宽度或高度设置成所需的最小 ...
- 移动设备 h5屏幕适配
<meta name="HandheldFriendly" content="true"><meta name="MobileOpt ...
- Android屏幕适配问题详解
上篇-Android本地化资源目录详解 :http://www.cnblogs.com/steffen/p/3833048.html 单位: px(像素):屏幕上的点. in(英寸):长度单位. mm ...
- @media响应式的屏幕适配
当页面小于960px的时候执行 @media screen and (max-width: 960px){ body{ background: #000; } } 等于960px尺寸的代码 @medi ...
- Android TV开发总结(五)TV上屏幕适配总结
前言:前面几篇总结一些TV上的小Sample,开源到GitHub:https://github.com/hejunlin2013/TVSample, 点击链接,可以持续关注.今天总结下TV上屏幕适配. ...
- 【Android 应用开发】Android屏幕适配解析 - 详解像素,设备独立像素,归一化密度,精确密度及各种资源对应的尺寸密度分辨率适配问题
. 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19698511 . 最近遇到了一系列的屏幕适配问题, 以及 ...
随机推荐
- 【BatchProgram】 读取文本批量创建目录
NameList.txt文件内容 FILE-NAME-A FILE-NAME-B FILE-NAME-C ... 根据上面文件批量创建对应的目录,且附加序号 CMD代码: @ECHO OFF SETL ...
- 【MacOS】VMware安装10.15-Catalina版本
参考自: https://www.bilibili.com/video/BV1sf4y1D77A?p=4 资源地址: https://pan.baidu.com/s/1U6WOorb_TuORQ9ab ...
- 【Layui】01 快速入门
[原生JavaScript 与 JQuery] <!DOCTYPE html> <html lang="en"> <head> <meta ...
- 【Spring Data JPA】09 多表关系 Part2 多对多关系操作
环境搭建: 用户类: package cn.echo42.domain; import javax.persistence.*; import java.util.HashSet; import ja ...
- 在哲学/自然科学范畴下“推理”(reason about)的类别及解释
注意,本文的解释采用Google大模型(Gemini)的答案. 翻译: 推理是运用逻辑和证据得出结论的过程.它包含批判性地思考一个主题,考虑不同的观点,以及识别事物之间的关系.以下是推理的一些方式: ...
- 分布式深度学习计算框架依赖环境——NCCL的安装
分布式深度学习计算框架(MindSpore, PyTorch)依赖环境--NCCL, NCCL提供多显卡之间直接进行数据交互的功能(可以跨主机进行). 注意: 本文环境为 Ubuntu18.04 以 ...
- 使用 Apache DolphinScheduler 进行 EMR 任务调度
By AWS Team 前言 随着企业规模的扩大,业务数据的激增,我们会使用 Hadoop/Spark 框架来处理大量数据的 ETL/聚合分析作业,⽽这些作业将需要由统一的作业调度平台去定时调度. 在 ...
- C# 使用 PaddleOCRSharp 识别 图片中的文字、 使用QRCoder生成二维码
目录 使用PaddleOCRSharp识别图片中的文字 PaddleOCRSharp资料汇总: 1.将源码编译成对应的.Net 版本引入到项目中 2. 初始化PaddleOCREngine 3. 调用 ...
- nftables
RHEL 8 用 ntftable 替换 iptables, 新安装的 CentOS 8.3 是这样的: [root@net182-host113 ~]# nft list tablestable i ...
- Angular 18+ 高级教程 – Signals
前言 首先,我必须先说明清楚.Signal 目前不是 Angular 的必备知识. 你的项目不使用 Signal 也不会少了条腿,断了胳膊. Angular 官方维护的 UI 组件库 Angular ...