700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > android 手机适配之values适配dimen值

android 手机适配之values适配dimen值

时间:2023-10-03 14:49:12

相关推荐

android 手机适配之values适配dimen值

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 的不会.要注意.

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。