Android 屏幕适配之屏幕分辨率(创建不同dimen)适配

article/2025/11/8 7:24:12

由于目前流行的Android屏幕分辨率太多,再加上UI同事设计时经常使用px单位来设计,所以导致编写Android代码时适配是一个很大的问题。

 

 

以下是本人开发过程中的适配方案 仅供参考

 

 

附:目前手机主流分辨率列表:http://screensiz.es/phone

 

 

屏幕适配一般原则

 

1.多用 match_parent

 

2.多用 weight+LinearLayout

 

3.动态获取屏幕分辨率及密度动态设置宽高(如下)

 

获取屏幕宽度 高度 单位px

    private void getDisplayWidthHeight() {DisplayMetrics displayMetrics = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);int width = displayMetrics.widthPixels;int height = displayMetrics.heightPixels;}

 

 

获取屏幕分辨率 160->1 240->1.5 320->2 480->3

    private void getDisplayDensity() {DisplayMetrics displayMetrics = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);float density = displayMetrics.density;}

 

java代码动态设置textview高度

int h=height/10;//屏幕高度的10分之一RelativeLayout.LayoutParams pa=new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, h);textview.setLayoutParams(pa);

 

这样显然比较麻烦。。。

 

 

4.百分比的引入 以下是效果图

 

Eclipse 开发工具

 

 

 

 

 

Android Studio 开发工具

 

上图说明

 

即在res/文件夹下建立不同的values文件夹(高X宽(大数在前))不同的values文件夹下有相同的dimens.xml文件。相同的dimens.xml文件中有相同的名称

 

举例

 

比如480*320的分辨率为基准

宽度为320,将任何分辨率的宽度分为320份,取值为x1-x320

高度为480,将任何分辨率的高度分为480份,取值为y1-y480

 

 

 

480X320(基准)

X1->1.0px; Y1->1.0px

X2->2.0px; Y2->2.0px

X3->3.0px; Y3->3.0px

...

800X480(按比例)(高800是基准高480的1.67倍,宽1.5倍)

X1->1.5px; Y1->1.67px

X2->3.0px; Y2->3.34px

X3->4.5px; Y3->5.01px

...

其他尺寸以此类推

 

使用时直接按照UI同事的设计图即可,比如:一个Button 宽20px 高30px 

写代码时直接 x20和y30即可。

 

 

利用工具类生成各个分辨率的文件夹

 

工具类代码 

package wjn.com.imwithdemo.utils;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;public class GenerateValueFiles {private int baseW;private int baseH;private String dirStr = "./res";private final static String WTemplate = "<dimen name=\"x{0}\">{1}px</dimen>\n";private final static String HTemplate = "<dimen name=\"y{0}\">{1}px</dimen>\n";/*** {0}-HEIGHT*/private final static String VALUE_TEMPLATE = "values-{0}x{1}";private static final String SUPPORT_DIMESION ="320,480;"+ "480,800;"+ "480,854;"+ "540,960;"+ "600,1024;"+ "720,1184;"+ "720,1196;"+ "720,1280;"+ "768,1024;"+ "800,1280;"+ "1080,1812;"+ "1080,1920;"+ "1440,2560;";private String supportStr = SUPPORT_DIMESION;public GenerateValueFiles(int baseX, int baseY, String supportStr) {this.baseW = baseX;this.baseH = baseY;if (!this.supportStr.contains(baseX + "," + baseY)) {this.supportStr += baseX + "," + baseY + ";";}this.supportStr += validateInput(supportStr);System.out.println(supportStr);File dir = new File(dirStr);if (!dir.exists()) {dir.mkdir();}System.out.println(dir.getAbsoluteFile());}/*** @param supportStr            w,h_...w,h;* @return*/private String validateInput(String supportStr) {StringBuffer sb = new StringBuffer();String[] vals = supportStr.split("_");int w = -1;int h = -1;String[] wh;for (String val : vals) {try {if (val == null || val.trim().length() == 0)continue;wh = val.split(",");w = Integer.parseInt(wh[0]);h = Integer.parseInt(wh[1]);} catch (Exception e) {System.out.println("skip invalidate params : w,h = " + val);continue;}sb.append(w + "," + h + ";");}return sb.toString();}public void generate() {String[] vals = supportStr.split(";");for (String val : vals) {String[] wh = val.split(",");generateXmlFile(Integer.parseInt(wh[0]), Integer.parseInt(wh[1]));}}private void generateXmlFile(int w, int h) {StringBuffer sbForWidth = new StringBuffer();sbForWidth.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");sbForWidth.append("<resources>");float cellw = w * 1.0f / baseW;System.out.println("width : " + w + "," + baseW + "," + cellw);for (int i = 1; i < baseW; i++) {sbForWidth.append(WTemplate.replace("{0}", i + "").replace("{1}",change(cellw * i) + ""));}sbForWidth.append(WTemplate.replace("{0}", baseW + "").replace("{1}",w + ""));sbForWidth.append("</resources>");StringBuffer sbForHeight = new StringBuffer();sbForHeight.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");sbForHeight.append("<resources>");float cellh = h * 1.0f / baseH;System.out.println("height : " + h + "," + baseH + "," + cellh);for (int i = 1; i < baseH; i++) {sbForHeight.append(HTemplate.replace("{0}", i + "").replace("{1}",change(cellh * i) + ""));}sbForHeight.append(HTemplate.replace("{0}", baseH + "").replace("{1}",h + ""));sbForHeight.append("</resources>");File fileDir = new File(dirStr + File.separator+ VALUE_TEMPLATE.replace("{0}", h + "")//.replace("{1}", w + ""));fileDir.mkdir();File layxFile = new File(fileDir.getAbsolutePath(), "lay_x.xml");File layyFile = new File(fileDir.getAbsolutePath(), "lay_y.xml");try {PrintWriter pw = new PrintWriter(new FileOutputStream(layxFile));pw.print(sbForWidth.toString());pw.close();pw = new PrintWriter(new FileOutputStream(layyFile));pw.print(sbForHeight.toString());pw.close();} catch (FileNotFoundException e) {e.printStackTrace();}}public static float change(float a) {int temp = (int) (a * 100);return temp / 100f;}public static void main(String[] args) {int baseW = 720;int baseH = 1280;String addition = "";try {if (args.length >= 3) {baseW = Integer.parseInt(args[0]);baseH = Integer.parseInt(args[1]);addition = args[2];} else if (args.length >= 2) {baseW = Integer.parseInt(args[0]);baseH = Integer.parseInt(args[1]);} else if (args.length >= 1) {addition = args[0];}} catch (NumberFormatException e) {System.err.println("right input params : java -jar xxx.jar width height w,h_w,h_..._w,h;");e.printStackTrace();System.exit(-1);}new GenerateValueFiles(baseW, baseH, addition).generate();}}

 

 

 

运行此Java代码 就可以在指定文件夹下得到相应的values文件夹

 

 

 

将res文件夹里的所有文件拷贝到项目中res文件夹下即可

 

 

在xml文件中使用

TextViewandroid:id="@+id/activity_main_textview"android:layout_width="@dimen/x102"android:layout_height="@dimen/y100"android:text="@string/hello_world"android:gravity="center"android:background="#FF0000" />

 

 

 

注意以上Java 工具类代码

 

 

1.代码

private static final String SUPPORT_DIMESION =
"320,480;"
+ "480,800;"
+ "480,854;"
+ "540,960;"
+ "600,1024;"
+ "720,1184;"
+ "720,1196;"
+ "720,1280;"
+ "768,1024;"
+ "800,1280;"
+ "1080,1812;"
+ "1080,1920;"
+ "1440,2560;";

此处可以添加 你自己要适配的机型。

 

 

2.代码

public static void main(String[] args) {int baseW = 720;int baseH = 1280;String addition = "";try {if (args.length >= 3) {baseW = Integer.parseInt(args[0]);baseH = Integer.parseInt(args[1]);addition = args[2];} else if (args.length >= 2) {baseW = Integer.parseInt(args[0]);baseH = Integer.parseInt(args[1]);} else if (args.length >= 1) {addition = args[0];}} catch (NumberFormatException e) {System.err.println("right input params : java -jar xxx.jar width height w,h_w,h_..._w,h;");e.printStackTrace();System.exit(-1);}new GenerateValueFiles(baseW, baseH, addition).generate();}

 

此处可以设置你的标准(一般为你的UI同时切图的基准)

 

 

 

注意:

 

本人用了一款测试机(华为P7)

手机设置中查看手机的分辨率是1080X1920 可是在写

xml布局时并没有加载values-1920x1080下相应的dimen

 

查阅了资料才知道 有的手机实际分辨率和设置说明的分辨率是有差距的 比如我的p7 说是 1080X1920.其实代码获取的分辨率是values-1776x1080(设置中显示的分辨率可能包括虚拟的导航栏) 希望有所帮助!!!


http://chatgpt.dhexx.cn/article/SuxhG2pN.shtml

相关文章

Android dimen

转自&#xff1a;Android&#xff1a;dimen尺寸资源文件的使用 dimen.xml在values文件夹下面 <resources><!-- Default screen margins, per the Android Design guidelines. --><dimen name"btn_width">16dp</dimen><dimen name"bt…

Android开发-手机适配之dimen

1.dimen概念 dimen是用来定义尺寸的资源文件&#xff0c;默认路径&#xff1a;工程的res\values\dimens.xml&#xff0c;如下图所示&#xff1a; 做好dimens适配后的项目结构如下图所示&#xff1a; 2.dimen定义的尺寸资源作用 可以在res下创建不同分辨率的values目录&#xff…

APP性能之终端兼容优化分享

一、细说 layout_weight 目前最为推荐的Android多屏幕自适应解决方案。 该属性的作用是决定控件在其父布局中的显示权重&#xff0c;一般用于线性布局中。其值越小&#xff0c;则对应的layout_width或layout_height的优先级就越高&#xff0c;一般横向布局中&#xff0c;决定的…

展开说说:Android之dimens文件使用

一 创建文件 选中res - 右击 - new - Android Resource File&#xff0c;文件名填写dimens、type选择Values&#xff08;默认&#xff09;点击ok。 二 文件填写内容 在dimens.xml写入内容&#xff0c;比如字号、宽高 三 布局文件使用 demin/ 加 dimen的name属性即可使用其定…

符号执行-Angr

目录 预备知识1.关于Angr 实验目的实验环境实验步骤一实验步骤二实验步骤三 预备知识 1.关于Angr Angr是一个利用python开发的二进制程序分析框架&#xff0c;我们可以利用这个工具尝试对一些CTF题目进行符号执行来找到正确的解答&#xff0c;即flag。当然&#xff0c;要注意…

Angr 03_angr_symbolic_registers 多个输入的寄存器符号化

直接打开程序&#xff0c;发现要输入三个字符串。 用IDA打开程序&#xff0c;get_user_input把三个输入分别放入寄存器eax、ebx、edx。我们需要跳过输入这一步&#xff0c;直接让Angr把用符号向量来代替输入字符串。因此&#xff0c;我们需要改变程序入口&#xff0c;直接跳转…

angr 9二进制分析的常见问题集锦

问题&#xff1a; 用angr的库函数识别api去分析blob的二进制文件&#xff0c;报错。 AttributeError: ‘SimOS’ object has no attribute ‘syscall_library’ 原因&#xff1a; angr库函数识别不支持非CGC的二进制文件。 参考链接&#xff1a; https://github.com/angr/ang…

CTF 逆向工具angr的学习笔记

angr 概述如何学习题目列表00_angr_find01_angr_avoid02_angr_find_condition03_angr_symbolic_registers04_angr_symbolic_stack05_angr_symbolic_memory06_angr_symbolic_dynamic_memory07_angr_symbolic_file08_angr_constraints09_angr_hooks10_angr_simprocedures11_angr_…

angr初探

angr 安装与简单使用 介绍 angr 总结来说&#xff0c;angr用于逆向工程中进行二进制分析的一个python框架 具体介绍见其github主页angr 符号执行 符号执行 &#xff08;Symbolic Execution&#xff09;是一种程序分析技术。其可以通过分析程序来得到让特定代码区域执行的输…

Angr_ctf

Angr_ctf&#xff1a;1~13练习 文章目录 Angr_ctf&#xff1a;1~13练习#、angr 入门00_angr_find&#xff08;1&#xff09;总结&#xff08;2&#xff09;练习 01_angr_avoid&#xff08;1&#xff09;总结&#xff08;2&#xff09;练习 02_angr_condition&#xff08;1&…

Angr CTF 从入门到入门(1)

angr是一个很厉害的二进制分析工具&#xff0c;能够实现很多自动化的逆向工作。最近正在学习&#xff0c;在看文档的时候发现了有个angrCTF的实战可以练习angr。 angrCTF:http://angr.oregonctf.org/ angr文档&#xff1a;https://docs.angr.io/ 这篇文章会是这个系列的第一篇文…

angr的windows安装——萌新

window10中符号执行&#xff08;angr&#xff09;的安装——小白篇 最近做题的时候遇到了一些需要使用angr来完成的题目&#xff0c;之后在网上搜了好久发现大多是Linux以及其它系统的angr安装教程。windows系统的安装方法几乎没有。身为一个萌新&#xff0c;猜测同类们应该也会…

Angr 安装

1、安装必要的软件环境 sudo apt-get install python3-dev libffi-dev build-essential virtualenvwrapper 2、开始正式安装angr mkvirtualenv --python$(which python3) angr && pip install angr 3、遇到 mkvirtualenv: command not found 问题 在终端执行以下命…

Angr 01 avoid 忽略的条件

01_angr_avoid无法反编译主函数&#xff0c;模块比较多&#xff0c;加上avoid过滤条件之后&#xff0c;就没那么慢了。 import angr …

图解angr中两种CFG的区别

angr里提供两种CFG的生成&#xff0c;一种是CFGFast&#xff0c;一种是CFGEmulated。这两种究竟有什么不同呢&#xff1f; 本文主要是用图来说明下这个问题。可能回答的不是很完整。 CFGFast这种CFG生成的比较快&#xff0c;但是没有考虑上下文关系。比如函数A调用了printf函…

Angr 02_angr_find_condition 根据输出状态条件搜索正确输入

explore的find和avoid支持函数作为参数&#xff0c;根据函数返回值来判断是否成功。Angr把状态传入了函数&#xff0c;从而判断成功与否。 import angr import sysdef main(argv):path_to_binary argv[1]project angr.Project(path_to_binary)initial_state project.factor…

angr的安装

ubuntu要先安装pip&#xff0c;ANGR官方给出的为pip命令pip install angr&#xff1b; 就算将pip改为apt-get 也不行。 借鉴Ubuntu安装pip的安装方式&#xff0c;安装pip&#xff0c;然后运行pip install angr&#xff0c;结束。 angr安装完后&#xff0c;要安装图形生成插件…

angr 学习笔记

附件&#xff0c;参考1&#xff0c;参考2 符号执行原理 基本概念 即初始参数用变量代替&#xff0c;模拟程序执行过程&#xff0c;维护执行到各个位置时的状态&#xff08;用各个变量之间的代数关系表示&#xff09;。 符号状态&#xff08;Symbolic State&#xff09; 当前…

利用angr获取CFG

静态二进制分析中&#xff0c;对于程序控制流图CFG的计算是很基础且重要的一步&#xff0c;很多的分析是要建立在CFG的基础上。angr作为二进制分析工具&#xff0c;当然提供了CFG功能&#xff0c;下面我们就来探索下要如何使用angr计算CFG&#xff0c;以及其中的坑。 angr中的…

Angr 内存符号化 05_angr_symbolic_memory

说明 通过查看下面的源码或IDA汇编&#xff0c;可知此例需要输入4个输入字符串&#xff0c;给每个输入字符串赋值给了user_input数组这块已经开辟的内存空间&#xff0c;我们可以监测user_input在内存中的值来获取最终的答案。 随机生成的源码 #include <stdio.h> #in…