Android中Drawable整体介绍

前言

Drawable表示一种可以在Canvas上进行绘制的抽象的概念,它有很多种,常见的如颜色和图片都可以是一个Drawable。

优点

使用简单,比自定义View的成本要低
非图片类型的Drawable占空间较小

说明

简单来讲,其可以理解为:图像、
它不全是图片,通过颜色也可以构造出各种各样的图片效果,它一般就是当做View的背景使用,他有两种方式,一种是通过XML,一种是通过代码的方式。

android.graphics.drawable

理解

Drawable是“可以绘制的东西”的一般抽象。 大多数情况下,您将使用Drawable作为绘制事物到屏幕上的资源的类型; Drawable类提供了一个通用的API来处理可能采取各种形式的底层视觉资源。 与视图不同,Drawable没有任何接收事件或与用户交互的功能。

除了简单的绘制,Drawable还为客户提供了一些通用的机制来与正在绘制的内容进行交互,也就是一些公共的方法。

Drawable尽管对于应用程序通常不可见,但Drawable可以采用多种形式:

Bitmap:最简单的Drawable,一个PNG或JPEG图像。

Nine Patch:是对PNG格式的扩展允许它指定如何对其进行拉伸和放置的信息

Vector:向量:在XML文件中定义的可绘制的一组点,线和曲线以及相关的颜色信息。 这种类型的绘图可以缩放而不会损失显示质量。

Shape:形状:包含简单的绘图命令而不是原始位图,允许在某些情况下调整更好。

Layers:图层:一个可绘制的复合物,它在彼此顶部绘制多个底层可绘图。

States:状态,一个复合drawable,根据其状态选择一组drawable中的一个。

Levels:级别:一个复合drawable,根据其级别从一组drawable中选择一个。

Scale:比例尺:一个可绘制的单个子组合可绘制的组合,其整体大小根据当前级别进行修改。
官方介绍

Drawable的直接子类与非直接子类介绍

AdaptiveIconDrawable自适应图标,API26提出,分为前景与背景

AnimatedVectorDrawableAPI21提出,使用ObjectAnimator或AnimatorSet定义的动画来动画VectorDrawable的属性。

BitmapDrawable 一个可绘制的位图,可以平铺,拉伸或对齐。

ColorDrawable专门的Drawable,用指定的颜色填充Canvas。

DrawableContainer包含多个Drawable并选择使用哪个的助手类.

    AnimationDrawable用于创建逐帧动画的对象,由一系列Drawable对象定义,可用作View对象的背景。

    LevelListDrawable级别列表,定义管理大量备选可绘制对象的可绘制对象,每个可绘制对象都分配有最大的备选数量

    StateListDrawable状态列表,此 XML 文件为不同状态引用不同位图图形

            AnimatedStateListDrawableAPI21,Drawable包含一组可绘制的关键帧,其中当前显示的关键帧是基于当前状态集来选择的

DrawableWrapper只有一个子元素的可绘制容器。API23

    ClipDrawable根据Drawable的当前级别值剪切另一个Drawable的一个Drawable。

    InsetDrawable将另一个Drawable插入距离边界的距离的一个Drawable。

    RotateDrawable可以根据当前级别的值旋转另一个Drawable的Drawable

    ScaleDrawable根据当前级别值更改另一个Drawable的大小的Drawable。

GradientDrawable带按钮,背景等颜色渐变的Drawable

LayerDrawable管理一系列其他Drawable的Drawable。

    RippleDrawable可绘制的,显示响应状态变化的连锁反应。比如波纹,API21

    TransitionDrawable LayerDrawables的扩展,旨在在第一层和第二层之间交叉淡入淡出。

NinePatchDrawable 可调整大小的位图,带有可定义的可伸缩区域。

PictureDrawable 包装图片的可绘制子类,允许在支持Drawable的任何地方使用图片。

ShapeDrawable 绘制原始形状的可绘制的Drawable

    PaintDrawable

VectorDrawable这使您可以基于XML矢量图形创建绘图。API21

公共的方法

Public methods(公共方法)

(void)
applyTheme(Resources.Theme t)

给Drawable使用特定主题或者其子类,其参数不能为空

(boolean)
canApplyTheme()

Api 21添加,判断是否能应用主题

(void)
clearColorFilter()

Api  21 添加,删除此drawable的颜色过滤器

(final Rect)
copyBounds()

在新的Rect中返回可绘制边界的副本。 这将返回与getBounds()相同的值,但返回的对象将保证不会被drawable更改(即不保留对此rect的引用)。
 如果调用者已经分配了Rect,则调用copyBounds(rect)。

(final void)
copyBounds(Rect bounds)

在指定的Rect(由调用者分配)中返回可绘制边界的副本。 当它的draw()方法被调用时,边界指定了这个位置的绘制位置。

(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)

Api 21
使用可选的Resources.Theme从XML文档创建drawable

(static Drawable)
createFromXmlInner(Resources r, XmlPullParser parser, AttributeSet attrs, Resources.Theme theme)

Api 21
使用可选的Resources.Theme从XML文档中创建一个drawable。 调用定位在XML文档中标签的解析器,尝试从该标签创建一个Drawable。
 如果标签不是有效的drawable,则返回null。

(static Drawable)
createFromXmlInner(Resources r, XmlPullParser parser, AttributeSet attrs)

从XML文档中创建。 调用定位在XML文档中标签的解析器,尝试从该标签创建一个Drawable。 如果标签不是有效的drawable,则返回null。

(abstract void)
draw(Canvas canvas)

绘制在其边界(通过setBounds设置)尊重可选效果,如alpha(通过setAlpha设置)和颜色过滤器(通过setColorFilter设置)

(int)
getAlpha()

Api 19
获取drawable的当前alpha值。 0表示完全透明,255表示完全不透明。 这个方法是由Drawable子类实现的,返回的值是特定于该类如何处理alpha的。
 如果类没有重写此方法以返回特定于其使用的alpha值,则默认返回值为255。

(final Rect)
getBounds()

返回drawable的边界Rect。 注意:为了提高效率,返回的对象可能是存储在drawable中的相同的对象(尽管这是不能保证的),
所以如果需要一个持续的边界副本,请调用copyBounds(rect)。 你也不应该改变这个方法返回的对象,因为它可能是存储在drawable中的同一个对象

(Drawable.Callback)
getCallback()

Api 11
返回附加到此Drawable的当前Drawable.Callback实现。

(int)
getChangingConfigurations()

返回此drawable可能更改的配置参数的掩码,要求重新创建它。 默认实现返回通过setChangingConfigurations(int)或默认情况下提供的0。 子类可以将其扩展到它们所拥有的任何其他drawable的变化配置中。

(ColorFilter)
getColorFilter()

Api 21
返回当前的颜色过滤器,如果没有设置,则返回null。

(Drawable.ConstantState)
getConstantState()

返回包含此Drawable的共享状态的Drawable.ConstantState实例。

(Drawable)
getCurrent()

该drawable将使用的当前drawable。 对于简单的drawable,这只是drawable本身。 对于像StateListDrawable和LevelListDrawable那样改变状态的
可绘图,这将是当前正在使用的可绘制子对象。
该值永远不会为空。

(Rect)
getDirtyBounds()

Api 21
返回drawable的肮脏边界Rect。 注意:为了提高效率,返回的对象可能是存储在drawable中的同一个对象(尽管这是不能保证的)。

(void)
getHotspotBounds(Rect outRect)

Populates outRect with the hotspot bounds.

(int)
getIntrinsicHeight()

返回drawable的内在高度。固有高度是可拉伸件要放置的高度,包括任何固有的填充。 如果drawable没有固有的高度,例如纯色,则此方法返回-1。

(int)
getIntrinsicWidth()

返回drawable的内部宽度。
固有宽度是可展开的布局的宽度,包括任何固有的填充。 如果drawable没有固有的宽度,则此方法返回-1。

(int)
getLayoutDirection()

Api 23
返回此Drawable的解析布局方向。
一共有两个: LAYOUT_DIRECTION_LTR, LAYOUT_DIRECTION_RTL

(final int)
getLevel()

检索当前级别。

(int)
getMinimumHeight()

返回此Drawable建议的最小高度。 如果一个View使用这个Drawable作为背景,那么建议View使用至少这个值来表示它的高度。 (这里有些情况是不可能的)。
这个值应该包含任何填充。
这个Drawable建议的最小高度。 如果此Drawable没有建议的最小高度,则返回0。

(int)
getMinimumWidth()

返回此Drawable建议的最小宽度。 如果一个View使用这个Drawable作为背景,那么建议View至少使用这个值来表示它的宽度。 (这里有些情况是不可能的)。
这个值应该包含任何填充。这个Drawable建议的最小高度。 如果此Drawable没有建议的最小高度,则返回0。

(abstract int)
getOpacity()

返回此Drawable的不透明度/透明度

(void)
getOutline(Outline outline)

调用drawable来填充定义其绘图区域的Outline。
这个方法被默认的ViewOutlineProvider调用来定义视图的轮廓。

(boolean)
getPadding(Rect padding)

返回填充由此Drawable建议的内嵌将内容放置在drawable的边界内。 正值向Drawable的中心移动(设置Rect.inset)。

(int[])
getState()

将当前状态描述为基本状态的联合,例如state_focused,state_selected等。一些drawable可以基于所选状态来修改其图像。

(Region)
getTransparentRegion()

返回表示Drawable完全透明的部分的Region。 这可以用来执行绘图操作,标识渲染Drawable时目标的哪些部分不会改变。 默认实现返回null,
表示没有透明区域; 如果子类可以提供这个优化信息,子类可以有选择地覆盖这个返回实际的区域,但是这并不是必须的。

(void)
inflate(Resources r, XmlPullParser parser, AttributeSet attrs, Resources.Theme theme)

从可选的由主题样式的XML资源中扩展此Drawable。 每个Drawable不能被调用一次以上。 请注意,框架可能已经调用了一次从XML资源创建Drawable实例。

(void)
inflate(Resources r, XmlPullParser parser, AttributeSet attrs)

Inflate this Drawable from an XML resource.

(void)
invalidateSelf()

Use the current Drawable.Callback implementation to have this Drawable redrawn.

(boolean)
isAutoMirrored()

Api 19
当它的布局方向是从右到左的RTL时,告诉它是否自动镜像.

(boolean)
isFilterBitmap()

Api 21
这个drawable是否可以过滤它的位图

(boolean)
isStateful()

指示此drawable是否将根据状态更改其外观。 客户端可以使用它来确定是否有必要计算他们的状态并调用setState。

final boolean isVisible()

(void)
jumpToCurrentState()

Api 11
如果此Drawable确实在状态之间转换动画,请立即跳转到当前状态并跳过任何活动的动画。

(Drawable)
mutate()

Make this drawable mutable.

(boolean)
onLayoutDirectionChanged(int layoutDirection)

当drawable的解析布局方向改变时调用。

(static int)
resolveOpacity(int op1, int op2)

为两个源不透明度返回适当的不透明度值。 如果其中任一个是未知的,则返回; 否则,
如果是TRANSLUCENT,则返回; 否则,如果是透明的,则返回; 否则,返回OPAQUE。

(void)
scheduleSelf(Runnable what, long when)

使用当前的Drawable.Callback实现来绘制这个Drawable。 如果Drawable没有回调,则不执行任何操作。

(abstract void)
setAlpha(int alpha)

为drawable指定一个alpha值。 0表示完全透明,255表示完全不透明。

(void)
setAutoMirrored(boolean mirrored)

设置当其布局方向为RTL(从右到左)时是否自动镜像此Drawable。

(void)
setBounds(int left, int top, int right, int bottom)

为Drawable指定一个边界矩形。 当draw()方法被调用时,这是drawable绘制的地方

(void)
setBounds(Rect bounds)

Specify a bounding rectangle for the Drawable.

(final void)
setCallback(Drawable.Callback cb)

Bind a Drawable.Callback object to this Drawable.

(void)
setChangingConfigurations(int configs)

设置该drawable可能更改的配置参数的掩码,要求重新创建。

(void)
setColorFilter(int color, PorterDuff.Mode mode)

指定一个颜色和Porter-Duff模式作为该drawable的颜色过滤器。

(abstract void)
setColorFilter(ColorFilter colorFilter)

为绘图指定一个可选的颜色过滤器。
如果Drawable具有ColorFilter,Drawable的绘图内容的每个输出像素在混合到Canvas的渲染目标之前将被颜色过滤器修改。
通过null删除任何现有的颜色过滤器。

(void)
setDither(boolean dither)

设置为true时,在绘制到每个颜色分量少于8位的设备时,绘制它的颜色。

(void)
setFilterBitmap(boolean filter)

设置为true时,缩放或旋转时使可绘制滤镜的位图具有双线性采样。
当位图旋转时,这可以改善外观。 如果drawable不使用位图,则忽略此调用。

(void)
setHotspot(float x, float y)

指定drawable内的热点位置。

(void)
setHotspotBounds(int left, int top, int right, int bottom)

Sets the bounds to which the hotspot is constrained, if they should be different from the drawable bounds.

(final boolean)
setLayoutDirection(int layoutDirection)

设置该drawable的布局方向。 应该是一个已经解决的布局方向,因为Drawable没有能力自己做决议。

(final boolean)
setLevel(int level)

Specify the level for the drawable.
0-10000

(boolean)
setState(int[] stateSet)

Specify a set of states for the drawable.

(void)
setTint(int tintColor)

Specifies tint color for this drawable.
指定色调颜色

(void)
setTintList(ColorStateList tint)

Specifies tint color for this drawable as a color state list.

(void)
setTintMode(PorterDuff.Mode tintMode)

Specifies a tint blending mode for this drawable.

(boolean)
setVisible(boolean visible, boolean restart)

设置此Drawable是否可见。 这通常不会影响Drawable的行为,但是是一些Drawable可以使用的提示,例如,决定是否运行动画。
Boolean visible:如果可见,则设置为true,否则设为false。
Boolean restart:你可以在这里提供真实的信息来强制drawable的行为,就像它刚刚变得可见一样,即使它最后被设置为可见。 
用于例如强制动画重新启动。

(void)
unscheduleSelf(Runnable what)

使用当前的Drawable.Callback实现使此Drawable不受调度。 如果Drawable没有回调,则不执行任何操作。

上述翻译的Adroid API ,另外慢慢还要整理各种详细的子类。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容