Drawable 使用方法详解

综合技术 2017-10-24

Drawable 是Android 中图像显示的常用方法。

概念:Drawable 是指可在屏幕上绘制的图形,已经通过getDrawable(int)等API检索或者应用到具有 android:drawable 和 android:icon 等属性的其他 XML 资源的图形。

通过本章可以简单了解两者使用方法。

  1. Drawable 分类
  2. Bitmap 位图 BitmapDrawable
  3. 可拉伸图(*.9.png) NinePatchDrawable。
  4. 图层 LayerDrawable
  5. 不同状态图(选择器) StateListDrawable
  6. 级别列表 LevelListDrawable
  7. 转换图像 TransitionDrawable
  8. 插入可绘制对象
  9. 剪裁可绘制对象 ClipDrawable
  10. 缩放可绘制对象 ScaleDrawable
  11. 形状可绘制对象 ShapeDrawable

欢迎关注微信公众号:程序员Android

公众号ID:ProgramAndroid

获取更多信息

微信公众号:ProgramAndroid

我们不是牛逼的程序员,我们只是程序开发中的垫脚石。

我们不发送红包,我们只是红包的搬运工。

1.Drawable 分类

继承关系如下:

[java.lang.Object]
   ↳
     android.graphics.drawable.Drawable

Drawable 分类如下:

  1. Bitmap 位图 BitmapDrawable
  2. 可拉伸图(*.9.png) NinePatchDrawable。
  3. 图层 LayerDrawable
  4. 不同状态图(选择器) StateListDrawable
  5. 级别列表 LevelListDrawable
  6. 转换图像 TransitionDrawable
  7. 插入可绘制对象
  8. 剪裁可绘制对象 ClipDrawable
  9. 缩放可绘制对象 ScaleDrawable
  10. 形状可绘制对象 ShapeDrawable

资源引用:

在 Java 中:R.drawable.filename

在 XML 中:@[package:]drawable/filename

1. Bitmap 位图 BitmapDrawable

位图图像。Android 支持以下三种格式的位图文件:.png(首选)、.jpg(可接受)、.gif(不建议)。这些文件保存到 res/drawable/ 目录中

注:在构建过程中,可通过 aapt 工具自动优化位图文件,对图像进行无损压缩。例如,不需要超过 256 色的真彩色 PNG 可通过调色板转换为 8 位 PNG。这样产生的图像质量相同,但所需内存更少。因此请注意,此目录中的图像二进制文件在构建时可能会发生变化。如果您计划将图像解读为比特流以将其转换为位图,请改为将图像放在 res/raw/ 文件夹中,在那里它们不会进行优化

使用方法如下:

  • 1.常规位图

  • xml布局中使用方法

  • java 代码中使用方法
getResources().getDrawable(R.drawable.gril);
  • 2.XML 位图

  • 在XML中创建位图资源文件

    注意一下属性使用方法:

  1. antialias
    启用、停用抗锯齿
  2. dither
    当位图的像素配置与屏幕不同时(例如:ARGB 8888 位图和 RGB 565 屏幕),启用或停用位图抖动。
  3. filter
    启用或停用位图过滤。当位图收缩或拉伸以使其外观平滑时使用过滤。
  4. mipmap
    启用或停用 mipmap 提示
  5. tileMode
    定义平铺模式。当平铺模式启用时,位图会重复。重力在平铺模式启用时将被忽略


  • 引用XML位图资源方法
  • java 代码实现方法
getResources().getDrawable(R.drawable.bitmap_xml);

2. 可拉伸图(*.9.png) NinePatchDrawable。

NinePatch 是一种 PNG 图像,在其中可定义当视图中的内容超出正常图像边界时 Android 缩放的可拉伸区域。此类图像通常指定为至少有一个尺寸设置为 "wrap_content" 的视图的背景,而且当视图扩展以适应内容时,九宫格图像也会扩展以匹配视图的大小。Android 的标准 Button 小部件使用的背景就是典型的九宫格图像,其必须拉伸以适应按钮内的文本(或图像)。

-1. 常规使用方法同其他图片引用方式

-2. XML .9.png 图片同Bitmap XML的使用方式


3. 图层 LayerDrawable

LayerDrawable 是管理其他可绘制对象阵列的可绘制对象。列表中的每个可绘制对象按照列表的顺序绘制,列表中的最后一个可绘制对象绘于顶部。每个可绘制对象由单一 元素内的 元素表示。



    
    

4. 不同状态图(选择器) StateListDrawable

StateListDrawable 是在 XML 中定义的可绘制对象,它根据对象的状态,使用多个不同的图像来表示同一个图形。例如,Button 小部件可以是多种不同状态(按下、聚焦或这两种状态都不是)中的其中一种,而且可以利用状态列表可绘制对象为每种状态提供不同的背景图片。

您可以在 XML 文件中描述状态列表。每个图形由单一 元素内的 元素表示。每个 均使用各种属性来描述应用作可绘制对象的图形的状态。

在每个状态变更期间,将从上到下遍历状态列表,并使用第一个与当前状态匹配的项目 —此选择并非基于“最佳匹配”,而是选择符合状态最低条件的第一个项目。

此方法非常常用,比如状态选择器

-1. 常规使用方法同其他图片引用方式

-2. 选择器 XML的使用方式



    
    
    
    
    
    

5. 级别列表 LevelListDrawable

管理大量备选可绘制对象的可绘制对象,每个可绘制对象都分配有最大的备选数量。使用 setLevel() 设置可绘制对象的级别值会加载级别列表中 android:maxLevel 值大于或等于传递到方法的值的可绘制对象资源。

资源引用:

在 Java 中:R.drawable.filename

在 XML 中:@[package:]drawable/filename


    

可通过 setLevel() 或 setImageLevel() 更改级别。

6. 转换图像 TransitionDrawable

TransitionDrawable 是可在两种可绘制对象资源之间交错淡出的可绘制对象。

每个可绘制对象由单一 元素内的 元素表示。不支持超过两个项目。要向前转换,请调用 startTransition()。要向后转换,则调用 reverseTransition()。

  • xml 布局声明

    
    
  • java 代码中使用
ImageButton button = (ImageButton) findViewById(R.id.button);
TransitionDrawable drawable = (TransitionDrawable) button.getDrawable();
drawable.startTransition(500);

7. 插入可绘制对象

在 XML 文件中定义的以指定距离插入其他可绘制对象的可绘制对象。当视图需要小于视图实际边界的背景时,此类可绘制对象很有用。



8. 剪裁可绘制对象 ClipDrawable

在 XML 文件中定义的对其他可绘制对象进行裁剪(根据其当前级别)的可绘制对象。您可以根据级别以及用于控制其在整个容器中位置的重力,来控制子可绘制对象的裁剪宽度和高度。通常用于实现进度栏之类的项目。

  • xml 初始化剪裁样式


ImageView imageView=(ImageView) findViewById(R.id.img_drawable);
        ClipDrawable clipDrawable=(ClipDrawable) imageView.getDrawable();
        clipDrawable.setLevel(clipDrawable.getLevel()+1000);

9. 缩放可绘制对象 ScaleDrawable

在 XML 文件中定义的更改其他可绘制对象大小



10. 形状可绘制对象 ShapeDrawable

在 XML 中定义的一般形状。



    
    
    
    

至此,Drawable 的使用方法已基本完成

​欢迎关注微信公众号:程序员Android

公众号ID:ProgramAndroid

获取更多信息

微信公众号:ProgramAndroid

我们不是牛逼的程序员,我们只是程序开发中的垫脚石。

我们不发送红包,我们只是红包的搬运工。

点击阅读原文,获取更多福利

您可能感兴趣的

Android Things: Adding Google Assistant With the growth of the Internet of Things (IoT), developers and engineers have had to re-think how users interact with devices on a day-to-day basis. ...
Android-WakeLock(唤醒锁与屏幕/休眠) 一.使用 PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerM...
Android利用属性动画自定义倒计时控件 本文介绍一下利用属性动画(未使用Timer,通过动画执行次数控制倒计时)自定义一个圆形倒计时控件,比较简陋,仅做示例使用,如有需要,您可自行修改以满足您的需求。控件中所使用的素材及配色均是笔者随意选择,导致效果不佳,先上示例图片 示例中进度条底色、渐变色(仅支持两个色值...
Android 8.0(Android O) AccountManager 行为变更... 前言 在公司的项目中,使用 AccountManager 统一管理//获取帐号列表/或对应帐号类型的某个帐号 AccountManager#getAccounts()/getAccountsByType(String accountType) 获取不到 AccountManager 里...
Android应用统计-使用时长及次数统计(一)... 关键字: 应用统计 Android源码 应用使用时长 应用使用次数 最近在做有关于应用统计有关的工作,主要是统计系统中客户端应用(非系统自带的那些基础应用,比如DownLoadManager),在每一天的使用情况,统计内容包括:应用打开次数,应用合计使用时长等。 在所搜寻的方案中,大致有如下...