Android Drawable

一、Drawable介绍

Drawable是对可绘制物件的一般抽象,表示一种图像的概念,在实际开发中常被当做View的背景或者ImageView的图像,一般用xml来构建。(与View不同,没有事件和交互方法)

Drawable表示可以在canvas(画布)中进行绘制的抽象概念,是个抽象类,它有许多子类,不同的子类可以绘制出不同的对象。

一般情况下,除了直接使用放在Drawable下的图片,其实的Drawable的用法都和xml相关,我们可以使用shape、layer-list等标签绘制一些背景,还可以通过selector标签定义View的状态的效果等。当然了基本每个标签都对应于一个真正的实体类,关系如下:

二、Drawable相关类

Drawable

Drawable是Android中的一个抽象类,用于表示可绘制的图形对象。它可以是图片、形状、颜色等,用于在屏幕上绘制图形。Drawable类有很多子类,其中两个常用的子类是AnimationDrawable和GradientDrawable。

它具有一些通用属性,可以用来修改和控制绘制的外观和行为。以下是一些常见的Drawable的通用属性:

alpha:Drawable的透明度。取值范围为0(完全透明)到255(完全不透明)。

colorFilter:应用颜色过滤器来修改Drawable的颜色。可以使用ColorMatrixColorFilter、PorterDuffColorFilter等。

bounds:Drawable的边界框。可以使用setBounds()方法来指定Drawable在屏幕上的位置和大小。

level:Drawable的级别。可以用于控制Drawable的状态,例如在不同的级别下显示不同的图像。

state:Drawable的状态。可以使用setState()方法来指定Drawable的不同状态,例如按下、选中等。

callback:Drawable的回调接口。可以使用setCallback()方法来指定Drawable的回调对象,用于处理绘制和动画的事件。

padding:Drawable的内边距。可以使用setPadding()方法来指定Drawable的内边距,用于调整绘制内容的位置。

levelList:Drawable的级别列表。可以使用LevelListDrawable来定义不同级别下的不同图像。

stateList:Drawable的状态列表。可以使用StateListDrawable来定义不同状态下的不同图像。

transition:Drawable的过渡效果。可以使用TransitionDrawable来实现Drawable之间的平滑过渡。

Drawable文件路径:

frameworks/base/graphics/java/android/graphic/drawable/Drawable.java

Drawable定义:

public abstract class Drawable {}

Drawable方法:

void applyTheme(Resources.Theme t):将指定的主题应用于此Drawable及其子项。
void clearColorFilter():移除该drawable的颜色过滤器。
final Rect copyBounds():在新的Rect中返回可绘制边界的副本。
final void copyBounds(Rect bounds):在指定的Rect中返回可绘制边界的副本(由调用方分配)。
static Drawable createFromPath(String pathName):从文件路径名创建一个drawable。
static Drawable createFromResourceStream(Resources res, TypedValue value, InputStream is, String srcName, BitmapFactory.Options opts):从输入流创建drawable,使用给定的资源和值来确定密度信息。
static Drawable createFromResourceStream(Resources res, TypedValue value, InputStream is, String srcName):从输入流创建drawable,使用给定的资源和值来确定密度信息。
static Drawable createFromStream(InputStream is, String srcName):从输入流创建一个drawable
static Drawable createFromXml(Resources r, XmlPullParser parser):从XML文档创建一个drawable。
static Drawable createFromXml(Resources r, XmlPullParser parser, Resources.Theme theme):使用可选的 Resources.Theme从XML文档创建 Resources.Theme 。
static Drawable createFromXmlInner(Resources r, XmlPullParser parser, AttributeSet attrs, Resources.Theme theme):使用可选的 Resources.Theme在XML文档内创建一个drawable。
static Drawable createFromXmlInner(Resources r, XmlPullParser parser, AttributeSet attrs):从XML文档内部创建。
abstract void draw(Canvas canvas):在其边界(通过setBounds设置)中绘制,考虑可选效果,如alpha(通过setAlpha设置)和color filter(通过setColorFilter设置)。
final Rect getBounds():返回drawable的边界Rect。
Drawable.Callback getCallback():返回附加到此Drawable的当前 Drawable.Callback实现。
int getChangingConfigurations():返回此drawable可能更改的配置参数的掩码,要求重新创建它。
ColorFilter getColorFilter():返回当前的颜色过滤器,如果没有设置,则返回 null 。
Drawable.ConstantState getConstantState():返回保存此Drawable的共享状态的 Drawable.ConstantState实例。
Rect getDirtyBounds():返回drawable的脏边界Rect。
void getHotspotBounds(Rect outRect):用热点边界填充 outRect 。
int getIntrinsicHeight():返回drawable的内在高度。
int getIntrinsicWidth():返回drawable的内部宽度。
int getLayoutDirection():返回此Drawable的已解析布局方向。
int getMinimumHeight():返回此Drawable建议的最小高度。
int getMinimumWidth():返回此Drawable建议的最小宽度。
abstract int getOpacity():返回此Drawable的不透明度/透明度。
void getOutline(Outline outline):调用drawable来填充定义其绘图区域的Outline。
boolean getPadding(Rect padding):返回填充此Drawable建议的插入内容以将内容放入drawable的边界内。
int[] getState():描述了当前状态,如primitve状态的联合,如 state_focused , state_selected等
void inflate(Resources r, XmlPullParser parser, AttributeSet attrs, Resources.Theme theme):从可选的由主题设计的XML资源中扩展此Drawable。
void inflate(Resources r, XmlPullParser parser, AttributeSet attrs):从XML资源膨胀此Drawable。
void invalidateSelf():使用当前的 Drawable.Callback实现将此Drawable重绘。
Drawable mutate():使这个drawable可变。
boolean onLayoutDirectionChanged(int layoutDirection):当drawable的解析布局方向改变时调用。
void setBounds(int left, int top, int right, int bottom):为Drawable指定一个边界矩形。
void setBounds(Rect bounds):为Drawable指定一个边界矩形。
final void setCallback(Drawable.Callback cb):将 Drawable.Callback对象绑定到此Drawable。
void setColorFilter(int color, PorterDuff.Mode mode):指定一个颜色和Porter-Duff模式作为该drawable的颜色过滤器。
abstract void setColorFilter(ColorFilter colorFilter):为绘图指定一个可选的颜色过滤器。
void setHotspot(float x, float y):指定可绘制内的热点位置。
void setHotspotBounds(int left, int top, int right, int bottom):设置热点受限的边界,如果它们应该与可绘制边界不同。
final boolean setLayoutDirection(int layoutDirection):设置该drawable的布局方向。
void setTint(int tintColor):指定该drawable的色调颜色
boolean setState(int[] stateSet):为drawable指定一组状态。
final boolean setLevel(int level):指定drawable的级别。
void setTintList(ColorStateList tint):指定该drawable的色彩颜色作为颜色状态列表。
void setTintMode(PorterDuff.Mode tintMode):指定该drawable的色调混合模式。
boolean setVisible(boolean visible, boolean restart):设置此Drawable是否可见。
void onBoundsChange(Rect bounds):如果您根据边界而变化,请在您的子类中覆盖此内容以更改外观。
boolean onLevelChange(int level):如果您根据级别而变化,请在您的子类中覆盖此内容以更改外观。
boolean onStateChange(int[] state):如果您认识到指定的状态,请在您的子类中覆盖此内容以更改外观。

BitmapDrawable

位图图像。Android支持三种格式的位图文件:.png(首选)、.jpg(可接受)、.gif(不建议)。我们可以直接使用文件名作为资源 ID 来引用位图文件,也可以在 XML 文件中创建别名资源 ID,这就叫做 XML位图。

XML位图:通过XML文件来定义,指向位图文件,文件位于res/drawable/filename.xml,其文件名就是作为引用的资源 ID,如:R.drawable.filename。

除了在 XML 文件中定义位图,我们也可以直接通过代码来实现,即BitmapDrawable。

关于 <bitmap> 属性:

1. android:src:引用可绘制对象资源,必备。

2. android:tileMode:定义平铺模式。当平铺模式启用时,位图会重复,且注意:一旦平铺模式启用, android:gravity 属性就将会被忽略。

定义平铺属性的值必须是以下值之一:

• disabled:不平铺位图,默认值。

• clamp:当着色器绘制范围超出其原边界时复制边缘颜色。

• repeat:水平和垂直重复着色器的图像。

• mirror:水平和垂直重复着色器的图像,交替镜像图像以使相邻图像始终相接。

注意:在平铺模式启用时 android:gravity 属性将被忽略。

android:gravity:定义位图的重力属性,当位图小于容器时,可绘制对象在其容器中放置的位置。

• top:将对象放在其容器顶部,不改变其大小。

• bottom:将对象放在其容器底部,不改变其大小。

• left:将对象放在其容器左边缘,不改变其大小。

• right:将对象放在其容器右边缘,不改变其大小。

• center_vertical:将对象放在其容器的垂直中心,不改变其大小。

• fill_vertical:按需要扩展对象的垂直大小,使其完全适应其容器。

• center_horizontal:将对象放在其容器的水平中心,不改变其大小。

• fill_horizontal:按需要扩展对象的水平大小,使其完全适应其容器。

• center:将对象放在其容器的水平和垂直轴中心,不改变其大小。

• fill:按需要扩展对象的垂直大小,使其完全适应其容器。这是默认值。

• clip_vertical:可设置为让子元素的上边缘和/或下边缘裁剪至其容器边界的附加选项。裁剪基于垂直重力:顶部重力裁剪上边缘,底部重力裁剪下边缘,任一重力不会同时裁剪两边。

• clip_horizontal:可设置为让子元素的左边和/或右边裁剪至其容器边界的附加选项。裁剪基于水平重力:左边重力裁剪右边缘,右边重力裁剪左边缘,任一重力不会同时裁剪两边。

BitmapDrawable文件路径:

frameworks/base/graphics/java/android/graphic/drawable/BitmapDrawable.java

BitmapDrawable定义

public class BitmapDrawable extends Drawable {}

LayerDrawable

图层列表(LayerDrawable):是可绘制对象列表组成的可绘制对象。列表中的每个可绘制对象均按照列表顺序绘制,列表中的最后一个可绘制对象绘于顶部。

每个可绘制对象由单一 <layer-list> 元素内的 <item> 元素表示。

介绍一下其中的属性:

1. <layer-list>:必备的根元素。包含一个或多个 <item> 元素。

2. <item>:是 <layer-list> 元素的子项,其属性支持定义在图层中所处的位置。

• android:drawable:必备。引用可绘制对象资源。

• android:top:整型。顶部偏移(像素)。

• android:right:整型。右边偏移(像素)。

• android:bottom:整型。底部偏移(像素)。

• android:left:整型。左边偏移(像素)。

除了通过在XML中实现,我们同样可以通过代码来实现上面同样的效果。

LayerDrawable文件路径:

frameworks/base/graphics/java/android/graphic/drawable/LayerDrawable.java

LayerDrawable定义

public class LayerDrawable extends Drawable implements Drawable.Callback {}

StateListDrawable

状态列表(StateListDrawable):会根据对象状态,使用多个不同的图像来表示同一个图形。

介绍一下其中的属性:

• <selector>:必备的根元素。包含一个或多个 <item> 元素。

• <item>:定义在某些状态期间使用的可绘制对象,必须是 <selector> 元素的子项。

其属性:

android:drawable:引用可绘制对象资源,必备。

android:state_pressed:布尔值。是否按下对象(例如触摸/点按某按钮)。

android:state_checked:布尔值。是否选中对象。

android:state_enabled:布尔值。是否能够接收触摸或点击事件。

除了通过在XML中实现,我们同样可以通过代码来实现上面同样的效果。

StateListDrawable文件路径:

frameworks/base/graphics/java/android/graphic/drawable/StateListDrawable.java

StateListDrawable定义:

public class StateListDrawable extends DrawableContainer {}

LevelListDrawable

级别列表(LevelListDrawable):管理可绘制对象列表,每个可绘制对象都有设置Level等级限制,当使用setLevel()时,会加载级别列表中 android:maxLevel 值大于或等于传递至方法的值的可绘制对象资源。

介绍一下其中的属性:

1. <level-list>:必备的根元素。包含一个或多个 <item> 元素。

2. <item>:在特定级别下使用的可绘制对象。

• android:drawable:必备。引用可绘制对象资源。

• android:maxLevel:整型。表示该Item允许的最高级别。

• android:minLevel:整型。表示该Item允许的最低级别。

在将该 Drawable 应用到 View 后,就可以通过 setLevel() 或 setImageLevel() 更改级别。

除了通过在XML中实现,我们同样可以通过代码来实现上面同样的效果。

LevelListDrawable文件路径:

frameworks/base/graphics/java/android/graphic/drawable/LevelListDrawable.java

LevelListDrawable定义:

public class LevelListDrawable extends DrawableContainer {}

TransitionDrawable

转换可绘制对象(TransitionDrawable):可在两种可绘制对象资源之间交错淡出。

介绍一下其中的属性:

1. <transition>:必备的根元素。包含一个或多个 <item> 元素。

2. <item>:转换部分的可绘制对象。

• android:drawable:必备。引用可绘制对象资源。

• android:top、android:bottom、android:left、android:right:整型。偏移量(像素)。

注意:不能超过两个Item,调用 startTransition() 向前转换,调用 reverseTransition() 向后转换。

除了通过在XML中实现,我们同样可以通过代码来实现上面同样的效果。

TransitionDrawable文件路径:

frameworks/base/graphics/java/android/graphic/drawable/TransitionDrawable.java

TransitionDrawable定义:

public class TransitionDrawable extends LayerDrawable implements Drawable.Callback {}

InsetDrawable

插入可绘制对象(InsetDrawable):以指定距离插入其他可绘制对象,当视图需要小于视图实际边界的背景时,此类可绘制对象很有用。

介绍一下其属性:

• <inset>:必备。根元素。

• android:drawable:必备。引用可绘制对象资源。

• android:insetTop、android:insetBottom、android:insetLeft、android:insetRight:尺寸。插入的,表示为尺寸

除了通过在XML中实现,我们同样可以通过代码来实现上面同样的效果。

InsetDrawable文件路径:

frameworks/base/graphics/java/android/graphic/drawable/InsetDrawable.java

InsetDrawable定义:

public class InsetDrawable extends DrawableWrapper {}

ClipDrawable

裁剪可绘制对象(ClipDrawable):根据level等级对可绘制对象进行裁剪,可以根据level与gravity来控制子可绘制对象的宽度与高度。

介绍一下其属性:

<clip>:必备。根元素。

android:drawable:必备。引用可绘制对象资源。

android:clipOrientation:裁剪方向。

• horizontal:水平裁剪。

• vertical:垂直裁剪。

android:gravity:重力属性。

最后通过设置level等级来实现裁剪,level 默认级别为 0,即完全裁剪,使图像不可见。当级别为 10,000 时,图像不会裁剪,而是完全可见。

除了通过在XML中实现,我们同样可以通过代码来实现上面同样的效果。

public class ClipDrawable extends DrawableWrapper {}

ScaleDrawable

缩放可绘制对象(ScaleDrawable):根据level等级来更改其可绘制对象大小。

介绍一下其属性:

• <scale>:必备。根元素。

• android:drawable:必备。引用可绘制对象资源。

• android:scaleGravity:指定缩放后的重力位置。

• android:scaleHeight:百分比。缩放高度,表示为可绘制对象边界的百分比。值的格式为 XX%。例如:100%、12.5% 等。

• android:scaleWidth:百分比。缩放宽度,表示为可绘制对象边界的百分比。值的格式为 XX%。例如:100%、12.5% 等。

除了通过在XML中实现,我们同样可以通过代码来实现上面同样的效果。

public class ScaleDrawable extends DrawableWrapper {}

ShapeDrawable

形状可绘制对象(ShapeDrawable):通过XML来定义各种形状的可绘制对象。

介绍一下其属性:

1. <shape>:必备。根元素。

2. android:shape:定义形状的类型。

• rectangle:默认形状,填充包含视图的矩形。

• oval:适应包含视图尺寸的椭圆形状。

• line:跨越包含视图宽度的水平线。此形状需要 元素定义线宽。

ring:环形。

• android:innerRadius:尺寸。环内部(中间的孔)的半径。

• android:thickness:尺寸。环的厚度。

3. <corners>:圆角,仅当形状为矩形时适用。

• android:radius:尺寸。所有角的半径。如果想要设置单独某个角,可以使用android:topLeftRadius、android:topRightRadius、android:bottomLeftRadius、android:bottomRightRadius。

4. <padding>:设置内边距。

• android:left:尺寸。设置左内边距。同样还有android:right、android:top、android:bottom供选择。

5. <size>:形状的大小。

• android:height:尺寸。形状的高度。

• android:width:尺寸。形状的宽度。

6. <solid>:填充形状的纯色。

• android:color:颜色。

7. <stroke>:形状的笔画

• android:width:尺寸。线宽。

• android:color:颜色。线的颜色。

• android:dashGap:尺寸。短划线的间距。虚线效果。

• android:dashWidth:尺寸。每个短划线的大小。虚线效果。

除了通过在XML中实现,我们同样可以通过代码来实现上面同样的效果。

ShapeDrawable文件路径:

frameworks/base/graphics/java/android/graphic/drawable/ShapeDrawable.java

ShapeDrawable定义:

public class ShapeDrawable extends Drawable {}

GradientDrawable

GradientDrawable(渐变可绘制对象):GradientDrawable用于实现渐变颜色效果的可绘制对象。它是ShapeDrawable的子类,可以用于绘制各种形状,并且可以设置渐变颜色、边框、圆角等属性。你可以通过代码创建一个GradientDrawable对象,并将其设置为一个View的背景,从而实现渐变效果。

介绍一下其属性:

1. <shape>:必备。根元素。

2. gradient:表示渐变的颜色。

• android:angle:整型。表示渐变的角度。0 表示为从左到右,90 表示为从上到上。注意:必须是 45 的倍数。默认值为 0。

• android:centerX:浮点型。表示渐变中心相对 X 轴位置 (0 - 1.0)。android:centerY同理。

• android:startColor:颜色。起始颜色。android:endColor、android:centerColor分别表示结束颜色与中间颜色。

• android:gradientRadius:浮点型。渐变的半径。仅在 android:type="radial" 时适用。

• android:type:渐变的类型。

• linear:线性渐变。默认为该类型。

• radial:径向渐变,也就是雷达式渐变,起始颜色为中心颜色。

• sweep:流线型渐变。

除了通过在XML中实现,我们同样可以通过代码来实现上面同样的效果。

GradientDrawable文件路径:

frameworks/base/graphics/java/android/graphic/drawable/GradientDrawable.java

GradientDrawable定义:

public class GradientDrawable extends Drawable {}

AnimationDrawable

AnimationDrawable(动画可绘制对象):AnimationDrawable用于创建逐帧动画的可绘制对象。你可以通过在XML文件中定义一系列帧,并设置每帧的持续时间来创建动画。

介绍一下其属性:

1. <animation-list>:必备。根元素。

2. <item>:每一帧的可绘制对象。

• android:drawable:必备。引用可绘制对象资源。

• android:duration:该帧的持续时间,单位为毫秒。

• android:oneshot:布尔值。代表是否只单次展示该动画,默认为false。

除了通过在XML中实现,我们同样可以通过代码来实现上面同样的效果。

AnimationDrawable文件路径:

frameworks/base/graphics/java/android/graphic/drawable/AnimationDrawable.java

AnimationDrawable定义:

public class AnimationDrawable extends DrawableContainer implements Runnable, Animatable {}

ColorDrawable

ColorDrawable是Android中用于绘制纯色背景的类。它是最简单的Drawable之一,用于代表单色可绘制区域。当ColorDrawable被绘制到画布上时,它会使用指定的颜色填充Paint,并在画布上绘制一块单色的区域。

ColorDrawable文件路径:

frameworks/base/graphics/java/android/graphic/drawable/ColorDrawable.java

ColorDrawable定义:

public class ColorDrawable extends Drawable {}

VectorDrawable

VectorDrawable是一种用于绘制矢量图形的类,它可以在不同分辨率的屏幕上保持图像的清晰度。相比于位图,矢量图具有以下优点:

  1. 文件大小较小:矢量图保存的是图形的数学描述,因此文件大小比位图要小很多。

  2. 缩放无损失:矢量图可以无损地缩放,不会导致图像模糊或失真。

  3. 支持动画效果:矢量图可以通过属性动画实现各种动画效果,如渐变、旋转、平移等。

  4. 自由填充色彩:矢量图可以通过修改颜色属性来实现自由填充色彩,使得图形更加灵活多变。

VectorDrawable文件路径:

frameworks/base/graphics/java/android/graphic/drawable/VectorDrawable.java

VectorDrawable定义:

public class VectorDrawable extends Drawable {}

ColorStateListDrawable

ColorStateListDrawable是一个Android中的Drawable对象,它是StateListDrawable和ColorStateList的组合。StateListDrawable是一个可以根据不同的状态显示不同的Drawable的容器,而ColorStateList是一个定义了不同状态下颜色值的列表。ColorStateListDrawable可以根据不同的状态显示不同的颜色。

ColorStateListDrawable文件路径:

frameworks/base/graphics/java/android/graphic/drawable/ColorStateListDrawable.java

ColorStateListDrawable定义:

public class ColorStateListDrawable extends Drawable implements Drawable.Callback {}

ScrollBarDrawable

ScrollBarDrawable是Android中用于绘制滚动条的类。

ScrollBarDrawable文件路径:

frameworks/base/graphics/java/android/graphic/drawable/ScrollBarDrawable.java

ScrollBarDrawable定义:

public class ScrollBarDrawable extends Drawable implements Drawable.Callback {}

三、Drawable相关流程分析

Drawable draw流程分析

Android13 Drawable draw流程分析-CSDN博客

Drawable setBounds流程分析

Android13 Drawable setBounds流程分析-CSDN博客

  • 12
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值