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. C# ref和out的区别

    首先:两者都是按地址传递的,使用后都将改变原来参数的数值. 其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所 ...

  2. oracle 索引失效原因

    转自  http://www.cnblogs.com/orientsun/archive/2012/07/05/2577351.html Oracle 索引的目标是避免全表扫描,提高查询效率,但有些时 ...

  3. c语言将2进制数转化为10进制数(栈的初始化,进栈,出栈)

    //c语言描述 将2进制转化为10进制 #include <stdio.h> #include <stdlib.h> #include <math.h> #defi ...

  4. 学习总结 html一般标签的使用

    body的属性: bgcolor 页面背景色 background  背景壁纸.图片 text  文字颜色 topmargin  上边距 leftmargin   左边距 rightmargin 右边 ...

  5. awk中怎么比较字符串??

    awk -vOFS="_" '{print $1,$2,$3} http://bbs.chinaunix.net/thread-1099655-1-1.html

  6. Loadrunner:安装LR11.0破解步骤及License

    破解步骤: 1.关闭LR相关程序 2.运行LicenseDelete程序,清除LR原来的License 3.将lm70.dll和mlr5lprg.dll这两个文件复制并粘贴到LR安装目录下的bin文件 ...

  7. CSS设计之页面滚动条出现时防止页面跳动的方法

    一.水平居中布局与滚动条跳动的千年难题 当前web届,绝大多数的页面间布局都是水平居中布局,主体定个宽度,然后margin: 0 auto的节奏~ 例如,大淘宝的首页: 然而,这种布局有一个存在一个影 ...

  8. Apache实现Web Server负载均衡

    修改服务器A上apache的http.conf文件: 首先,加载相应的代理模块,去掉以下模块前面的#号: LoadModule proxy_module modules/mod_proxy.soLoa ...

  9. JS正则表达式使用方法及示例

    1.定义正则表达式: a.普通方式:var reg=/表达式/附加参数 附件参数: g:代表可以进行全局匹配.i:代表不区分大小写匹配.m:代表可以进行多行匹配. 上面三个参数,可以任意组合,代表复合 ...

  10. C# 判断一字符串是否为合法数字(正则表达式)

    判断一个字符串是否为合法整数(不限制长度) public static bool IsInteger(string s) { string pattern = @"^\d*$"; ...