获取手机屏幕密度dpi和对应的资源文件夹
2016-06-24 16:26
246 查看
1、首先看一下像素密度对应的Android资源文件夹
dpi范围
2.效果图
![](https://img-blog.csdn.net/20160624163423333?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
3.主要的代码
比如我的手机屏幕密度是xxhdpi,那么xxhdpi文件夹下的图片就是最适合的图片。因此,如果xxhdpi文件夹下有这张图就会优先被使用,在这种情况下,图片是不会被缩放的。但是,如果xxhdpi文件夹下没有这张图时,系统就会自动去其它文件夹下找这张图了,优先会去更高密度的文件夹下找这张图片,如果还是没有资源图片,接下来会尝试再找更高密度的文件夹,发现没有更高密度的了,这个时候会去nodpi文件夹找这张图,发现也没有,那么就会去更低密度的文件夹下面找,依次是xhdpi
-> hdpi -> mdpi -> ldpi。
总体匹配规则就是这样,那么比如说现在终于在mdpi文件夹下面找到图了,但是系统会认为你这张图是专门为低密度的设备所设计的,如果直接将这张图在当前的高密度设备上使用就有可能会出现像素过低的情况,于是系统自动帮我们做了这样一个放大操作。
那么同样的道理,如果系统是在xxxhdpi文件夹下面找到这张图的话,它会认为这张图是为更高密度的设备所设计的,如果直接将这张图在当前设备上使用就有可能会出现像素过高的情况,于是会自动帮我们做一个缩小的操作。
但实际情况是,公司的UI们通常就只会给一套图片资源,想让他们针对每种密度的设备都设计一套图片资源,并且还是按照我们上面讲的缩放比例规则来设计,就有点想得太开心了。没错,这个就是现实情况,那么在这种情况下,我们应该将仅有的这一套图片资源放在哪个密度的文件夹下呢?
可以这样来分析,根据我们刚才所学的内容,如果将一张图片放在低密度文件夹下,那么在高密度设备上显示图片时就会被自动放大,而如果将一张图片放在高密度文件夹下,那么在低密度设备上显示图片时就会被自动缩小。那我们可以通过成本的方式来评估一下,一张原图片被缩小了之后显示其实并没有什么副作用,但是一张原图片被放大了之后显示就意味着要占用更多的内存了。因为图片被放大了,像素点也就变多了,而每个像素点都是要占用内存的。
dpi范围
密度 | |
0dpi ~ 120dpi | ldpi |
120dpi ~ 160dpi | mdpi |
160dpi ~ 240dpi | hdpi |
240dpi ~ 320dpi | xhdpi |
320dpi ~ 480dpi | xxhdpi |
480dpi ~ 640dpi | xxxhdpi |
3.主要的代码
<span style="font-size:18px;">private TextView mTv_xdpi; private TextView mTv_ydpi; private TextView mTv_dpi; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化控件 initView(); //获取x、ydpi getXydpi(); } /** * @Description:获取x、y的dpi,得到的数据,基本上是一致的 * @author 作者 :likun * @date 创建时间:2016/6/24 16:06 * @parameter : * @return : */ private void getXydpi() { float xdpi = getResources().getDisplayMetrics().xdpi; float ydpi = getResources().getDisplayMetrics().ydpi; mTv_xdpi.setText(xdpi+""); mTv_ydpi.setText(ydpi+""); getDpi(xdpi); } /** * @Description:匹配得到手机的dpi * @author 作者 :likun * @date 创建时间:2016/6/24 16:07 * @parameter : * @return : */ private void getDpi(float xdpi) { String dpi=""; if(xdpi>=0&&xdpi<120){ dpi="ldpi"; }else if(xdpi>=120&&xdpi<160){ dpi="mdpi"; }else if(xdpi>=160&&xdpi<240){ dpi="hdpi"; }else if(xdpi>=240&&xdpi<320){ dpi="xhdpi"; }else if(xdpi>=320&&xdpi<480){ dpi="xxhdpi"; }else if(xdpi>=480&&xdpi<640){ dpi="xxxhdpi"; } mTv_dpi.setText(dpi); } /** * @Description:初始化控件 * @author 作者 :likun * @date 创建时间:2016/6/24 16:03 * @parameter : * @return : */ private void initView() { mTv_xdpi = (TextView) findViewById(R.id.tv_xdpi); mTv_ydpi = (TextView) findViewById(R.id.tv_ydpi); mTv_dpi = (TextView) findViewById(R.id.tv_dpi); }</span>4.开发注意事项
比如我的手机屏幕密度是xxhdpi,那么xxhdpi文件夹下的图片就是最适合的图片。因此,如果xxhdpi文件夹下有这张图就会优先被使用,在这种情况下,图片是不会被缩放的。但是,如果xxhdpi文件夹下没有这张图时,系统就会自动去其它文件夹下找这张图了,优先会去更高密度的文件夹下找这张图片,如果还是没有资源图片,接下来会尝试再找更高密度的文件夹,发现没有更高密度的了,这个时候会去nodpi文件夹找这张图,发现也没有,那么就会去更低密度的文件夹下面找,依次是xhdpi
-> hdpi -> mdpi -> ldpi。
总体匹配规则就是这样,那么比如说现在终于在mdpi文件夹下面找到图了,但是系统会认为你这张图是专门为低密度的设备所设计的,如果直接将这张图在当前的高密度设备上使用就有可能会出现像素过低的情况,于是系统自动帮我们做了这样一个放大操作。
那么同样的道理,如果系统是在xxxhdpi文件夹下面找到这张图的话,它会认为这张图是为更高密度的设备所设计的,如果直接将这张图在当前设备上使用就有可能会出现像素过高的情况,于是会自动帮我们做一个缩小的操作。
但实际情况是,公司的UI们通常就只会给一套图片资源,想让他们针对每种密度的设备都设计一套图片资源,并且还是按照我们上面讲的缩放比例规则来设计,就有点想得太开心了。没错,这个就是现实情况,那么在这种情况下,我们应该将仅有的这一套图片资源放在哪个密度的文件夹下呢?
可以这样来分析,根据我们刚才所学的内容,如果将一张图片放在低密度文件夹下,那么在高密度设备上显示图片时就会被自动放大,而如果将一张图片放在高密度文件夹下,那么在低密度设备上显示图片时就会被自动缩小。那我们可以通过成本的方式来评估一下,一张原图片被缩小了之后显示其实并没有什么副作用,但是一张原图片被放大了之后显示就意味着要占用更多的内存了。因为图片被放大了,像素点也就变多了,而每个像素点都是要占用内存的。
相关文章推荐
- 在.NET中读取嵌入和使用资源文件的方法
- C#编程获取资源文件中图片的方法
- Android中资源文件(非代码部分)的使用概览
- 解析Android资源文件及他们的读取方法详解
- Android中主要资源文件及文件夹介绍
- Andriod 资源文件之存取操作
- android从资源文件中读取文件流并显示的方法
- c#使用资源文件的示例
- 过滤Android工程中多余资源文件的解决方法
- Android开发之资源文件用法实例总结
- Android字符串资源文件format方法使用实例
- Android dpi,dip,dp的概念以及屏幕适配
- Android中px dpi dip density densityDpi 的相关说明
- Pixel Perplexities and Other Digital Nonsense
- IOS 如何获取ppi
- spring @Value值读不到,接入disconf后仍然读不到
- Java读取Properties文件的六种方法(转)
- 读取jar包中资源文件的两种方法
- windows资源文件(.rc)是如何变成窗口控件的
- dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换算