Drawable详解

2017-11-23  本文已影响0人  笔墨Android

不怕跌倒,所以飞翔

关于Drawable的一些说明类的文字我就不写了,但是Drawable其实挺重要的,一些问题都关联着Drawable.

1.Drawable分类

1.1BitmapDrawable详解

这几乎是最简单都得Drawable了,他表示的就是一张图片.在实际开发中,我们可以直接引用原始的图片,可可以通过XNML的方式来描述它,通过XML来描述的BitmapDrawable可以设置更多的效果,如下所示(这里先说一下可以设置的属性):

1.2NinePatchDrawable详解

它代表的是一张.9格式的图片,.9图片可以自动的根据所需要的高/宽进行相应的缩放并保证不失真,和BitmapDrawable一样,在实际使用中直接引用图片即可,里面用到的属性都一样,只是要通过<nine-path>标签进行描述.这里面src设置的图片要是一张.9的图,这个就比较尴尬了,why?为什么我不直接设置背景.

1.3ShapeDrawable详解

很常见的Drawable,可以理解为通过颜色来构造的图形,它既可以是纯色的图形,也可以是具有渐变效果的图形.(这里其实用的是shape标签常见的Drawable,其实体类实际是GradientDrawable),基本上有些简单的背景我们都可以使用这个标签去写

<corners>标签

<gradient>标签
它与<solid>标签时互相排斥的,<solid>表示纯色,而<gradient>表示渐变效果

<solid>

<stroke>

这里面注意一点就是如果android:dashWidth或者android:dashGap有一个为0则虚线不会出现

<padding>

<size>

1.4LayerDrawable详解

LayerDrawable对应的xml标签时<layer-list>,它表示一个层次话的Drawable集合,通过将不同的Drawable(可以时shape或者是其他的类型)放置在不同的层上面从而达到一种叠加后的效果.

一个简单的layer-list中可以包含多个item,每个item表示一个Drawable(代表一层,并且一层一层的叠加).Item的结构也比较简单,比较常见的属性有:android:top/bottom/left/right 它们分别表示Drawable相对于View的上下左右的偏移量,单位时像素.另外我们可以使用android:drawable属性来直接引用一个已有的Drawable资源,也可以在item中自定义Drawable.默认情况下,layer-list中的所有Drawable都会被缩至View的大小,相对于bitmap来说,需要使用android:gravity属性才能控制图片的显示效果.Layer-list有层次的概念,下面的item会覆盖上面的item,通过合理的分层,可以实现一些特殊的叠加效果.

1.4StateListDrawable详解

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

可以使用的一些标签说明

<item>标签表示具体Drawable,他的结构也比较简单,但是里面主要的就是状态的Drawable信息.

1.5LevelListDrawable详解

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

这里面也是每一个Item代表一个Drawable,但是设置等级只有两个等级,最大和最小,可以使用ImageView.setImageLevel方法来切换Drawable.最小值时0,最大值时10000.

1.6TransitionDrawable详解

TransitionDrawable对应<transition>标签,它用于实现两个Drawable的淡入淡出效果(注意Drawable,不是View,别和动画那个混了)

属性的问题都差不多,但是这里要你直接让你使用你还真不一定会.

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

然后把这个当成一张图片设置给一个View,然后通过startTransiton(1000)进行开启,使用reverseTransition()关闭这个东西.其实我觉得这个动画效果和你点击换一张图片一样只是有一个时间差,有一个渐变效果.

1.7InsetDrawable详解

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

上面这四个代表内凹的大小

其实这个里面也是可以放一些其他标签的如<shape>,直接在<inset>中添加<shape>标签就可以了,还可以添加<bitmap>等其他标签

1.8ScaleDrawable详解

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

ps这里的等级可以使用对象.setLevel()方法进行设置,也可以用过getLevel()方法进行获取,但是当等级为0的时候这张图片是不会显示的因为

1.9ClipDrawable详解

ClipDrawable对应于<Clip>标签,它可以根据自己当前的等级(level)来裁剪另一个Drawable,裁剪方向可以通过android:clipOrientation和android:gravity这两个属性来控制

ps这个裁剪比例是按照你设置的等级进行裁剪的,打个比方,当你把等级设置成8000的时候,那么裁剪了2000,也就是裁剪了20%


上面只是一个基础的概念,其实关于Drawable基本上就是上面这些基本的类的使用,这里面使用的只是xml形式的,其实很多背景图片我们都能使用上面这些方法进行设置,平时多注意的话,能减少很多和美工的争执....

上一篇 下一篇

猜你喜欢

热点阅读