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

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

也可以通过代码获取:

1
2
3
4
5
6
       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)方法找图片的

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 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的资源的属性

1
2
3
4
5
6
7
8
9
 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 (按正常图片不缩放 图片放在手机里面 应该不会充满 整个手机) 我把图片放在不同drawable文件夹中

文件夹 加载时间(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层直接加载图片更便捷。

如有错误,请指正。谢谢!

http://my.eoe.cn/474891/archive/10398.html

android开发图片分辨率的更多相关文章

  1. android开发图片分辨率问题解决方案

    dpi是什么呢? dpi是“dot per inch”的缩写,每英寸像素数. 四种密度分类: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (ex ...

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

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

  3. android开发 图片合成

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

  4. Android开发之多媒体编程之加载大分辨率图片

    Android中图片占用内存的大小=图片的总像数*每个像数占用的大小. Android保存图片像素信息使用ARGB,意思是每个像素占用4个字节. 以分辨率为2400*3200的图片来说,加载到Andr ...

  5. 62.Android之各分辨率定义的图片规格

    转载:http://www.nljb.net/default/Android%E4%B9%8B%E5%90%84%E5%88%86%E8%BE%A8%E7%8E%87%E5%AE%9A%E4%B9%8 ...

  6. Android开发中如何解决加载大图片时内存溢出的问题

    Android开发中如何解决加载大图片时内存溢出的问题    在Android开发过程中,我们经常会遇到加载的图片过大导致内存溢出的问题,其实类似这样的问题已经屡见不鲜了,下面将一些好的解决方案分享给 ...

  7. Python 制作Android开发 所需的适配不同分辨率的套图

    使用Python做起工具来还真是爽,简单,方便,快捷.今天忙活了一下,制作出一个比较实用的小工具. 自动化套图制作,适配不同屏幕 尤其是对于android开发来说,要适配不同屏幕就需要多套切图,那么. ...

  8. android开发分辨率适配总结

    重要概念 什么是屏幕尺寸.屏幕分辨率.屏幕像素密度? 什么是dp.dip.dpi.sp.px?他们之间的关系是什么? 什么是mdpi.hdpi.xdpi.xxdpi?如何计算和区分? 在下面的内容中我 ...

  9. Android开发笔记——图片缓存、手势及OOM分析

    把图片缓存.手势及OOM三个主题放在一起,是因为在Android应用开发过程中,这三个问题经常是联系在一起的.首先,预览大图需要支持手势缩放,旋转,平移等操作:其次,图片在本地需要进行缓存,避免频繁访 ...

随机推荐

  1. JavaScript原生对象及扩展

    来源于 https://segmentfault.com/a/1190000002634958 内置对象与原生对象 内置(Build-in)对象与原生(Naitve)对象的区别在于:前者总是在引擎初始 ...

  2. 如何通过Html网页调用本地安卓app?

    如何使用html网页和本地app进行传递数据呢?经过研究,发现还是有方法的,总结了一下,大致有一下几种方式 更新一下吧,这篇日志写于2013年11月,离现在已经很久了,依然很多朋友在查阅.目前应该有更 ...

  3. JDBC连接方式有哪几种

    2011-05-10 目前比较常见的JDBC驱动程序可分为以下四个种类:  (1)JDBC-ODBC桥加ODBC驱动程序  JavaSoft桥产品利用ODBC驱动程序提供JDBC访问.注意,必须将OD ...

  4. spring配置详解-连接池配置

    2010-08-27  一.连接池概述 数据库连接池概述: 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个 应用程序的伸缩性和 ...

  5. Struts2常见配置(草稿)

    Struts2框架配置文件加载的顺序(了解加载配置文件的顺序,重点掌握struts.xml配置文件) 1.Struts2框架的核心是StrutsPrepareAndExecuteFilter过滤器,该 ...

  6. hihocoder234周 计算不包含黑点的矩形个数

    题目链接 问题描述 一个棋盘有n条横线,m条竖线,上面有k个黑点,问有多少个不包含黑点的矩形. 数据范围: n和m最大为1000,k最大为10 方法一:动态规划 复杂度n*m*k. import ja ...

  7. memcached完全剖析--1. memcached的基础

    翻译一篇技术评论社的文章,是讲memcached的连载.fcicq同学说这个东西很有用,希望大家喜欢. 发表日:2008/7/2 作者:长野雅广(Masahiro Nagano) 原文链接:http: ...

  8. php bccomp的替换函数

    if (!function_exists('bccomp')) { /** * 支持正数和负数的比较 * ++ -- +- * @param $numOne * @param $numTwo * @p ...

  9. 微信多客服插件获取openid

    <!doctype html> <html> <head> <meta http-equiv="Content-Type" content ...

  10. 在Hadoop1.2.1上运行第一个Hadoop程序FileSystemCat