【Android】Drawable 基础
Drawable 简介
Drawable 是 Android 中用于表示 "可绘制对象" 的抽象类,是所有可绘制资源的基类,为开发者提供了一种统一的方式来处理各种图形和图像资源。与 View 不同的是,Drawable 不会处理用户交互事件(如点击、滑动),它只是纯粹的 "画图工具"。
Drawable 有很多种,它们都表示一种图像的概念,但是它们又不全是图片,通过颜色也可以构造出各式各样的图像效果。Drawable 一般都是通过 XML 来定义的,也可以通过代码来创建具体的 Drawable 对象。
Drawable 的内部宽高参数比较重要,它的内部宽高指的是通过 getIntrinsicWidth() 和 getIntrinsicHeight() 方法获取到的宽高值。这个宽高值代表了 Drawable 自身的固有尺寸,它反映了 Drawable 在不考虑外部因素时的大小。对于 BitmapDrawable 来说,其内部宽高就是所包装位图的实际宽高;而对于 ShapeDrawable,如果在 XML 中通过标签设置了 width 和 height 属性,那么这两个属性值就是其内部宽高,若未设置,则默认返回 -1,表示没有固定的内部宽高。
然而,Drawable 的内部宽高并不等同于它在界面上实际显示的大小。一般情况下,Drawable 本身并没有固定的大小概念,它的实际显示大小往往取决于其所在的 View 的大小以及相关的布局参数。当我们将一个 Drawable 设置为 View 的背景时,Drawable 会被拉伸或缩放,以适应 View 的大小。如果将一个内部宽高为 100x100 像素的 BitmapDrawable 设置为一个宽 200dp、高 150dp 的 ImageView 的背景,那么这个 BitmapDrawable 会被拉伸,以填满整个 ImageView 的区域,其实际显示大小就变成了 200dp x 150dp。
Drawable 的使用
Drawable 的种类繁多,常见的有 BitmapDrawable、ShapeDrawable、LayerDrawable 以及StateListDrawable 等,下面分别介绍它们的使用方式。
BitmapDrawable
BitmapDrawable 是 Android 中最常见的 Drawable 之一,它主要用于包装位图(Bitmap),并将其作为 Drawable 在 Android 界面中显示。BitmapDrawable 就像是一个 "容器",将 Bitmap 对象封装其中,使得我们可以方便地在各种 View 中使用位图资源,如设置 ImageView 的图片、作为 View 的背景等。它在显示图片时起着关键作用,能够根据不同的需求对图片进行缩放、拉伸、平铺等操作,以适应不同的布局和显示要求。
在实际开发中,可以直接引用原始图片即可,当你在布局中写:
            
            
              xml
              
              
            
          
          android:background="@drawable/bg"
        如果 bg.png 是一张普通图片,那么 Android 实际上会在底层自动创建一个 BitmapDrawable 对象来显示它。
也可以通过 XML 的方式来描述它,可以设置更多的效果。语法如下:
            
            
              xml
              
              
            
          
          <bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@[package:]drawable/drawable_resource"
    android:antialias=["true" | "false"]
    android:dither=["true" | "false"]
    android:filter=["true" | "false"]
    android:gravity="center"
    android:tileMode=["true" | "false"] />
        XML 属性:
- 
src :指定要显示的位图资源,通过
@drawable/资源名的形式引用,用于确定要显示的具体图片。 - 
antialias:用于开启或关闭抗锯齿功能。当设置为 true 时,会对图片边缘进行平滑处理,使图片在缩放或拉伸时边缘更加平滑,视觉效果更好。同时也会在一定程度上降低图片清晰度,但是这个降低的幅度较低以至于可以忽略。
 - 
dither:用于开启或关闭图像抖动处理。当位图的颜色深度与显示屏幕的像素配置不匹配时,开启抖动可以使图片在低色彩显示环境下仍能保持较好的视觉效果,减少颜色失真。
 - 
filter:用于开启或关闭滤镜。当图片进行收缩或拉伸操作时,设置为 true 可以使用滤镜使图片看起来更加平滑,避免出现锯齿状。
 - 
gravity:用于指定当位图大小比它所在的容器小时,位图在容器中的位置。这个属性的可选项比较多,不同的选项可以通过 "|" 来组合使用。
可选项 含义 top 将图片放在容器的顶部,不改变图片的大小 bottom 将图片放在容器的底部,不改变图片的大小 left 将图片放在容器的左部,不改变图片的大小 right 将图片放在容器的右部,不改变图片的大小 center_vertical 图片竖直方向填充容器 fill_vertical 图片竖直方向填充容器 center_horizontal 图片水平方向填充容器 fill_horizontal 图片水平方向填充容器 center 使图片在水平和竖直方向同时居中,不改变图片的大小 fill 图片在水平和竖直方向均填充容器,这是默认值 clip_vertical 附加选项,表示竖直方向的裁剪,较少使用 clip_horizontal 附加选项,表示水平方向的裁剪,较少使用  - 
mipMap:用于指定是否开启 mipmap 暗示。mipmap 是一种图像金字塔技术,开启后可以在图片缩放时提高渲染性能,减少锯齿和模糊现象。
 - 
tileMode:定义平铺模式。当设置了该属性时,位图将会重复显示,并且 gravity 属性将失效。取值有disabled(默认值,不启用平铺)、clamp(复制位图边缘的颜色来填充容器剩下的空白部分)、repeat(复制整个位图来填充容器)、mirror(与repeat类似,但是是交替的镜像复制,即相邻的两张是镜像对称的)。平铺模式下的图片显示效果如下:
 

ShapeDrawable
ShapeDrawable 是一种可以通过代码或 XML 定义几何形状的可绘制对象。它能够绘制多种基础图形,如矩形、圆形、线条、椭圆或环形等,并支持为这些形状设置填充色、描边色、圆角、以及渐变效果等属性。借助 ShapeDrawable,我们无需使用图片资源就能灵活地绘制出多样化的图形样式。在 Android 开发中,它常被用于自定义控件的视觉效果,比如按钮背景、进度条轨道、卡片边框或分隔线等场景。
ShapeDrawable 语法稍复杂,如下所示:
            
            
              xml
              
              
            
          
          <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape=["rectangle" | "oval" | "line" | "ring"] >
    <!-- 定义形状的圆角 -->
    <corners
        android:radius="integer"
        android:topLeftRadius="integer"
        android:topRightRadius="integer"
        android:bottomLeftRadius="integer"
        android:bottomRightRadius="integer" />
    <!-- 定义渐变填充 -->
    <gradient
        android:angle="integer"
        android:centerX="float"
        android:centerY="float"
        android:centerColor="color"
        android:startColor="color"
        android:endColor="color"
        android:gradientRadius="integer"
        android:type=["linear" | "radial" | "sweep"]
        android:useLevel=["true" | "false"] />
    <!-- 定义内边距(会应用到使用此drawable的View上) -->
    <padding
        android:left="integer"
        android:top="integer"
        android:right="integer"
        android:bottom="integer" />
    <!-- 定义drawable的固有大小(不改变View本身大小,常用于缩放) -->
    <size
        android:width="integer"
        android:height="integer" />
    <!-- 定义纯色填充 -->
    <solid android:color="color" />
    <!-- 定义描边(边框) -->
    <stroke
        android:width="integer"
        android:color="color"
        android:dashWidth="integer" 
        android:dashGap="integer" />
</shape>
        需要注意的是
<shape>创建的 Drawable,其实体类实际上是GradientDrawable类型,它是ShapeDrawable的功能增强版。
XML 属性:
- 
shape :表示图形的形状,有四个选项:rectangle(矩形)、oval(椭圆)、line(横线)和 ring(圆环)。它的默认值是矩形,另外 line 和 ring 这两个选项必须要通过标签来指定线的宽度和颜色等信息,否则将无法达到预期的显示效果。针对ring这个形状,有5个特殊的属性:
android:innerRadius、android:thickness、android:innerRadiusRatio、android:thicknessRatio和android:useLevel,含义如下表所示:属性 (Attribute) 描述 (Description) android:innerRadius圆环的内半径,和 android:innerRadiusRatio同时存在时,以android:innerRadius为准android:thickness圆环的厚度,即外半径减去内半径的大小,和 android:thicknessRatio同时存在时,以android:thickness为准android:innerRadiusRatio内半径占整个 Drawable 宽度的比例,默认值为 9。如果为 n,那么内半径 = 宽度 / n android:thicknessRatio厚度占整个 Drawable 宽度的比例,默认值为 3。如果为 n,那么厚度 = 宽度 / n android:useLevel一般都应该使用 false,否则有可能无法到达预期的显示效果,除非它被当作 LevelListDrawable来使用 - 
<corners> :用于定义矩形的四个角的弧度,只有在
android:shape="rectangle"时有效。它有如下5个属性:android:radius------为四个角同时设定相同的角度,优先级较低,会被其他四个属性覆盖;android:topLeftRadius------设定最上角的角度;android:topRightRadius------设定右上角的角度;android:bottomLeftRadius------设定最下角的角度;android:bottomRightRadius------设定右下角的角度。
 - 
<gradient>:用于定义使用渐变色填充图形。属性如下:
android:angle------渐变的角度,默认为0,其值必须为45的倍数,0表示从左到右,90表示从下到上,具体的效果需要自行体验,总之角度会影响渐变的方向;android:centerX------渐变中心的 X 坐标,取值为 0 - 1,0 表示最左边,1 表示最右边;android:centerY------渐变中心的 Y 坐标,取值为 0 - 1,0 表示最上边,1 表示最下边;android:startColor------渐变的起始色;android:centerColor------渐变的中间色;android:endColo------渐变的结束色;android:gradientRadius------渐变半径,仅当android:type= "radial"时有效;android:useLevel------一般为 false ,当 Drawable 作为StateListDrawable使用时为 true;android:type------渐变类型,取值有linear(线性渐变)、radial(径向渐变)、sweep(扫描渐变),默认为线性渐变。
 - 
<solid> :表示纯色填充,只有一个属性
android:color,指定填充的颜色值。 - 
<stroke>:shape 的描边,属性如下:
android:width------描边的宽度,越大则 shape 的边缘线就会看起来越粗;android:color------描边的颜色;android:dashWidth------组成虚线的线段的宽度;android:dashGap------组成虚线的线段之间的间隔,间隔越大则虚线看起来空隙就越大。注意如果android:dashWidth和android:dashGap有任何一个为0,那么虚线效果将不能生效。

 - 
<padding> :表示空白,但是它表示的不是 shape 的空白,而是包含它的 View 的空白,有四个属性:
android:left、android:top、android:right和android:bottom。 - 
<size> :用于指定形状(ShapeDrawable / GradientDrawable)的固定宽高,它告诉系统这个 Drawable 在没有被外层约束时应该有多大。用于控制其在没有外部约束或多层组合时的绘制尺寸,但在实际布局中是否生效还要看外层 View 是否强制定义了大小。
 
LayerDrawable
LayerDrawable 是一种可以将多个 Drawable 按层叠加绘制的复合图形资源。它相当于一个"图层容器",可以让你把不同的图片、形状或其他 Drawable 按照顺序组合在一起。通过 LayerDrawable,我们可以方便地实现一些更复杂的视觉效果,比如:在背景上叠加阴影层、为图标加上边框或高光、制作带多层渐变的按钮等。每一层的 Drawable 都可以单独设置偏移、大小或对齐方式,从而精确地控制整个组合图形的呈现效果。语法如下所示:
            
            
              xml
              
              
            
          
          <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@[package:]drawable/drawable_resource"
        android:id="@[+][package:]id/resource_name"
        android:top="dimension"
        android:right="dimension"
        android:bottom="dimension"
        android:left="dimension" />
</layer-list>
        在一个 <layer-list> 中,可以包含多个 <item>,每个 <item> 都代表一个独立的 Drawable 图层。每个图层都可以通过 android:top、android:bottom、android:left、android:right 属性来设置与 View 边界的偏移量(单位为像素),从而控制它在整体图形中的位置。
在 <item> 中,可以使用 android:drawable 直接引用已有的 Drawable 资源,也可以在内部重新定义一个新的 Drawable。默认情况下,<layer-list> 中的所有 Drawable 都会自动被拉伸以匹配外层 View 的大小。如果想精确控制位图(bitmap)的显示方式,需要通过 android:gravity 属性来设置它的对齐或显示区域。
<layer-list> 是按层次从上到下绘制的,位于列表后面的 <item> 会覆盖前面的内容。通过合理地控制图层顺序和偏移,可以实现多层叠加、阴影、高光等丰富的视觉效果。
示例(带阴影的圆角按钮背景):

StateListDrawable
StateListDrawable 是一种根据 View 不同状态 自动切换显示内容的 Drawable。它通常用于按钮、文字控件等可点击 View 的背景,使控件在不同交互状态下(如按下、选中、禁用等)呈现不同的视觉效果。借助 StateListDrawable,我们可以为每种状态定义对应的 Drawable 资源,从而让界面在用户操作时产生清晰的反馈,提升交互的流畅感与层次感。它的语法如下所示:
            
            
              xml
              
              
            
          
          <selector xmlns:android="http://schemas.android.com/apk/res/android"
    android:constantSize=["true" | "false"]
    android:dither=["true" | "false"]
    android:variablePadding=["true" | "false"]>
    <item
        android:drawable="@[package:]drawable/drawable_resource"
        android:state_pressed=["true" | "false"]
        android:state_focused=["true" | "false"]
        android:state_hovered=["true" | "false"]
        android:state_selected=["true" | "false"]
        android:state_checkable=["true" | "false"]
        android:state_checked=["true" | "false"]
        android:state_enabled=["true" | "false"]
        android:state_activated=["true" | "false"]
        android:state_window_focused=["true" | "false"]/>
</selector>
        - 
constantSize:用于控制 StateListDrawable 的固有大小是否会随状态变化而改变。当设置为 true 时,StateListDrawable 的大小在不同状态下保持不变,它会取内部所有 Drawable 的最大宽高作为统一的固有尺寸;而当设置为 false(默认值)时,切换状态会根据对应 Drawable 的固有大小动态调整。
 - 
dither:表示是否启用抖动效果。开启后,当图像的颜色深度与显示屏不匹配时,系统会通过混合像素的方式来减轻色带现象,使图片在低质量屏幕上依然显示平滑。该属性默认值为 true。
 - 
variablePadding:用来控制 padding 是否随状态变化而变化。当为 true 时,StateListDrawable 在切换不同状态时会使用对应 Drawable 的 padding;当为 false(默认值)时,StateListDrawable 使用所有 Drawable 中 padding 最大的值作为统一的内边距。通常不建议开启该选项,以避免布局跳动或显示不一致的问题。
 - 
<item> :表示一个具体的 Drawable,它的结构也比较简单,其中
android:drawable是一个已有 Drawable 的资源 id,剩下的属性表示的是 View 的各种状态,每个 item 表示的都是一种状态下的 Drawable 信息。 View 的常见状态如下:属性名 取值 含义说明 常见应用场景 android:state_pressedtrue/false控件是否处于按下状态(手指触摸未抬起)。 按钮被点击时显示高亮或按下效果。 android:state_focusedtrue/false控件是否获得焦点。 键盘或遥控器操作时高亮当前选中项(常用于 TV、键盘导航)。 android:state_hoveredtrue/false控件是否处于鼠标悬停状态。 鼠标或手写笔悬停在控件上时触发(常用于平板或 TV)。 android:state_selectedtrue/false控件是否被选中。 用于切换按钮、标签页或导航项的选中状态。 android:state_checkabletrue/false控件是否可被选中。 例如 CheckBox 或 Switch 等可选控件。 android:state_checkedtrue/false控件当前是否已被选中。 例如 CheckBox、RadioButton 选中时显示不同效果。 android:state_enabledtrue/false控件是否可用。 控件被禁用( false)时通常显示灰色或半透明状态。android:state_activatedtrue/false控件是否处于激活状态。 一般用于标记当前激活的元素(如列表中被激活的项)。 android:state_window_focusedtrue/false控件所在的窗口是否获得焦点。 当应用窗口失去焦点(如弹出对话框或切换应用)时触发。 注意:
- 在一个 
<item>元素里同时指定多个状态属性 ,这样只有当这些状态同时满足时,这个<item>对应的 Drawable 才会被使用。 <item>标签是按顺序匹配的,第一个符合条件的就会被使用。- 没有状态条件的 
<item>通常放在最后,表示默认情况。 
 - 在一个 
 
示例(按钮不同状态的背景):
            
            
              xml
              
              
            
          
          <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 按下状态 -->
    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <solid android:color="#388E3C" /> 
            <corners android:radius="8dp" />
        </shape>
    </item>
    <!-- 默认状态 -->
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#4CAF50" /> 
            <corners android:radius="8dp" />
        </shape>
    </item>
</selector>
        效果如下:

LevelListDrawable
LevelListDrawable 是一种根据"等级(Level)值"动态切换显示内容的 Drawable 集合。它内部可以包含多个 Drawable 项(<item>),每个项都定义了一个显示范围,通过 android:minLevel 和 android:maxLevel 来指定。当通过代码调用 setLevel(int level) 方法时,系统会根据当前的 level 值,自动选择匹配范围内的 Drawable 进行显示,从而实现根据数值动态切换图形的效果。在实际开发中,LevelListDrawable 常用于实现音量指示、信号强度显示、进度图标等与数值变化相关的可视化效果。它的语法如下所示:
            
            
              xml
              
              
            
          
          <level-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@[package:]drawable/drawable_resource"
        android:maxLevel="integer"
        android:minLevel="integer" />
</level-list>
        - minLevel :定义该项 Drawable 能够显示的 最小 level 值(包含)。
 - maxLevel :定义该项 Drawable 能够显示的 最大 level 值(包含)。
 - 等级范围:0 ~ 10000,最小等级是 0,也是默认值,最大等级是10000。
 
当调用 drawable.setLevel(x) 时,系统会从上到下遍历<item>找到第一个满足:minLevel <= x <= maxLevel的项,然后显示该项对应的 Drawable。
TransitionDrawable
TransitionDrawable 是一种支持两张 Drawable 之间淡入淡出动画过渡的可绘制对象(Drawable)。它常用于实现图片或背景的平滑切换效果,比如按钮按下的渐变、图片轮播的柔和过渡、夜间模式与日间模式背景切换等。它的语法如下所示:
            
            
              xml
              
              
            
          
          <transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@[package:]drawable/drawable_resource"
        android:id="@[+][package:]id/resource_name"
        android:top="dimension"
        android:right="dimension"
        android:bottom="dimension"
        android:left="dimension" />
</transition>
        上面语法中的属性前面已经介绍过了,其中android:top、android:bottom、android:left、android:right仍然表示的是 Drawable 四周的偏移量,这里不多介绍了。
TransitionDrawable 本质上是继承自 LayerDrawable 的,但它只包含两层:
- 第 0 层:起始 Drawable(初始状态)
 - 第 1 层:结束 Drawable(目标状态)
 
当调用 startTransition() 时,系统会在这两层之间执行一个透明度渐变动画,逐渐将上层 Drawable 淡入、下层 Drawable 淡出,形成平滑的过渡效果。主要方法:
startTransition(int durationMillis):开始从第一张图过渡到第二张图,参数为动画时长(毫秒)。reverseTransition(int durationMillis):反向执行动画(从第二张图过渡回第一张图)。resetTransition():重置状态,立即回到初始图像。
InsetDrawable
InsetDrawable 是一种用于在目标区域内给 Drawable 添加内边距(即"缩进")的 Drawable 类型。它可以让一个 Drawable 在其容器中按指定的距离缩进显示,从而在视觉上留出边距或实现内容的居中显示。它不会改变原 Drawable 的内容,而是通过调整绘制区域的位置来控制显示的内边距。常用于需要给背景图或前景图留白、实现嵌套效果、或与其他 Drawable 组合时调整布局间距的场景。它的语法如下:
            
            
              xml
              
              
            
          
          <inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@[package:]drawable/drawable_resource"
    android:insetTop="dimension"
    android:insetRight="dimension"
    android:insetBottom="dimension"
    android:insetLeft="dimension" />
        上面的属性都比较好理解,其中android:insetTop、android:insetBottom、android:insetLeft、android:insetRight分别表示顶部、底部、左边和右边内凹的大小。
ScaleDrawable
ScaleDrawable 是一种可根据"等级(level)"动态缩放内部 Drawable 尺寸的可绘制对象。它通常用于根据某种数值(例如进度、音量、电池电量等)动态改变图形显示比例,从而实现视觉上的变化效果。它的语法如下:
            
            
              xml
              
              
            
          
          <scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@[package:]drawable/drawable_resource"
    android:scaleGravity="center"
    android:scaleWidth="percentage"
    android:scaleHeight="percentage" />
        - scaleGravity:控制缩放方向和对齐方式,取值与含义等同于 shape 中的 gravity。
 - scaleWidth:控制水平方向的缩放比例。取值范围通常是 0~1,表示按 level 缩放的百分比。
 - scaleHeight:控制垂直方向的缩放比例。
 
ScaleDrawable 的缩放是由 level(0~10000) 控制的。level = 0 时完全隐藏(缩放为 0%),level = 10000 时显示完整,中间值会线性映射到 scaleWidth、scaleHeight 对应的比例范围。可以通过 Drawable.setLevel(int level) 动态修改缩放程度。
ClipDrawable
ClipDrawable 是一种根据 "等级(level)" 动态裁剪内部 Drawable 的可绘制对象。它可以让一个 Drawable 只显示部分内容,裁剪的方向和位置可以自定义。通常用于实现进度条、音量条、能量槽等可视化填充效果。它的语法如下:
            
            
              xml
              
              
            
          
          <clip xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/drawable_resource"
    android:clipOrientation=["horizontal"|"vertical"]
    android:gravity="center" />
        - clipOrientatiton:裁剪方向,有水平(horizontal)和竖直(vertical)两个方向。
 - gravity:裁剪起点,决定从哪边开始裁剪。属性值如下:
 
| 选项 | 含义 | 
|---|---|
| top | 将内部的 Drawable 放在容器的顶部,不改变它的大小。如果为竖直裁剪,那么从底部开始裁剪 | 
| bottom | 将内部的 Drawable 放在容器的底部,不改变它的大小。如果为竖直裁剪,那么从顶部开始裁剪 | 
| left | 将内部的 Drawable 放在容器的左边,不改变它的大小。如果为水平裁剪,那么从右边开始裁剪,这是默认值 | 
| right | 将内部的 Drawable 放在容器的右边,不改变它的大小。如果为水平裁剪,那么从左边开始裁剪 | 
| center_vertical | 使内部的 Drawable 在容器中竖直居中,不改变它的大小。如果为竖直裁剪,那么从上下同时开始裁剪 | 
| fill_vertical | 使内部的 Drawable 在竖直方向上填充容器。如果为竖直裁剪,那么仅当 ClipDrawable 的等级为 0(0 表示 ClipDrawable 被完全裁剪,即不可见)时,才能有裁剪行为 | 
| center_horizontal | 使内部的 Drawable 在容器中水平居中,不改变它的大小。如果为水平裁剪,那么从左右两边同时开始裁剪 | 
| fill_horizontal | 使内部的 Drawable 在水平方向上填充容器。如果为水平裁剪,那么仅当 ClipDrawable 的等级为 0 时,才能有裁剪行为 | 
| center | 使内部的 Drawable 在容器中水平和竖直方向都居中,不改变它的大小。如果为竖直裁剪,那么从上下同时开始裁剪;如果为水平裁剪,那么从左右同时开始裁剪 | 
| fill | 使内部的 Drawable 在水平和竖直方向上同时填充容器。仅当 ClipDrawable 的等级为 0 时,才能有裁剪行为 | 
| clip_vertical | 附加选项,表示竖直方向的裁剪,较少使用 | 
| clip_horizontal | 附加选项,表示水平方向的裁剪,较少使用 | 
| 的 Drawable 在水平方向上填充容器。如果为水平裁剪,那么仅当 ClipDrawable 的等级为 0 时,才能有裁剪行为 | |
| center | 使内部的 Drawable 在容器中水平和竖直方向都居中,不改变它的大小。如果为竖直裁剪,那么从上下同时开始裁剪;如果为水平裁剪,那么从左右同时开始裁剪 | 
| fill | 使内部的 Drawable 在水平和竖直方向上同时填充容器。仅当 ClipDrawable 的等级为 0 时,才能有裁剪行为 | 
| clip_vertical | 附加选项,表示竖直方向的裁剪,较少使用 | 
| clip_horizontal | 附加选项,表示水平方向的裁剪,较少使用 |