6_Android的Drawable

Android的Drawable

1、Drawable简介

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

熟练掌握各种类型的Drawable可以方便我么做出一些特殊的UI效果,这一点在UI相关的开发工作中尤为重要。

drawable在开发中有着自己的优点:①、它使用简单,比自定义View的成本要低;②、非图片类型的Drawable占用空间较小,这对减小apk的大小很有帮助。

drawable有很多种,它们都表示一种图像的概念,但是它们又不全是图片,通过颜色也可以构造出各式各样的图像效果。在实际开发中,Drawable常被用来作为View的背景,Drawable一般都是通过xml来定义的

2、Drawable分类

1)、BitmapDrawable:

这几乎是最简单的Drawable,它表示的就是一张图片。在实际开发中,我们可以直接引用原始的图片即可。

2)、ShapeDrawable:

ShapeDrawable是一种很常见的Drawable,可以理解为通过颜色来构造的图形,它既可以是纯色的图形,也可以是具有渐变效果的图形。android:shap属性:rectangle(矩形)、oval(椭圆)、line(横线)、ring(圆环),默认值时矩形。

<corners>:表示shape的四个角度。只适用于矩形shape

<gradient>:它与<solid>标签是互相排斥的,其中solid表示纯色填充,而gradient表示渐变效果。

<solid>:表示纯色填充

<stroke>:描边

<padding>内边距

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <stroke
        android:width="1px"
        android:color="@color/color_stroke_challenge_list" />
    <solid android:color="@android:color/white" />
</shape>

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <solid android:color="#ff0000" />

    <corners
        android:bottomLeftRadius="0dp"
        android:bottomRightRadius="15dp"
        android:topLeftRadius="10dp"
        android:topRightRadius="15dp" />

</shape>

3)、LayerDrawable

LayerDrawable对应的XML标签是<layer-list>,它表示一种层次化的Drawable集合,通过将不同的Drawable放置在不同的层上面从而达到一种叠加后的效果。

默认情况下,layer-list中所有的Drawable都会被缩放至View的大小,对于bitmap来说,需要使用android:gravity属性才能控制图片的显示效果。Layer-list有层次的概念,下面的item会覆盖上面的item,通过合理的分层,可以实现一些特殊的叠加效果。

代码示例:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@android:id/background">
        <shape>
            <corners android:radius="1.5dp" />
            <solid android:color="#B4C2D7"/>
        </shape>
    </item>
    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="1.5dp" />
                <solid android:color="#F66969"/>
            </shape>
        </clip>
    </item>
</layer-list>



  <SeekBar
        android:id="@+id/record_seekbar"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:max="100"
        android:maxHeight="2.5dp"
        android:minHeight="2.5dp"
        android:progress="0"
        android:thumb="@mipmap/follow_say_seekbar_thumb_drag"
        android:progressDrawable="@drawable/follow_say_record_seekbar_style" />
界面效果:


4)、StateListDrawable

StateListDrawable对应于<selector>标签,它也表示Drawable集合,每个Drawable都对应着View的一种状态,这样系统就会根据View的状态来选择合适的Drawable。StateListDrawable主要用于设置可单击的View的背景,最常见的是Button。

StateListDrawableDrawable在实际开发中应用场景非常多。

系统会根据View当前的状态从selector中选择对应的item,每个item对应着一个具体的Drawable,系统按照从上到下的顺序查找,直至查找到第一条匹配的item。一般来说,默认的item都应该放在selector的最后一条并且不附带任何状态,这样当上面的item都无法匹配View当前状态时,系统就会选择默认的item,因为默认的item不附带状态,所有它可以匹配View的任何状态。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@mipmap/icon_notification_has_normal" android:state_pressed="false"/>
    <item android:drawable="@mipmap/icon_notification_has_press" android:state_pressed="true"/>
</selector>
5)、LevelListDrawable

LevelListDrawable对应于<level-list>标签,它同样表示一个Drawable集合,集合中的每个Drawable都有一个等级(level)的概念。根据不同的等级,levelListDrawable会切换为对应的Drawable。

使用场景:android系统电池状态改变的显示。

<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:maxLevel="1" android:drawable="@drawable/image1" />
  <item android:maxLevel="2" android:drawable="@drawable/image2" />
  <item android:maxLevel="3" android:drawable="@drawable/image3" />
  <item android:maxLevel="4" android:drawable="@drawable/image4" />
  <item android:maxLevel="5" android:drawable="@drawable/image5" />
 </level-list>
<ImageView 
        android:id="@+id/imgView"
        android:src="@drawable/level_list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

6)、TransitionDrawable

TransitionDrawable对应于<transition>标签,它用于实现两个Drawable之间的淡入淡出效果。

<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:drawable="@drawable/shape_drawable_gradient_linear"/>
    <item android:drawable="@drawable/shape_drawable_gradient_radius"/>

</transition>

7)、InsetDrawable

InsertDrawable对应于<inset>标签,它表示将其他Drawable内嵌到自己当中,并可以在四周留出一定的间距。当一个View希望自己的背景比自己的实际区域小的时候,可以采用InsetDrawable来实现,同时我们也知道,通过LayerDrawable也可以实现这种效果。

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetBottom="15dp"
    android:insetLeft="15dp"
    android:insetRight="15dp"
    android:insetTop="15dp" >

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

8)、ScaleDrawable

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

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/image1"
    android:scaleHeight="70%"
    android:scaleWidth="70%"
    android:scaleGravity="center" />

9)、ClipDrawable

ClipDrawable对应于<clip>标签,它可以根据自己当前的等级来裁剪另一个Drawable,裁剪方向可以通过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/image1"
    android:gravity="bottom" />

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值