Android 资源文件应该放在哪里?
- 前言
- 一、本地图片到底怎么放?
- 二、系统如何获取本地图片?
- 1.对比DPI的区别
- 2.基础概念总结抄录
- 3.如果对应的文件夹中没有图片呢?
- 4.[mipmap和drawable的区别(转载)](javascript:void(0)):
- 三、拓展
- 1.如何创建drawable文件夹
- 参考文章地址
前言
对本地图片的存储一直都有质疑,本篇笔记就收集知识点,汇总一下
一、本地图片到底怎么放?
Google推荐:drawable内存放图片、xml;mipmap内放置应用icon和动画的图片
drawable特点:根据密度找到对应的资源文件很快。
mipmap特点:支持多尺度缩放效果很好。
二、系统如何获取本地图片?
系统会根据手机屏幕的大小及屏幕密度去选择不同文件夹下的图片资源,以此来实现在不同大小不同屏幕分辨率下适配的问题,也就是通过density找到对应文件夹内的图片。
1.对比DPI的区别
适用于drawable和mipmap
屏幕级别 | 屏幕密度(dpi) | 比值 | 换算比例(px/dp) | 通常屏幕分辨率 | 横向对比IOS | |
ldpi | 低密度 | 120 | 0.75 | 1dp=0.75px | 240x320 | |
mdpi | 中密度(基准) | 160 | 1 | 1dp=1px | 320x480 | x |
hdpi | 高密度 | 240 | 1.5 | 1dp=1.5px | 480x800 | |
xhdpi | 超高密度 | 320 | 2 | 1dp=2px | 720x1280 | xx |
xxhdpi | 超超高密度 | 480 | 3 | 1dp=3px | 1080x1920 | xxx |
xxxhdpi | 超超超高密度 | 4 | 1dp=4px |
2.基础概念总结抄录
- 屏幕尺寸
含义:手机对角线的物理尺寸
单位:英寸(inch),1英寸=2.54cm
计算:勾股定理开斜边
Android手机常见的尺寸有5寸、5.5寸、6寸等等 - 屏幕分辨率
含义:手机像素点数总和
单位:px(pixel),1px=1像素点
计算:宽 * 长 - 屏幕像素密度
含义:每英寸的像素点数
单位:dpi
计算:√(长度像素数² + 宽度像素数²) / 屏幕对角线英寸数
屏幕像素密度 = 2203/5 = 440px/inch 如果,手机 density 是3.0,使用的是drawable图片,那么系统就会去drawable-xxhdpi中去找我们的图片了。
3.如果对应的文件夹中没有图片呢?
如果在对应的文件夹没找到,就从高分辨率的文件夹依次向低分辨率的文件夹寻找(有待验证),不是找到直接会使用哦,
例如:
接着上个栗子说,如果,手机 density是3.0,系统去drawable-xxhdpi没能找到图片,系统会从高分辨率文件夹(drawable-xxxhdpi
)中找我们需要的图片。因为我们需要的是density 是3.0的图片,但是找到是density 是4.0的图片,所以我们的图片需要压缩,drawable-xxxhdpi中我们找到的图片会是原图的3.0/4.0的大小。
懂了吗?如果我们从drawable-xxxhdpi中没有找到我们需要的图片,而是从drawable-xhdpi中找打的图片,那么
加载出来的图片就会是原图3.0/2.0的大小。
4.mipmap和drawable的区别(转载):
Android 在 API level 17 加入了 mipmap 技术,对 bitmap 图片的渲染支持 mipmap 技术,来提高渲染的速度和质量。
mipmap 是一种很早就有的技术了,翻译过来就是纹理映射技术。android 中的 mipmap 技术主要为了应对图片大小缩放的处理,在android 中我们提供一个 bitmap 图片,由于应用的需要(比如缩放动画),可能对这个 bitmap 进行各种比例的缩小,为了提高缩小的速度和图片的质量,android 通过 mipmap 技术提前对按缩小层级生成图片预先存储在内存中,这样就提高了图片渲染的速度和质量。
api 中通过 Bitmap 的 public final void setHasMipMap (boolean hasMipMap) 方法可以让系统渲染器尝试开启 Bitmap 的 mipmap 技术。但是这个方法只能建议系统开启这个功能,至于是否正真开启,还是由系统决定。
res 目录下面 mipmap 和 drawable 的区别也就是上面这个设置是否开启的区别。mipmap 目录下的图片默认 setHasMipMap 为 true,drawable 默认 setHasMipMap 为 false。
将icon放置在mipmap文件夹还可以让我们程序的launcher图标自动拥有跨设备密度展示的能力。
比如说一台屏幕密度是xxhdpi的设备可以自动加载mipmap-xxxhdpi下的icon来作为应用程序的launcher图标,这样图标看上去就会更加细腻。
鉴于mipmap这个特性,回答上面提出的问题,我们将所有的资源图片放在mipmap下面,Android系统将不得不耗费时间去寻找合适的图片,相反,放在drawable相应文件夹下,Android系统很容易根据密度找到对应的资源文件。
把splash启动图片 和一些自己项目里要执行缩放动画的图片放进去即可 其余的还放在drawable下面。
放在mipmap下 系统也就是自动设置的setHasMipmap为true了 会提前进行一个压缩 提高渲染的速度 其余的放里面就有点耗性能了。
三、拓展
1.如何创建drawable文件夹
参考文章地址
drawable和mipmap目录 https://www.jianshu.com/p/f7dc272b3469
Android 屏幕适配:最全面的解决方案:https://www.jianshu.com/p/ec5a1a30694b