Android:不同drawable文件夹的区别

4.0后,新建android工程,会自动生成drawable,drawalbe-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi,drawable-xxhdpi六个文件夹,除drawable外,其他5个文件夹对应四种级别的density:120dip(low),160dip(medium),240dip(high),320dip(xhigh),480dip(drawable-xxhdpi)。目前主流做法都是把图片文件放在drawable-hdpi文件夹内,和图片相关的xml文件(如按钮xml,用以在按钮点击时显示不同的背景图片效果)放在drawable文件夹内。

所谓density,是指屏幕上的像素密度,以160dip为标准密度。举例来说,当我们在布局文件layout.xml中放置一个View

  <View
           android:layout_height="1dip"
           android:layout_width="100dip"/>

该View在密度为160dip的屏幕上显示的长度为100px(像素)长,而在320dip的屏幕上它的长度将为200px。

而当图片处于drawable文件夹内时,也需要做这种转换。假如在drawable-mdpi的文件夹内有一张22*44的图片,通过程序将其读入系统中时,假设屏幕密度为320dip,那它在内存中的大小将是44*88。

前面说过,目前主流做法是将图片放置在drawable-hdpi文件夹内,该文件夹对应的density是240dip,但其实现在的手机一般都是320dip甚至480dip了,所以放置在hdpi文件夹内的图片在显示时都是已经自动拉伸过了。

还有个问题,当直接读取sd卡或assert文件夹内的图片时,图片的大小是怎么样的呢?当我们读取sd卡内的图片时,我们首先获取的不是drawbale对象而是个bitmap对象,该bitmap对象的width和height对应的是图片的真实像素大小。而将bitmap对象转换为drawable时,除非我们手动设置了目标density,否则不进行缩放。

BitmapDrawable bmpDrawable = new BitmapDrawable(bitmap);

使用这个构造函数,默认的density是160,该构造函数已经被摒弃了,推荐使用下一个

BitmapDrawable bmpDrawable = new BitmapDrawable(getResources(),bitmap);

该构造函数会通过getResources获取到手机的density,将其设置为默认的density。

getResources().getDisplayMetrics().densityDpi

若我们需要进行缩放,可以通过下述方法设置目标density。

bmpDrawable.setTargetDensity(160)

在320dip长度的屏幕上,该bmpDrawable将会缩小为一半。

注:我原先以为 new BitmapDrawable(getResources(),bitmap)这个构造函数是为了将图片根据当前屏幕密度进行缩放。如屏幕密度为320dip时,在用了该构造函数后图片会自动放大1倍(Bitmap对象默认的density是160),但认真看了源码后发现,该方式是为了修改默认的density,即将160改为了320,之后再通过setTargetDensity方法设置真正需要缩放的密度。关于这点我实在想不到它的应用场景,感觉很不合理。

时间: 2024-12-18 05:12:35

Android:不同drawable文件夹的区别的相关文章

Android学习笔记之Drawable 文件夹

PS:最近闲着无聊..模仿去写个QQapp..效果还不错..并且从中又学习到了一些相关的东西,在这里进行一些相关总结.. 学习内容: Android 中 Drawable 文件夹内部相关属性..     Android项目的项目结构我们算是再熟悉不过了..但是仅仅知道有什么结构远远是不够的,能够熟练的去运用其中的内部属性才是重要的..项目结构就不得不说一下Drawable文件中的相关属性了..言归正传..首先说一下anim.. 1.anim.xml   anim.xml..通过这个xml文件,我

关于Android中图片大小、内存占用与drawable文件夹关系的研究与分析

从上一篇文章<Android屏幕适配全攻略>写完之后,经常会有朋友问我这个问题:"能不能一个App只提供一套切图适应所有的分辨率呢?"我觉得有必要写一篇文章来研究一下这个问题,所以就有了这篇文章. 研究内容 研究方法 测试环境 研究过程 结果分析 结论 另外一个难以解释的问题 研究内容 本篇内容主要探讨以下场景:同一张图片,放置在不同的drawable文件夹,在同一设备上运行,对图片大小及内存占用有什么影响. 研究方法 控制变量法 分析法 测试环境 采用锤子T1手机(108

(转)Android 之自定义控件样式在drawable文件夹下的XML实现

Android自定义控件样式在drawable文件夹下的XML中,在布局文件中通过设置控件的background属性达到效果. 一.控件常见状态: 在XML文件中用到了selector节点,selector可以理解为状态切换器,不同的状态下切换不同的样式,各种状态用Item节点表示,以下为一些常见的状态 (注意:statelist中第一个匹配当前状态的item会被使用.因此,如果第一个item没有任何状态特性的话,那么它将每次都被使用,这也是为什么默认的值必须总是在最后,各种状态可以交叉使用):

Android Drawable文件夹对应像素密度

Android是自适应屏幕大小及密度的.Android为了保证在不同屏幕下的应用界面效果,提供了以下文件夹来储存图片资源.不同的文件夹对应像素密度不同的图片资源 drawable-ldpi:120dpi左右的屏幕(低密度) drawable-mdpi:160dpi左右的屏幕(中等密度) drawable-tvdpi:213dpi左右的屏幕(中高密度)这个主要在api13中为了优化面向电视的应用程序而引入的. drawable-hdpi:240dpi左右的屏幕(高密度) drawable-xdpi

Android开发系列(十八):自定义控件样式在drawable文件夹下的XML实现

在Android开发的过程中,我们经常需要对控件的样式做一下改变,可以通过用增加背景图片的方式进行改变,但是背景图片放多了肯定会使得APK文件变的很大. 我们可以用自定义属性shape来实现. shape: gradient   -- 对应颜色渐变. startcolor.endcolor就不多说了. android:angle 是指从哪个角度开始变. solid      --  填充. stroke   --  描边. corners  --  圆角. padding   -- 定义内容离边

Android工程文件下assets文件夹与res文件夹的区别

1.assets:不会在R.java文件下生成相应的标记,assets文件夹可以自己创建文件夹,必须使用AssetsManager类进行访问,存放到这里的资源在运行打包的时候都会打入程序安装包中, 2.res:会在R.java文件下生成标记,这里的资源会在运行打包操作的时候判断哪些被使用到了,没有被使用到的文件资源是不会打包到安装包中的. res/raw和assets文件夹来存放不需要系统编译成二进制的文件,例如字体文件等 在res文件夹下还可以定义一下目录: res/anim:这里存放的是动画

Android应用开发多语言drawable文件夹

Android程序多语言的支持是就该Value文件夹不同国家的区分,前面文档有介绍相对应的国家名称Value如何写 如下说下多语言图片的替换也是就该图片目录文件夹drawable文件夹如下: Background image Destination folder in project workspace Italian drawable-it-rIT/background.png French drawable-fr-rFR/background.png French (Canada) draw

Android 适配(drawable文件夹)图片适配(二)

参考自(https://blog.csdn.net/myoungmeng/article/details/54090891) Android资源文件存放: android的drawable文件一共可以有: drawable-ldpi(低密度)               drawable-mdpi(中等密度)              drawable-hdpi(高密度)         drawable-xhdpi(超高密度) drawable-xxhdpi(超超高密度)     drawab

Android Studio 复制粘贴图片到drawable文件夹没有效果 - 解决方法

我想放一些图片到drawable文件夹里面,但是简单的复制文件,粘贴文件,或者拖拽文件,都不起作用.不知道为什么,之前是可以的,突然就不行了. 解决方案 在drawable文件夹的目录上右键,选择Reveal in Finder,打开drawable文件夹,再把图片复制粘贴或拖拽进来就可以啦.