android 手机适配之values适配dimen值

article/2025/11/8 7:33:23

android 适配屏幕的方式有很多,最方便最直接的无非就是适配values里的dimens文件值来进行适配.
张鸿洋大神已经写过一篇适配的文章,很详细
但是我在阅读的时候还是有点疑问,这个values-1920x1080到底是dp值还是手机分辨率,因为我在实际操作中发现这样一句话.
这里写图片描述

很明显可以看到在我写的1920 * 1080上方有一句话 Screen dimension in dp ,是不是很奇怪,这里让我们写dp值,我就纳闷了,怎么写?我在网上找了一天,都没有人解释过.所以,我自己来做实验验证一下.我用的手机是三星note3 分辨率 1920 * 1080

DisplayMetrics metric = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(metric); 
int width = metric.widthPixels; // 屏幕宽度(像素) 
int height = metric.heightPixels; // 屏幕高度(像素) 
float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5) 
int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240)

通过上面代码取值 分别为 高度 1920 宽度 1080 屏幕密度 3 屏幕密度dpi 360

我生成了以下的文件包
这里写图片描述

可以看到差不多每种格式的value适配我都生成了一个,里面放的dimens文件

<?xml version="1.0" encoding="utf-8"?>
<resources><dimen name="dp_10">50dp</dimen>
</resources>

每个包下的文件的后面的值都不一样,有的是50 dp 有的是 100dp 等等
我按手机分辨率生成了一个values-1920x1080的包 ,然后根据计算 px = dp*(dpi/160) 可以知道 三星note3的手机的sw是360dp sw是smallest screen width 的缩写.生成values方式可参照第一张图片.里面有很多方式和种类.px 是1080 宽度 dpi 查看可知是480 所以dp = 1080/3 = 360dp.

package com.example.administrator.myapplication;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.Toast;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}private float getDp(int id){float dimen = 0;String string = this.getResources().getString(id).replace("dip", "");dimen = Float.parseFloat(string);return dimen;}public void left(View v ){float dp = getDp(R.dimen.dp_10);Toast.makeText(this,"dp="+dp,Toast.LENGTH_LONG).show();}public void right(View view){DisplayMetrics metric = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(metric);int width = metric.widthPixels; // 屏幕宽度(像素)int height = metric.heightPixels; // 屏幕高度(像素)float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240)System.out.println("width=" + width + "height="+height+"dendity="+density+"densitydpi="+densityDpi);Toast.makeText(this,"width=" + width + "height="+height+"dendity="+density+"densitydpi="+densityDpi,Toast.LENGTH_LONG).show();}
}

两个按钮,分别加上点击事件left right .left 点击事件主要是取出手机适配到的dimens值并吐司,right查看手机的信息.

当我运行程序,点击按钮,弹出的数值是values-sw360dp 包下的dimens文件里的值.因为手机的最小宽度经过换算正好是360dp 当手机的宽度>= 360dp 是就会选择这个包下的.它只会选若屏幕宽度达到sw480 dp 则会选择这个包下的. 我们进一步实验,我删除sw360dp的包,继续运行程序,发现吐司出的数值是values-sw320dp包下的dimens里的值,说明这个选择是向下的,并且sw的等级很高.先匹配这个选项.xxxhdpi 和 values-1920x1080里的文件都没有被选择.
我继续删除values-sw320dp包 运行程序,发现吐司的数值为xxxhdpi下的dimens里的数值,再删除xxxhdpi 包, 运行,这时打印的是values-1920x1080 包下dimens里的值,这也进一步说明 了这个1920x1080就是分辨率而并非 screen dimension in dp ,不知道是不是谷歌的失误.造成了一个误区.这里大家记住,这个就是分辨率就对了,不是dp值.
继续删除values-1920x1080 这个包.运行,.吐司出的值是values-1024x600 里的dimens的数值.说明这种匹配也是向下匹配的.

好了 ,现在已经很清晰了.还有一点要说,values-sw xx dp 这种格式是3.2 版本引入的 values xxxx*xxxx 分辨率的样式好像还要晚一点,如果有版本适配的需要注意不能用,否则系统不识别这个,还是用values-w xxx dp 这种.不过这种方式取值,在屏幕进行翻转后会发生变化,而sw 的不会.要注意.

如果有不当之处欢迎指出,大家一起学习.


http://chatgpt.dhexx.cn/article/5AjUW6Kc.shtml

相关文章

Android开发——AS插件批量解决XML中的String/Color/Dimen硬编码

1. 问题抛出 1.1 开发方面 对于日常开发中&#xff0c;每写一个"#333"&#xff0c;都要手动的在当前xml与colors.xml中来回切换&#xff0c;查看是否已经定义过&#xff0c;如果定义过则拿过来复用&#xff0c;如果没有就要新定义一个叫"#333"的资源名&a…

dimen.xml浅析

转自&#xff1a;http://blog.csdn.net/kazeik/article/details/8268721 有时候我们为了维护一个工程&#xff0c;或者想定义一个button样式&#xff0c;或textView样式&#xff0c;这些样式中包含着文字的大小&#xff0c;背景图片&#xff0c;前置图片等一些资源。而且这个…

android:屏幕自适应之dimen使用

From&#xff1a;4种必须知道的Android屏幕自适应解决方案&#xff08;求投票支持&#xff09; demo下载&#xff1a;http://www.eoeandroid.com/forum.php?modattachment&aidNjE0Njh8ZTIyZDA2M2N8MTMzODgyOTQxN3w1NzAwOTV8MTczOTcz 以下是Demo首页的预览图 一、细说 layo…

android屏幕适配,生成不同分辨率的dimen.xml文件

1.在项目下新建moudle&#xff0c;选择Java Library&#xff0c;如图&#xff1a; 2.编写工具类&#xff1a; public class DimenUtils {//文件保存的路径 是在该项目下根路径下创建 比如该项目创建的路径是C:\MyProject\&#xff0c;// 则保存的文件路径是C:\MyProject\Di…

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

由于目前流行的Android屏幕分辨率太多&#xff0c;再加上UI同事设计时经常使用px单位来设计&#xff0c;所以导致编写Android代码时适配是一个很大的问题。 以下是本人开发过程中的适配方案 仅供参考 附&#xff1a;目前手机主流分辨率列表&#xff1a;http://screensiz.es/pho…

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函…