Android 的Drawable

本文深入探讨了Drawable组件的多种类型及其应用场景,包括BitmapDrawable、NinePatchDrawable、ShapeDrawable等,并详细介绍了各组件的属性与配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Drawable表示的是一种可以在Canvas上进行绘制的抽象的概念,它的种类很多,最常见的颜色和图片都可以是一个Drawable。
Drawable一般是通过xml定义,但是也可以通过代码创建具体的Drawabl对象.
Drawable的内部宽/高参数比较重要,通过 getIntrinsicWidth 和 getIntrinsicHeight 这两个犯法可以获取到它们,但是,不是所有的Drawable都有内部宽/高。比如图片形成的Drawable的内部宽高,就是图片的宽高,但是颜色形成的Drawable它就没有内部宽高的概念。

BitmapDrawable

<?xml version="1.0" encoding="utf-8"?>
<bitmap
    android:src="@drawable/ic_check"
    android:antialias="true"
    android:dither="true"
    android:filter="true"
    android:gravity="center"
    android:tileMode="clamp"
    xmlns:android="http://schemas.android.com/apk/res/android" />
  • android:src : 图片的资源 id
  • android:antialias : 是否开启图片抗锯齿功能
  • android:dither : 是否开启抖动效果
  • android:filter : 是否开启过滤效果
  • android:gravity : 当图片小于容器的尺寸时,设置此选项可以对图片进行定位
  • android:mipMap : 纹理映射,一般不用,默认为 false
  • android:tileMode : 平铺模式,主要有以下几个值,开启平铺模式后gravity属性会被忽略
    disable: 关闭平铺模式,默认值
    repeat: 水平和竖直方向的平铺
    mirror: 水平和竖直方向上的镜面投影效果
    clamp: 四周像素扩展到周围

NinePatchDrawable

<nine-patch
    android:src="@drawable/ic_check"
    android:dither="true"
    xmlns:android="http://schemas.android.com/apk/res/android"/>

表示的是一张.9格式的图片

ShapeDrawable

<?xml version="1.0" encoding="utf-8"?>
<shape
    android:shape="rectangle"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <corners
        android:radius="1dp"
        android:topLeftRadius="1dp"
        android:topRightRadius="1dp"
        android:bottomLeftRadius="1dp"
        android:bottomRightRadius="1dp" />
    <gradient
        android:angle="10"
        android:centerX="1"
        android:centerY="1"
        android:centerColor="@color/divider_grey"
        android:endColor="@color/black_button"
        android:gradientRadius="1"
        android:startColor="@color/orange_button"
        android:type="linear"
        android:useLevel="true" />
    <padding
        android:left="1dp"
        android:top="1dp"
        android:right="1dp"
        android:bottom="1dp"/>
    <size
        android:width="20dp"
        android:height="20dp"/>
    <solid
        android:color="@color/cardview_shadow_end_color"/>
    <stroke
        android:width="1dp"
        android:color="@color/description_color"
        android:dashWidth="1dp"
        android:dashGap="1dp"/>
    </shape>

shape:
- android:shape : 表示图形的形状,有四种选项 rectangle(矩形),oval(椭圆),line(直线),ring(圆环),默认为矩形,line和ring必须通过标签指定线的宽度和颜色


corners:用于表示shape的四个角的圆角的程度,用px表示
- android:radius : 为四个角同时设置形同的角度
- android:topLeftRadius : 左上角角度
- andorid:topRightRadius : 右上角角度
- android:bottomLeftRadius : 左下角角度
- android:bottomRightRadius : 右下角角度


gradient: 与solid标签互斥,solid表示纯色填充,gradient表示渐变效果,
- android:angle : 渐变的角度,默认为0,值必须是45的倍数,0表示从左到右,90从下到上
- android:centerX : 渐变的中心点的横坐标
- android:centerY :渐变的中心点的纵坐标
- android:startColor : 渐变的起始色
- android:centerColor : 渐变的中间色
- android:endColor : 渐变的结果色
- android:gradientRadius : 渐变半径,仅当 *android:type=”radial”*时有效
- android:useLevel : 一般为false,当Drawable作为StateListDrawable时为true
- android:type : 渐变的类别,有 linear(线性渐变),radial(径向渐变),sweep(扫描线渐变)


solid: 纯色填充


:shape的描边
- android:width : 描边宽度
- android:color : 描边颜色
- android:dashWidth : 组成虚线的线段宽度
- android:dashGap : 组成虚线的线段之间的间隔


padding:空白

size :shape的大小,表示的是固有大小,但是不一定是最终显示大小

LayerDrawable

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/ic_check"
        android:top="1dp"
        android:left="1dp"
        android:right="1dp"
        android:bottom="1dp"/>
</layer-list>

表示的是一种层次化的Drawable集合,通过不同的Drawable放置在不同的层面上从而达到一种叠加后的效果,一个layer-list中可以包含多个item,默认情况下layer-list中的所有Drawable都会缩放到View的大小

StateListDrawable

<?xml version="1.0" encoding="utf-8"?>
<selector
    android:constantSize="true"
    android:dither="true"
    android:variablePadding="true"
    xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:drawable="@drawable/ic_check"
        android:state_pressed="true"
        android:state_focused="true"
        android:state_hovered="true"
        android:state_selected="true"
        android:state_checkable="true"
        android:state_checked="true"
        android:state_enabled="true"
        android:state_activated="true"
        android:state_window_focused="true"
        />
    <item
        android:drawable="#ffaaff"/>
</selector>

对应于selector标签,它也是Drawable集合,每个item对应这view的一种状态,这样系统机会根据view的状态来选择Drawable,主要用于可单击的view背景,最常见的是button

  • android:constantSize : StateListDrawable 的固有大小是否随着状态的改变而改变
  • andorid:dither : 是否开启抖动效果
  • andorid:variablePadding : StateListDrawable 的padding是否根据状态的改变而改变

系统会根据view的当前状态从selector中选择对应的item,每个itme对应着一个Drawable,系统从上至下匹配,直到找到第一个匹配的item,一般来说,默认的item应该放在selector的最后一条并且不附带任何状态

LeverListDrawable

<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/ic_check"
        android:maxLevel="5"
        android:minLevel="1"></item>
</level-list>

LeverListDrawable表示一个Drawable集合,集合中的每个Drawable都有一个等级的概念,根据不同的等级,LeverListDrawable会切换对应的Drawable,可以通过Drawable的setLevel方法来设置不同的等级从而切换具体的Drawable

TransitionDrawable

<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/ic_check"
        android:id="@+id/its"
        android:top="1dp"
        android:right="1dp"
        android:left="1dp"
        android:bottom="1dp"/>
    <item
        android:drawable="#ffaacc"/>
</transition>

用于实现两个Drawable之间的淡入淡出效果,可以通过它的 startTransition,和reverseTransition来实现淡入淡出的效果以及它的逆过程

      Button unlockButton=(Button)findViewById(R.id.unlock);
      TransitionDrawable drawable=(TransitionDrawable)unlockButton.getBackground();
      drawable.startTransition(1000);

InsetDrawable

InsetDrawable 对应于 inset 标签,它可以将其它的Drawable内嵌到自己当中,并可以在四周留出一段距离

ScaleDrawable

ScaleDrawable 对应于 scale标签,它可以根据自己的等级将指定的Drawable缩放到一定比例

<?xml version="1.0" encoding="utf-8"?>
<scale
    android:drawable="@drawable/ic_check"
    android:scaleGravity="center"
    android:scaleHeight="25%"
    android:scaleWidth="25%"
    xmlns:android="http://schemas.android.com/apk/res/android" />
  • scaleWidth : 缩放宽比例
  • scaleHeight :缩放高比例

ClipDrawable

<?xml version="1.0" encoding="utf-8"?>
<clip
    android:drawable="@drawable/ic_check"
    android:clipOrientation="vertical"
    android:gravity="center"
    xmlns:android="http://schemas.android.com/apk/res/android" />

ClipDrawable 对应于标签clip,它可以根据自己当前的等级来裁剪Drawable,clipOrientation 表示裁剪方向

       Button unlockButton=(Button)findViewById(R.id.unlock);
       ClipDrawable drawable=(ClipDrawable)unlockButton.getBackground();
       drawable.setLevel(1);

Drawable的等级有范围的,0~10000,最小等级是0,最大等级是10000,对于ClipDrawable来说,等级0表示完全裁剪,等级1000表示不裁剪

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值