美文网首页
Android 图片资源 drawable

Android 图片资源 drawable

作者: Android_冯星 | 来源:发表于2018-09-07 16:33 被阅读0次

    相关概念

    • dpi
      每英寸点数,全称dots per inch。用来表示屏幕密度,即屏幕物理区域中的像素量。高密度屏幕比低密度屏幕在给定物理区域的像素要多。

    • dp
      即dip,全称device independent pixel。设备独立像素,是一种虚拟像素单位,用于以密度无关方式表示布局维度或位置,以确保在不同密度的屏幕上正常显示UI。在160dpi的设备上,1dp=1px。

    • density
      设备的逻辑密度,是dip的缩放因子。以160dpi的屏幕为基线,density=dpi/160。

    getResources().getDisplayMetrics().density

    • sp
      缩放独立像素,全称scale independent pixel。类似于dp,一般用于设置字体大小,可以根据用户设置的字体大小偏好来缩放。

    mipmap目录

    Android官方的描述,mipmap仅仅用于存放APP启动图标

    mipmap尺寸

    建议尺寸 密度
    32*32 ldpi
    48*48 mdpi
    72*72 hdpi
    96*96 xhdpi
    144*144 xxhdpi
    192*192 xxxhdpi

    dpi范围密度对应范围

    密度 目录
    0dpi ~ 120dpi ldpi
    120dpi ~ 160dpi mdpi
    160dpi ~ 240dpi hdpi
    240dpi ~ 320dpi xhdpi
    320dpi ~ 480dpi xxhdpi
    480dpi ~ 640dpi xxxhdpi

    Android系统适配原则

    Android为了更好地优化应用在不同屏幕密度下的用户体验,在项目的res目录下可以创建drawab-[density](density为6种通用密度名)目录,开发者在进行APP开发时,针对不同的屏幕密度,将图片放置于对应的drawable-[density]目录,Android系统会依据特定的原则来查找各drawable目录下的图片。查找流程为:

    1. 先查找和屏幕密度最匹配的文件夹。如当前设备屏幕密度dpi为160,则会优先查找drawable-mdpi目录;如果设备屏幕密度dpi为420,则会优先查找drawable-xxhdpi目录。
    2. 如果在最匹配的目录没有找到对应图片,就会向更高密度的目录查找,直到没有更高密度的目录。例如,在最匹配的目录drawable-mdpi中没有查找到,就会查找drawable-hdpi目录,如果还没有查找到,就会查找drawable-xhdpi目录,直到没有更高密度的drawable-[density]目录。
    3. 如果一直往高密度目录均没有查找,Android就会查找drawable-nodpi目录。drawable-nodpi目录中的资源适用于所有密度的设备,不管当前屏幕的密度如何,系统都不会缩放此目录中的资源。因此,对于永远不希望系统缩放的资源,最简单的方法就是放在此目录中;同时,放在该目录中的资源最好不要再放到其他drawable目录下了,避免得到非预期的效果。
    4. 如果在drawable-nodpi目录也没有查找到,系统就会向比最匹配目录密度低的目录依次查找,直到没有更低密度的目录。例如,最匹配目录是xxhdpi,更高密度的目录和nodpi目录查找不到后,就会依次查找drawable-xhdp、drawable-hdpi、drawable-mdpi、drawable-ldpi。

    举个例子,假如当前设备的dpi是320,系统会优先去drawable-xhdpi目录查找,如果找不到,会依次查找xxhdpi → xxxhdpi → hdpi → mdpi → ldpi。对于不存在的drawable-[density]目录直接跳过,中间任一目录查找到资源,则停止本次查找。

    总结一下图片查找过程:优先匹配最适合的图片→查找密度高的目录(升序)→查找密度低的目录(降序)。

    资源适配流程简单归纳如下

    image.png

    图片的放大和缩小

    为了更好的描述,把“符合当前设备dpi的drawable目录”表示为”匹配目录“。比如,设备的dpi为320,这匹配目录为drawable-xhdpi;设备的dpi为150,则匹配目录为drawable-mdpi。图片的放大和缩小遵循以下规律:

    • 如果图片所在目录为匹配目录,则图片会根据设备dpi做适当的缩放调整。
    • 如果图片所在目录dpi低于匹配目录,那么该图片被认为是为低密度设备需要的,现在要显示在高密度设备上,图片会被放大。
    • 如果图片所在目录dpi高于匹配目录,那么该图片被认为是为高密度设备需要的,现在要显示在低密度设备上,图片会被缩小。
    • 如果图片所在目录为drawable-nodpi,则无论设备dpi为多少,保留原图片大小,不进行缩放。

    放大倍数

    放大倍数 密度
    0.75 ldpi
    1 mdpi
    1.5 hdpi
    2 xhdpi
    3 xxhdpi
    4 xxxhdpi

    例如,当前设备的dpi是480(即xxhdpi),那么对于存放于mdpi目录中的图片会被放大三倍。对于很多设备,其dpi并不刚好是六种通用密度最大dpi,这种情况下,图片的缩放倍数如何计算呢?

    稍微思考一下,我们就可以得到通用的缩放倍数(缩放因子)计算方法:对于任意设备,各drawable-[density]目录下的图片放大倍数的计算公式


    image.png

    快速创建drawable xxx文件夹

    res右键创建文件选择Android Resource Directory,出现下面的图。
    Directory name 先不用写 自动生成点击Resource type选择drawable现在 Directory name名字已经改了,选择下面的density点击>>选择density

    image.png image.png

    相关文章

      网友评论

          本文标题:Android 图片资源 drawable

          本文链接:https://www.haomeiwen.com/subject/xgpxgftx.html