dpi是什么呢? dpi是“dot per inch”的缩写,每英寸像素数。 四种密度分类: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high) 一般情况下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。

dpi计算公式 DPI=对角线的像素值/尺寸

手机屏幕分辨率和屏幕密度是两码事!并不是800*480的分辨率手机图片就应该放在hdpi文件夹中。5.0英寸 800*480属于mdpi

也可以通过代码获取:

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) android会根据屏幕本身的尺寸与密度特性,自动载入对应的资源,并把它们从逻辑像素(DIP,用于定义界面布局)转换成屏幕上的物理像素。

首先看看 系统是如何通过Resources的getDrawable(int id)方法找图片的

public Drawable getDrawable(int id) throws NotFoundException {         TypedValue value;         synchronized (mAccessLock) {             value = mTmpValue;             if (value == null) {                 value = new TypedValue();             } else {                 mTmpValue = null;             }             getValue(id, value, true);         }         Drawable res = loadDrawable(value, id);         synchronized (mAccessLock) {             if (mTmpValue == null) {                 mTmpValue = value;             }         }         return res;     }   TypedValue 我们可以理解为存储数据的类型,主要被Resouces使用于持有的资源值 通过getValue(id,value,true)方法去得到该id的资源的属性

public void getValue(int id, TypedValue outValue, boolean resolveRefs)             throws NotFoundException {         boolean found = mAssets.getResourceValue(id, 0, outValue, resolveRefs);         if (found) {             return;         }         throw new NotFoundException("Resource ID #0x"                                     + Integer.toHexString(id));     }   最后通过loadDrawable(value, id)得到drawable,该方法到了底层的C代码,大致意思就是通过TypedValue中的方法和属性就可以获得我们想要的属性值,然后加载图片

OK,下面来做个实验.

试验一: 手机是1280*720 4.3英寸 属于xdpi 图片分辨率为960*640 (按正常图片不缩放 图片放在手机里面 应该不会充满 整个手机) 我把图片放在不

文件夹 加载时间(ms) 图片显示 说明

drawable 311 充满屏幕 图片有拉伸

drawable-nodpi 130 未充满屏幕 图片显示正常

drawable-ldpi 442 充满屏幕 图片有拉伸

drawable-mdpi 383 充满屏幕 图片有拉伸

drawable-hdpi 226 充满屏幕 图片有拉伸

drawable-xhdpi 109 未充满屏幕 图片显示正常

试验二: 手机是800*480 4.3英寸 属于hdpi 图片分辨率为960*640 (按正常图片不缩放 图片放在手机里面 应该充满 整个手机) 我把图片放在不同drawable文件夹中

文件夹 加载时间(ms) 图片显示 说明

drawable 290 充满屏幕 图片拉伸

drawable-nodpi 127 充满屏幕 图片显示正常

drawable-ldpi 369 充满屏幕 图片拉伸

drawable-mdpi 346 充满屏幕 图片拉伸

drawable-hdpi 124 充满屏幕 图片显示正常

drawable-xhdpi 241 未充满屏幕 图片缩放

得到结论:

drawable-nodpi 中 图片不会被拉伸

系统在得到图片时候,会先到设备对应的dpi的文件夹下去去找资源文件,找到后应该不会做缩放直接返回图片。

如果没有在对应的dpi文件夹中找到,回去其他文件夹中查找,找到后会做相应的缩放。

在高dpi找到的图片会缩放,在低dpi的会拉伸

还有就是 源码中可以看出 loadDrawable的过程实在C层做的。通过系统资源id加载会比java层直接加载图片更便捷。

android开发图片分辨率问题解决方案的更多相关文章

  1. android开发图片分辨率

    一直受到android开发图片分辨率问题困扰.drawable-(xdpi,hdpi,mdpi,ldpi,nodpi)这几个文件夹到底怎么放图片呢? dpi是什么呢? dpi是“dot per inc ...

  2. Android大图片裁剪终极解决方案(上:原理分析)

    转载声明:Ryan的博客文章欢迎您的转载,但在转载的同时,请注明文章的来源出处,不胜感激! :-)  http://my.oschina.net/ryanhoo/blog/86842 约几个月前,我正 ...

  3. Android大图片裁剪终极解决方案 原理分析

    约几个月前,我正为公司的APP在Android手机上实现拍照截图而烦恼不已. 上网搜索,确实有不少的例子,大多都是抄来抄去,而且水平多半处于demo的样子,可以用来讲解知识点,但是一碰到实际项目,就漏 ...

  4. Android开发——View滑动冲突解决方案

    0. 前言   我们在Android开发--事件分发机制详解中深入学习了事件分发机制,为我们解决Android开发中的滑动冲突问题做了初步准备.针对滑动冲突这里给出两种解决方案:外部拦截法和内部拦截法 ...

  5. Android开发各类常见错误解决方案

    本文属于个人平时项目开发过程遇到的一些问题,记录下来并总结解决方案,希望能帮到大家解决问题,有些问题的解决方案是在StackoverFlow上找到的,建议大家遇到问题多去上面找,基本上都能找到解决方案 ...

  6. Android 开发 图片网络缓存加载框架Fresco

    简介 Fresco是一个在Android应用程序中显示图像的强大系统. Fresco负责图像的加载和显示.它将从网络.本地存储或本地资源加载图像,图像加载完成前会显示一个占位图片.它有两个级别的缓存: ...

  7. android开发 图片合成

    private static Bitmap compositeImages(Bitmap srcBitmap,Bitmap dstBitmap){ Bitmap bmp = null; //下面这个B ...

  8. Android大图片裁剪终极解决方案(下:拍照截图)

    http://blog.csdn.net/floodingfire/article/details/8144617 http://mzh3344258.blog.51cto.com/1823534/8 ...

  9. Android开发常用开源框架:图片处理

    https://blog.csdn.net/SGQ_CSDN/article/details/79910709 Android开发常用开源框架:图片处理 框架名称 功能描述 Android Unive ...

随机推荐

  1. NSSet、NSMutableSet

    NSSet和NSArray功能性质一样,用于存储对象,属于集合:只能添加cocoa对象,基本数据类型需要装箱. NSSet . NSMutableSet是无序的集合,在内存中存储方式是不连续的,而NS ...

  2. biji001

    指针对变量使对指向变量的指针&运算符产生,对指针使用*运算符则可以返回到原始变量只要p指向i,那么*p就是i的别名*p不仅仅拥有和i同样的值,而且对*p的改变i的值*p左值,对它赋值合法*p ...

  3. 网络设备模拟器 GNS3

    https://www.gns3.com/support/docs/linux-installation sudo dpkg --add-architecture i386 sudo add-apt- ...

  4. JQ仿select框

    点击[cy_title]后弹出[cy_list]层,选中里面的元素把值赋给 [cy_title] 在[cy_list] 打开的时候,点击其他地方可以关闭: HTML: <div class=&q ...

  5. php实现树状结构无级分类

    php实现树状结构无级分类   ).",'树2-1-1-2')";mysql_query($sql);?>

  6. Linux:一台apache服务器上部署多个项目的apache配置

    第一步: 将代码取到/var/www/html目录下(此为默认目录,具体看apache的设置):该目录下可以放多个项目,如: [root@www html]# pwd/var/www/html[roo ...

  7. 中间人攻击破解HTTPS传输内容

    最近App安全受到不小的關注,有人問我,說某某App不安全,究竟是真的還假的啊...所謂有被攻擊的風險,是不是危言聳聽,只是為了嚇人來著的? 現在就來為各位說明一下,是怎麼個不安全法.就來說說攻擊是怎 ...

  8. poj1942 Paths on a Grid

    处理阶乘有三种办法:(1)传统意义上的直接递归,n的规模最多到20+,太小了,在本题不适用,而且非常慢(2)稍快一点的算法,就是利用log()化乘为加,n的规模虽然扩展到1000+,但是由于要用三重循 ...

  9. android版猜拳游戏源码分享

    android版猜拳游戏源码分享安卓版猜拳游戏源码,该文件中带有安装测试包的,这个游戏源码比较简单的,现在有两个代码,一个自定义VIEW的,一个就是普通的imageView图片,游戏非常适合一些新手的 ...

  10. C# 集合 — Hashtable 线程安全

    基础知识重要吗?真的很重要. 就在笔者与同事聊天中突然同事提出一个问题,让笔都有点乱了手脚(有点夸张),题目是这样的: 问:Hashtable 是线程安全的吗? 答:…… (沉默中,Yes Or No ...