【Android】Drawable 基础

【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:innerRadiusandroid:thicknessandroid:innerRadiusRatioandroid:thicknessRatioandroid: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:dashWidthandroid:dashGap有任何一个为0,那么虚线效果将不能生效。
  • <padding> :表示空白,但是它表示的不是 shape 的空白,而是包含它的 View 的空白,有四个属性:android:leftandroid:topandroid:rightandroid: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:topandroid:bottomandroid:leftandroid: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_pressed true / false 控件是否处于按下状态(手指触摸未抬起)。 按钮被点击时显示高亮或按下效果。
    android:state_focused true / false 控件是否获得焦点 键盘或遥控器操作时高亮当前选中项(常用于 TV、键盘导航)。
    android:state_hovered true / false 控件是否处于鼠标悬停状态 鼠标或手写笔悬停在控件上时触发(常用于平板或 TV)。
    android:state_selected true / false 控件是否被选中 用于切换按钮、标签页或导航项的选中状态。
    android:state_checkable true / false 控件是否可被选中 例如 CheckBox 或 Switch 等可选控件。
    android:state_checked true / false 控件当前是否已被选中 例如 CheckBox、RadioButton 选中时显示不同效果。
    android:state_enabled true / false 控件是否可用 控件被禁用(false)时通常显示灰色或半透明状态。
    android:state_activated true / false 控件是否处于激活状态 一般用于标记当前激活的元素(如列表中被激活的项)。
    android:state_window_focused true / 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:minLevelandroid: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:topandroid:bottomandroid:leftandroid: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:insetTopandroid:insetBottomandroid:insetLeftandroid: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 时显示完整,中间值会线性映射到 scaleWidthscaleHeight 对应的比例范围。可以通过 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 附加选项,表示水平方向的裁剪,较少使用
相关推荐
AlianNiew5 小时前
从源码到实战:用 Java 打造“限时+防重放”的文件安全预览链接
java·后端
null or notnull6 小时前
java服务器空间不够时:将多个服务器的文件存放至同一个服务器上(使用映射器的办法)
java·运维·服务器·java-ee
代码栈上的思考6 小时前
JVM中内存管理的策略
java·jvm
YoungP6 小时前
【Effective Java 条目二】-- 当构造器参数较多时考虑使用生成器
java
野生技术架构师6 小时前
牛客网Java 高频面试题总结(2025最新版)
java·开发语言·面试
Jerry6 小时前
构建 Compose 界面
android
纪莫6 小时前
技术面:SpringBoot(springboot的类加载和传统的双亲委派有什么区别、如何按顺序实例化Bean)
java·spring·java面试⑧股
kyle~7 小时前
CPU调度---协程
java·linux·服务器·数据库·c++20
会飞的小蛮猪7 小时前
Skywalking运维之路(Skywalking服务搭建)
java·运维·监控