安卓APP如何适配不同的手机分辨率

devtools/2025/1/23 8:47:37/

1 android是根据什么去选择drawable文件夹下的图片?

是根据drawable文件夹的修饰符进行选择的。

比如drawabledrawable-ldpidrawable-mdpidrawable-hdpidrawable-xhdpidrawalbe-xxhdpidrawable-xxxhdpi

根据修饰符进行优先匹配。

不同的dpi修饰符对应的dpi如下

drawable-ldpi          120DPI

drawable-mdpi        160DPI

drawable-hdpi         240DPI

drawable-xhdpi       320DPI

drawalbe-xxhdpi     480DPI

drawable-xxxhdpi    640DPI

dpi是根据手机的当前分辨率ppi归一化得到的。

那么PPI如何得来的?

如果手机的宽为X,高为Y,屏幕大小为Z英寸,那么

PPI = sqrt(X*X + Y*Y)/Z

比如三星手机I9260分辨率是1280*720,屏幕大小是4.65英寸,那么计算得到的PPI就是315.8PPI

找一个最近的DPI值应该是320DPI,也就是这个设备被归一化后就是320DPI。属于xhdpi

系统取图片时会优先选择drawable-xhdpi里面的图片,如果drawable-xhdpi不存在或者没有这张图,就会就近从其它分辨率和默认的无后缀drawable文件夹下取。

比如工程只有在draw-xxhdpi文件下有img图片,而你的设置是xhdpi,就会从xxhdpi取完图片再压缩到对应大小返回给使用者。

2 屏幕适配的注意事项

2.1 基本设置

 2.1.1 AndroidManifest.xml设置

在中Menifest中添加子元素

android:anyDensity="true"时,应用程序安装在不同密度的终端上时,程序会分别加载xxhdpixhdpihdpimdpildpi文件夹中的资源。

相反,如果设为false,即使在文件夹下拥有相同资源,应用不会自动地去相应文件夹下寻找资源:

1) 如果drawable-hdpidrawable-mdpidrawable-ldpi三个文件夹中有同一张图片资源的不同密度表示,那么系统会去加载drawable_mdpi文件夹中的资源;

2) 如果drawable-hpdi中有高密度图片,其它两个文件夹中没有对应图片资源,那么系统会去加载drawable-hdpi中的资源,其他同理;

3) 如果drawable-hdpi,drawable-mdpi中有图片资源,drawable-ldpi中没有,系统会加载drawable-mdpi中的资源,其他同理,使用最接近的密度级别。

2.1.2 横屏竖屏目录区分

1) drawable

a) drawable-hdpi该图片即适用于横屏,也适用于竖屏;

b) drawable-land-hdpi,当屏幕为横屏,且为高密度时,加载此文件夹的资源;

c) drawable-port-hdpi,当屏幕为竖屏,且为高密度时,加载此文件夹中的资源。其他同理。

2) layout

res目录下建立layout-portlayout-land两个目录,里面分别放置竖屏和横屏两种布局文件,以适应对横屏竖屏自动切换。

2.2 多屏幕适配的4条黄金原则

1) layout文件中设置控件尺寸时应采用fill_parentwrap_contentmatch_parentdp

具体来说,设置view的属性android:layout_widthandroid:layout_height的值时,wrap_contentmatch_parentdppx更好,文字大小应该使用sp来定义

2) 在程序的代码中不要出现具体的像素值,在dimens.xml中定义;

为了使代码简单,android内部使用pix为单位表示控件的尺寸,但这是基于当前屏幕基础上的。为了适应多种屏幕,android建议开发者不要使用具体的像素来表示控件尺寸。

3) 不使用AbsoluteLayout(android1.5已废弃) ,可以使用RelativeLayout替代;

4) 对不同的屏幕提供合适大小的图片。

不同大小屏幕用不同大小的图片,low:medium:high:extra-high图片大小的比例为3:4:6:8;举例来说,对于中等密度(medium)的屏幕你的图片像素大小为48×48,那么低密度(low)屏幕的图片大小应为36×36,高(high)的为72×72extra-high96×96

2.3 使用9-patch PNG图片

使用图片资源时,如果出现拉伸,因为图片处理的原因,会变形,导致界面走形。9-patch PNG图片也是一种标准的PGN图片,在原生PNG图片四周空出一个像素间隔,用来标识PNG图片中哪些部分可以拉伸、哪些不可以拉伸、背景上的边框位置等。

上、左定义可拉伸区域

右、下定义显示区域,如果用到完整填充的背景图,建议不要通过android:padding来设置边距,而是通过9-patch方式来定义。

Android SDK中提供了编辑9-Patch图片的工具,在tools目录下draw9patch.bat,能够立刻看到编辑后的拉伸效果,也可以直接用其他图片编辑工具编辑,但是看不到效果。

2.4 不同的layout

Android手机屏幕大小不一,有480x320, 640x360, 800x480……

怎样才能让Application自动适应不同的屏幕呢?

其实很简单,只需要在res目录下创建不同的layout文件夹,比如:layout-640x360layout-800x480……所有的layout文件在编译之后都会写入R.java里,而系统会根据屏幕的大小自己选择合适的layout进行使用。

2.5 测试验证

一般使用AVD Manager创建多个不同大小的模拟器,如果条件具备,也可以直接用真机测试,这个比较靠谱。


http://www.ppmy.cn/devtools/152832.html

相关文章

基于python+Django+mysql鲜花水果销售商城网站系统设计与实现

博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

GDB相比IDE有什么优点

GDB(GNU Debugger)相比于集成开发环境(IDE)具有一些独特的优点,主要体现在其灵活性、可定制性和低级控制能力。具体来说,GDB有以下几个优点: 1. 轻量级且无依赖 GDB是一个命令行工具,不依赖于任何复杂的图形界面或大型库,这使得它非常适合在资源受限的环境中使用,比…

前k个高频元素力扣--347

目录 题目 思路 代码 题目 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2]示例 2: 输入: nums [1], k 1 输出: [1] 提示&#xff1a; 1 <…

PortSwigger靶场练习---网页 LLM 攻击:利用LLM API 的漏洞

网页 LLM 攻击&#xff1a; Exploiting vulnerabilities in LLM APIs 利用LLM API 的漏洞 PortSwigger靶场地址&#xff1a; Dashboard | Web Security Academy - PortSwigger 题目&#xff1a; 官方提示&#xff1a; 从实验室主页点击实时聊天。 询问LLM它有权访问哪些 API…

yolov11 推理保存json

目录 yolov11 推理保存json 推理图片目录: yolov11 推理保存json import glob import json import os import shutilimport cv2 import timeimport numpy as np import torch# import torch from ultralytics import YOLOmodel = YOLO(r"yolo11x.pt")dir_path = …

神经网络:什么是交叉熵?

在机器学习和深度学习中&#xff0c;交叉熵&#xff08;Cross Entropy&#xff09; 是一种常见的损失函数&#xff0c;特别适用于分类问题。尽管这个术语听起来可能有点复杂&#xff0c;但通过一个类比&#xff0c;我们可以更直观地理解它的含义和作用。 类比场景&#xff1a;…

Mac 刷题环境配置

Mac 刷题环境配置 这篇博文主要记录自己为了更方便的在 Mac 上写算法题&#xff0c;主要是基于 Clion做的一些环境配置&#xff1b;有些操作其实在 Windows &#xff0c;Linux 下也是通用的&#xff0c;如果看到的小伙伴也可以结合自己的情况参考。 Clion 插件 推荐一下这个插件…

Java 的对象序列化与反序列化

目录 一、什么是对象序列化与反序列化 二、为何需要对象序列化与反序列化 三、Java 中如何实现对象序列化与反序列化 1. 简单对象的序列化与反序列化 2. 处理静态成员与瞬态成员 四、自定义序列化与反序列化逻辑 五、对象序列化与反序列化的注意事项 六、总结 在 Java …