Android之Drawable

简介

Drawable是一种可以在Canvas上进行绘制的抽象的概念,种类繁多,最常见的颜色和图片都可以是一个Drawable。

表示一种图像的概念(不一定是图片,可以是颜色形成的图像)
一般没有大小的概念,当作为View的背景时,Drawable会被拉伸至View的同等大小

BitmapDrawable(可直接引用,也可在XML文件中设置)

<?xml version="1.0" encoding="utf-8"?>
<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/pic15"         //图片资源id
    android:antialias="true"              //是图片变得平滑
    android:dither="true"                 //开启抖动,高质量图片在低质量设备上更好的显示
    android:filter="true"                 //图片拉伸或压缩情况下更好的显示
    android:mipMap="false"                //纹理映射,默认false
    android:gravity="center_horizontal"   //设置位置,可使用“|”多选  
    android:tileMode="clamp"              //平铺模式(clamp、repeat、mirror、disable四种模式)
    />

ShapeDrawable(通过颜色构造图形,可以纯色也可以渐变色)

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">//形状(矩形rectangle,椭圆oval,横线line,圆环ring)

    <solid android:color="#ff0000" />//纯色填充
     
    <corners//表示shape的四个角度,只适用于矩形
        android:bottomLeftRadius="0dp"
        android:bottomRightRadius="15dp"
        android:topLeftRadius="10dp"
        android:topRightRadius="15dp" />

    <gradient//渐近色填充
        android:centerColor="#00ff00"//渐变中间颜色
        android:endColor="#0000ff"//渐变结束颜色
        android:startColor="#ff0000"//渐变起始颜色
        android:centerX="0.5"//渐变中心的的横坐标
        android:centerY="0.5"//渐变中心的的纵坐标
        android:angle="0"//渐变角度,必须是45的倍数
        android:type="linear" />//渐变类别(线性,径向radio,扫描线sweep)

    <padding android:left="20dp" />//包含shape的view的空白

    <size//shape的大小(ShapeDrawable的固有宽高,当作为View的背景时会被拉伸或压缩)
        android:height="30dp"
        android:width="30dp" />

    <stroke//shape的描边
        android:dashGap="2dp"//组成虚线的线段间隔
        android:dashWidth="10dp"//组成虚线的线段宽度
        android:width="2dp"//描边的宽度
        android:color="#00ff00" />//描边的颜色

</shape>

LayerDrawable(层次化的Drawable 集合)包含多个item,每一个item就是一个Drawable

对应于XML中的<layer-list>标签

StateListDrawable

表示Drawable 集合

  • 对应于<selector>标签
  • 每个item代表一个Drawable,每个Drawable 对应着View的一种状态,系统会根据View的状态选择合适的Drawable,主要用于设置可点击的View
  • 一般将默认的状态设置在最后,所有的都不匹配的时候使用最后一个状态
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
    android:constantSize="true"//大小不随状态改变
    android:dither="true"//抖动属性
    android:variablePadding="false">//padding不随状态改变

    <item android:state_pressed="true"
          android:drawable="@color/colorAccent"/>
    <item android:state_pressed="false"
          android:drawable="@color/colorPrimary"/>
    <item android:drawable="@color/colorPrimaryDark"/>

</selector>

LevelListDrawable

Drawable 集合,每一个Drawable 都有等级
  • 对应于<level-list>标签
  • 作为View的背景时,使用Drawable的setLevel设置不同等级从而做到切换具体的Drawable
  • 作为ImageView的前景时,使用ImageView的setImageLevel切换Drawable
  • 等级范围是0-10000
<?xml version="1.0" encoding="utf-8"?>
<level-list
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/pic15"
        android:maxLevel="0"/>

    <item android:drawable="@drawable/pic16"
        android:maxLevel="1"/>
</level-list>

TransitionDrawable

  • 对应于<transition>标签
  • 用于实现两个Drawable之间的淡入淡出效果
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/pic15"/>
    <item android:drawable="@drawable/pic16"/>
</transition>

<TextView
    android:id="@+id/hello"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/mytransition"/>

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    android.widget.TextView textView = (android.widget.TextView) findViewById(R.id.hello);
    TransitionDrawable drawable = (TransitionDrawable) textView.getBackground();
    drawable.startTransition(1000);
}

InsetDrawable

  • 将其他Drawable内嵌到自己当中,并且可以在四周留出空白
  • 对应于<inset>标签
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
       android:insetBottom="80dp"
       android:insetLeft="30dp"
       android:insetRight="105dp"
       android:insetTop="0dp">

    <shape android:shape="rectangle">
        <solid android:color="#ff0000"/>
    </shape>
</inset>

ScaleDrawable

根据自己的等级将自己的Drawable缩放一定的比例
  • 对应于<scale>标签
  • 等级为0,ScaleDrawable不可见
  • ScaleDrawable的级别越大,内部的drawable就越大
  • ScaleDrawable在XML中所定义的缩放比例越大,内部的就drawable越小
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/pic15"
    android:scaleHeight="70%"
    android:scaleWidth="70%"
    android:scaleGravity="center">

</scale>

<TextView
    android:id="@+id/hello"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/myscale"/>

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    android.widget.TextView textView = (android.widget.TextView) findViewById(R.id.hello);
    ScaleDrawable scaleDrawable = (ScaleDrawable) textView.getBackground();
    scaleDrawable.setLevel(1);
}

ClipDrawable

根据自己当前等级裁剪另一个Drawable 
  • 对应于<clip>标签
  • 裁剪方向通过android:clipOrientation和android:gravity两个属性决定
  • 等级越大剪切越少

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

<TextView
    android:id="@+id/hello"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/myclip"/>

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    android.widget.TextView textView = (android.widget.TextView) findViewById(R.id.hello);
    ClipDrawable clipDrawable = (ClipDrawable) textView.getBackground();
    clipDrawable.setLevel(8000);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值