返回顶部
首页 > 资讯 > 移动开发 >关于Android中drawable必知的一些规则
  • 307
分享到

关于Android中drawable必知的一些规则

Android 2022-06-06 07:06:23 307人浏览 八月长安
摘要

前言 一入 Android 深似海,相信很多 Android 开发者深有体会,Android 系统版本的碎片化,Android 硬件设备的多样性,第三方 Rom 的不确定因素

前言

一入 Android 深似海,相信很多 Android 开发者深有体会,Android 系统版本的碎片化,Android 硬件设备的多样性,第三方 Rom 的不确定因素。现在想开发一个合格的商业化 App 真的不容易,先不说别的,应用的兼容性就是一项技术和耐心的双重考验,想完美适配各种情况可以说是不可能的,往往都是在人力和适配率之间寻找平衡,今天要说的 drawable 就是需要适配的一个重要角色。

配置限定符

对于不同的屏幕密度、不同的设备方向,不同的语言和区域,都会涉及到备选 drawable 资源,在运行时,Android 会检测当前设备配置并根据具体规则(后面会提到)为应用加载合适的资源。下面是可以使用的配置限定符,需要说明的是这些配置限定符不仅对 drawable 有效,对其他资源类型(如:layout 等)也有效:

     移动国家代码 (MCC):mcc310, mcc310-mnc004, mcc208-mnc00

     语言和区域:en, fr, en-rUS 等等

     布局方向:ldrtl(从右到左)ldltr(从左到右)

     smallestWidth:sw<N>dp 如:sw320dp, sw600dp, sw720dp 等等,屏幕可用高度和宽度的最小尺寸,屏幕的“最小可能尺寸”。

     可用宽度:w<N>dp 如:w720dp, w1024dp 等等,指定资源应该使用的最小可用屏幕宽度,以 dp 为单位,由 <N> 值定义。在横向和纵向之间切换时,为了匹配当前实际宽度,此配置值也会随之发生变化。

     可用高度:h<N>dp 如:h720dp, h1024dp 等等,指定资源应该使用的最小可用屏幕高度,以dp为单位,由 <N> 值定义。 在横向和纵向之间切换时,为了匹配当前实际高度,此配置值也会随之发生变化。

     屏幕尺寸:small, nORMal, large, xlarge

     屏幕纵横比:long 宽屏,如 WQVGA、WVGA、FWVGA;notlong 非宽屏,如 QVGA、HVGA 和 VGA

     屏幕方向:port 设备处于纵向(垂直),land 设备处于横向(水平)

     UI 模式:car, desk, television, appliance, watch

     夜间模式:night 夜间,nontight 白天

     屏幕像素密度:ldpi, mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi, nodpi, tvdpi

     触摸屏类型:notouch, finger

     键盘可用性:keysexposed, keyshidden, keyssoft

     主要文本输入法:nokeys, qwerty, 12key

     导航键可用性:navexposed 导航键可供用户使用,navhidden 导航键不可用

     主要非触摸导航方法:nonav, dpad, trackball, wheel

     平台版本(api 级别):v3, v4, v7 等等,如 v1 对应于 API 级别 1,v4 对应于 API 级别 4

如果你认真研究下每个配置限定符,你就会体会到:想完美适配各种情况可以说是不可能的,其实我们平时最常用的也是基本必须要用的就是屏幕像素密度,这里有必要详细的说一下该参数:

      ldpi:低密度屏幕;约为 120dpi。

      mdpi:中等密度(传统 HVGA)屏幕;约为 160dpi。

      hdpi:高密度屏幕;约为 240dpi。

      xhdpi:超高密度屏幕;约为 320dpi。API 级别 8 中新增配置

      xxhdpi:超超高密度屏幕;约为 480dpi。API 级别 16 中新增配置

      xxxhdpi:超超超高密度屏幕使用(仅限启动器图标,请参阅“支持多个屏幕”中的注释);约为 640dpi。 API 级别 18 中新增配置

      nodpi:它可用于您不希望缩放以匹配设备密度的位图资源。

      tvdpi:密度介于 mdpi 和 hdpi 之间的屏幕;约为 213Dpi。它并不是“主要”密度组, 主要用于电视,而大多数应用都不需要它。对于大多数应用而言,提供 mdpi 和 hdpi 资源便已足够,系统将根据需要对其进行缩放。API 级别 13 中引入了此限定符。

      六个主要密度之间的缩放比为 3:4:6:8:12:16(忽略 tvdpi 密度)。因此,9x9 (ldpi) 位图相当于 12x12 (mdpi)、18x18 (hdpi)、24x24 (xhdpi) 位图,依此类推。

限定符命名规则

      可以为单组资源指定多个限定符,并使用短划线分隔。例如,drawable-en-rUS-land 适用于横排美国英语设备。

       这些限定符必须遵循上面列出的顺序,所以上面的列表是有顺序的。例如:错误:drawable-hdpi-port/,正确:drawable-port-hdpi/

       不能嵌套备用资源目录。例如,您不能拥有 res/drawable/drawable-en/。

       值不区分大小写。在处理之前,资源编译器会将目录名称转换为小写,以避免不区分大小写的文件系统出现问题。 名称中使用的任何大写字母只是为了便于认读。

        对于每种限定符类型,仅支持一个值。例如,若要对西班牙语和法语使用相同的 drawable 文件,则您肯定不能拥有名为 drawable-rES-rFR/ 的目录,而是需要两个包含相应文件的资源目录。

Android 匹配最佳 drawable 规则

如果你只使用一个配置限定符,那么很好匹配,找到符合该配置的 drawable 即可,但当你同时使用多个配置限定符,且同时存在多个 drawable 目录时,匹配最佳 drawable 就没那么简单了,这里以 Android Developer 官方的例子说明,例如:现在你的应用包含如下目录:


drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/

同时,假设目标设备的配置如下:


区域设置 = en-GB 
屏幕方向 = port 
屏幕像素密度 = hdpi 
触摸屏类型 = notouch 
主要文本输入法 = 12key

具体的匹配过程如下:

       1、淘汰与设备配置冲突的资源文件:其中 drawable-fr-rCA/ 目录与 en-GB 区域设置冲突,因而被淘汰(但有个例外,屏幕像素密度是唯一一个未因冲突而被淘汰的限定符,尽管设备的屏幕密度为 hdpi,但是 drawable-port-ldpi/ 未被淘汰,因为此时每个屏幕密度均视为匹配)

       2、选择在上面限定符列表中优先级最高的限定符,先从 MCC 开始,然后下移,看是否有资源目录包括此限定符,若无则看下一个限定符,在该示例中,除非达到语言限定符,否则答案始终为“否”。

       3、若有,则淘汰不含此限定符的资源目录。在该示例中,系统会淘汰所有不含语言限定符的目录。所以到这一步符合要求的 drawable 还剩:

            drawable-en/

            drawable-en-port/

            drawable-en-notouch-12key/

       4、选择下一个优先级的限定符,重复执行步骤 2, 3, 4。直到只剩下一个目录,该例中应该是 port, 所以淘汰后只剩:

            drawable-en-port/

有两点需要说明一下:

       1、屏幕像素密度是唯一一个未因冲突而被淘汰的限定符,如果涉及的限定符是屏幕像素密度,则 Android 会选择最接近设备屏幕密度的选项。通常 Android 倾向于缩小大型原始图像,而不是放大小型原始图像。

       2、如果一个符合限定符的 drawable 都没有怎么办?还能怎么办,崩溃呗!

drawable 和 mipmap 的区别和联系

现在通过 Android Studio 创建工程,默认会创建一系列 mipmap 文件夹,而不是以前的 drawable 文件夹。那么 mipmap 和 drawable 到底是什么关系?mipmap 取代了 drawable 了吗?先看一下官方说明:

drawable/
For bitmap files (PNG, JPEG, or GIF), 9-Patch image files, and XML files that describe Drawable shapes or Drawable objects that contain multiple states (normal, pressed, or focused). See the Drawable resource type.
mipmap/
For app launcher icons. The Android system retains the resources in this folder (and density-specific folders such as mipmap-xxxhdpi) regardless of the screen resolution of the device where your app is installed. This behavior allows launcher apps to pick the best resolution icon for your app to display on the home screen. For more information about using the mipmap folders, see Managing Launcher Icons as mipmap Resources.

这里先说结论:mipmap 文件夹下,仅仅建议放启动图标 (app launcher icons),也就是应用安装后,会显示在桌面的那个图标,而其他的图片资源等,还是按照以前方式,放在 drawable 文件夹下。

那么为什么要把 Launcher Icon 放在mipmap 文件夹下? 下面英文是官方解释:

Different home screen launcher apps on different devices show app launcher icons at various resolutions. When app resource optimization techniques remove resources for unused screen densities, launcher icons can wind up looking fuzzy because the launcher app has to upscale a lower-resolution icon for display. To avoid these display issues, apps should use the mipmap/ resource folders for launcher icons. The Android system preserves these resources regardless of density stripping, and ensures that launcher apps can pick icons with the best resolution for display.
Make sure launcher apps show a high-resolution icon for your app by moving all densities of your launcher icons to density-specific res/mipmap/ folders (for example res/mipmap-mdpi/ and res/mipmap-xxxhdpi/). The mipmap/ folders replace the drawable/ folders for launcher icons. For xxhpdi launcher icons, be sure to add the higher resolution xxxhdpi versions of the icons to enhance the visual experience of the icons on higher resolution devices.

这里是我的理解:很多不同的 Launcher App 采用的 Launcher Icon 的大小不一致,而在应用安装时 Android 资源优化会把 drawable 文件夹下不需要的分辨率资源删除掉,例如在 xhdpi 的设备上将 drawable-xxhdpi 下的资源删掉,当然里面的 Launcher Icon 也会被删掉,这时如果 Launcher App 采用的 Launcher Icon 大小偏大,而高分辨 xxhdpi 下的 Icon 又被删掉了,就只能把 xhdpi 下的小尺寸 Icon 进行放大显示了,这样就会造成 Launcher Icon 显示模糊。为了避免上面的问题,就引入了 mipmap,Android 会保证 mipmap 下的资源不会因为资源优化而被删除,确保大尺寸的 Launcher Icon 可以找到更合适分辨率的 Icon。所以 mipmap 是为 Launcher Icon 而生的,而其它的图片资源还是放在 drawable 文件夹下,这样有助于Android 资源优化删除无用的资源,减少应用体积。

总结

以上就是关于Android中drawable必知的一些规则的全部内容,文章内容对于Android开发者来说很实用,希望对各位有所帮助。

您可能感兴趣的文章:android中图形图像处理之drawable用法分析详解Android中Drawable方法Android自定义Drawable实现圆角效果Android Drawable及其相关类的使用Android开发基于Drawable实现圆角矩形的方法Android自定义Drawable实现圆形和圆角Android Drawable和Bitmap的转换实例详解Android中drawable使用Shape资源Android开发使用Drawable绘制圆角与圆形图案功能示例Android自定义Drawable之在Drawable中部指定透明区域方法示例


--结束END--

本文标题: 关于Android中drawable必知的一些规则

本文链接: https://lsjlt.com/news/24361.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 关于Android中drawable必知的一些规则
    前言 一入 Android 深似海,相信很多 Android 开发者深有体会,Android 系统版本的碎片化,Android 硬件设备的多样性,第三方 Rom 的不确定因素...
    99+
    2022-06-06
    Android
  • 关于Android bitmap你不知道的一些事
    本文为大家分享了Android bitmap使用细节,供大家参考,具体内容如下 1、计算机表示图形的几种方式 1)BMP :几乎不进行压缩 占用空间比较大 2)JPG : 在...
    99+
    2022-06-06
    bitmap Android
  • 关于java正则?:、?=、?!的一些理解
    官方文档如图:上图是官方文档的介绍,总结一下讲了两个知识点:(学习视频推荐:java视频教程)是否获取匹配并保存匹配的值;正向预查和反向预查。一、解释是否获取匹配并保存匹配的值()表示捕获分组,获取匹配,()把每个分组里的匹配的值保存起来;...
    99+
    2017-09-20
    java入门 java 正则 理解 ?: ?= ?!
  • Python中关联的规则有哪些
    今天就跟大家聊聊有关Python中关联的规则有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1. 关联规则大家可能听说过用于宣传数据挖掘的一个案例:啤酒和尿布;据说是沃尔玛超市在...
    99+
    2023-06-14
  • 关于c语言逗号表达式的运算规则知识点
    逗号表达式是一个有多个子表达式组成的表达式,每个子表达式用逗号分隔。逗号表达式的运算规则如下:1. 逗号表达式从左到右依次计算每个子...
    99+
    2023-08-15
    C语言
  • 关于shopnc系统使用的一点看法,静态规则
    关于shopnc系统使用的一点看法,自从上了这套系统以后,系统bug不断,官方至今圈子的静态化问题都没有处理好,这个问题,我百度了很久,几乎没有人能解决,想换成discuz程序把,又需要做数据库对接,非常麻...
    99+
    2024-04-02
  • 关于Vue中过滤器的必懂小知识
    目录前言什么是过滤器如何使用过滤器全局过滤器局部过滤器过滤器可以串联总结前言 大家好,今天来分享下Vue中的过滤器小知识 什么是过滤器 Vue.js 允许你自定义过滤器,可被用于一...
    99+
    2024-04-02
  • 一些关于MySQL事务的基础知识
    下面讲讲关于MySQL事务的基础知识,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完MySQL事务的基础知识这篇文章你一定会有所受益。 1、事务的基本语法<!--...
    99+
    2024-04-02
  • 关于umask(权限掩码)的一些知识
    关于umask(权限掩码)的一些知识 前言:首先,我们先介绍一下关于umask的一些基础知识,以方便更深入的了解umask 定义: umask(user-file-creation mode mask...
    99+
    2023-09-30
    linux 服务器 运维
  • Android中关于CoordinatorLayout的一些实用布局技巧
    介绍 CoordinatorLayout是一个“加强版”的 FrameLayout,它主要有两个用途: (1) 用作应用的顶层布局管理器 (2) 通过为子View指定 be...
    99+
    2022-06-06
    技巧 布局 coordinatorlayout Android
  • 关于Node.js中Buffer的一些你可能不知道的用法
    前言 在大多数介绍 Buffer 的文章中,主要是围绕数据拼接和内存分配这两方面的。比如我们使用fs模块来读取文件内容的时候,返回的就是一个 Buffer: fs.readFile('filename'...
    99+
    2022-06-04
    你可 Node js
  • 关于MYSQL日期函数的有哪些知识是必须懂的
    本文主要给大家介绍关于MYSQL日期函数的知识,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下MYSQL日期函数的知识吧。    ...
    99+
    2024-04-02
  • 详解关于Android Studio中安装和gradle的一些坑
    本人从开始用Android Studio到现在已经快一年了吧,在我刚开始用的时候Android Studio还是1.2的版本。当时安装会因为国内墙的缘故,导致下载SDK步骤卡死无法安装。最近的版本似乎都没出现这个问题,但是还是要吐槽一下最近...
    99+
    2023-05-30
    android studio gradle
  • python中关于os.path.pardir的一些坑
    目录关于os.path.pardir的一些坑python中os.path常用模块1 BASE_DIR变量2 os.listdir()的用法3 如下所示4 os.path.splite...
    99+
    2024-04-02
  • 关于Nginx中虚拟主机的一些冷门知识小结
    目录前言对线上配置的一个小疑问问题背景实测结果探索排查网络排查nginx总结前言 nginx的虚拟主机,不知道大家了解不。以前吧,如果在nginx上要反向代理多个服务,我一般是让ng...
    99+
    2024-04-02
  • 关于服务器性能优化你必须知道的那些事!
    1. 选择合适的服务器配置 服务器的配置对性能有着直接的影响,在选择服务器时,需要考虑网站或应用的实际需求,包括CPU、内存、硬盘空间、带宽等。如果服务器配置不足,可能会导致网站或应用运行缓慢,甚至出现崩溃的情况。 2. 使用负载均衡技...
    99+
    2024-02-09
    服务器性能优化 服务器调优 性能优化技巧 服务器配置 负载均衡
  • mongodb中关于索引的知识有哪些
    这篇文章主要为大家展示了“mongodb中关于索引的知识有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mongodb中关于索引的知识有哪些”这篇文章吧。我...
    99+
    2024-04-02
  • Python中关于字典的知识有哪些
    本篇内容主要讲解“Python中关于字典的知识有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中关于字典的知识有哪些”吧!字典(dict)dic是映射类型,由{}括起来的键值对组...
    99+
    2023-06-02
  • Golang中关于defer的知识点有哪些
    这篇文章主要介绍“Golang中关于defer的知识点有哪些”,在日常操作中,相信很多人在Golang中关于defer的知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Golang中关于defer的...
    99+
    2023-07-05
  • Android开发中关于获取当前Activity的一些思考
    在Android开发过程中,我们有时候需要获取当前的Activity实例,比如弹出Dialog操作,必须要用到这个。关于如何实现由很多种思路,这其中有的简单,有的复杂,这里简单...
    99+
    2022-06-06
    activity android开发 Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作