【Android Drawable】四、TransitionDrawable、InsetDrawable、ScaleDrawable、ClipDrawable 、RotateDrawable

TransitionDrawable

对应于 <transition> 标签,实现两个 Drawable 之间的淡入淡出效果。
它的语法和 LayerDrawable 一样,定义如下:

<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id=""
        android:drawable=""
        android:gravity=""
        android:top=""
        android:left=""
        android:bottom=""
        android:right=""
        android:width=""
        android:height=""
        android:start=""
        android:end=""/>
    <item />
</transition>

用作 View 的背景或 ImageView 的 Drawable 时,在代码中获取到 TransitionDrawable 对象,然后调用 TransitionDrawable # startTransition 方法开始淡入淡出的进行 Drawable 切换。
TransitionDrawable 类 public 的方法,参数是一个 Drawable 数组:

public TransitionDrawable(Drawable[] layers)

InsetDrawable

对应 <inset> 标签,将其它 Drawable 内嵌到自己当中,并在四周留出一定的间距,当一个 View 希望自己的背景比实际区域小时,可以采用 InsetDrawable 实现。
它的语法结构如下:

<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable=""
    android:inset=""
    android:insetLeft=""
    android:insetTop=""
    android:insetRight=""
    android:insetBottom=""
    android:visible="">
</inset>

inset 属性是内置 Drawable 相对 InsetDrawable 的偏移量,内置的 Drawable 通过 android:drawable 属性设置,也可以在 <inset> 标签内通过一系列标签定义 Drawable。
InsetDrawable 的构造方法:

public InsetDrawable(@Nullable Drawable drawable, int inset)
public InsetDrawable(@Nullable Drawable drawable, int insetLeft, int insetTop,int insetRight, int insetBottom)

参数就是 Drawable 对象和 inset 值

ScaleDrawable

对应 <scale> 标签,根据 level 将指定的 Drawable 缩放到一定比例。
语法类似于 InsetDrawable :

<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable=""
    android:level=""
    android:scaleGravity=""
    android:scaleWidth=""
    android:scaleHeight=""
    >
</scale>
  • Drawable 的引用使用 android:drawable 属性或者在标签内定义 Drawable;
  • android:scaleGravity 表示缩放后 Drawable 的位置,取值有 top、bottom、left、right 分别表示偏左上右下显示,center、center_vertical、center_horizontal 表示居中显示,fill、fill_vertical、fill_horizontal 表示拉伸、clip_vertical、clip_horizontal 表示裁剪
  • android:scaleWidth、android:scaleHeight 属性设置缩放的高度和宽度,取值为百分数,并不是缩放后的宽高占原来宽高的比例,而是宽度高度的取值在原来的基础上缩小的比例。所以该值越大,Drawable 就越小;
  • android:level ScaleDrawable 和内部的 Drawable 的 level 是一样的,当 level 为 0 时,ScaleDrawable 是不可见的,可以通过 android:level 属性设置 level,也可以通过 Drawable#setLevel 方法在代码中设置,level 的取值范围为 0~10000。
    ScaleDrawable 的宽高可以近似看做如下计算:

w -= (int) (w * mScaleState.mScaleWidth * (10000 - level) / 10000)
h -= (int) (h * mScaleState.mScaleHeight * (10000 - level) / 10000)

是根据缩放比例和等级在原来的基础上减去一定的值,并不是简单的倍数关系,很显然,当缩放比例越大,减去的值就越大,Drawable 就越小;level 值越大,减去的值就越小,Drawable 就越大,当 level 为 10000 时,Drawable 保持大小不变,当 level 为 0 时,Drawable 就无法显示出来了,不推荐将 level 取值大于 10000;
public 的构造方法只有一个,分别将 Drawable、gravity、scaleWidth、scaleHeight 作为参数传入:

public ScaleDrawable(Drawable drawable, int gravity, float scaleWidth, float scaleHeight)

ClipDrawable

对应 <clip> 标签,根据当前 level 裁剪另一个 Drawable,
语法如下:

<clip xmlns:android="http://schemas.android.com/apk/res/android"
   android:drawable=""
    android:clipOrientation=""
    android:gravity=""
    >
</clip>
  • android:drawable 图片的引用还是通过 drawable 属性或者在标签内定义 Drawable;
  • android:clipOrientation 有 vertical 和 horizontal 两个方向
  • android:gravity 需要和 clipOrientaion 属性一起作用,选项可以通过 | 来组合使用
  • top Drawable 放在容器顶部,大小不改变,如果为竖直裁剪,从底部开始裁剪;
  • bottom Drawable 放在容器底部,大小不改变,如果为竖直裁剪,从顶部开始裁剪;
  • left Drawable 放在容器左边,大小不改变,如果为水平裁剪,从右边开始裁剪;
  • right Drawable 放在容器右边,大小不改变,如果为水平裁剪,从左边开始裁剪;
  • center Drawable 居中,大小不改变,如果为竖直裁剪,从上下两边开始裁剪,如果为水平裁剪,从作用两边开始裁剪;
  • center_vertical Drawable 竖直居中,大小不改变,如果为竖直裁剪,从上下两边开始裁剪;
  • center_horizontal Drawable 水平居中,大小不改变,如果为水平裁剪,从左右两边开始裁剪;
  • fill Drawable 水平竖直方向填充容器,仅当等级为 0 时,才有裁剪行为;
  • fill_vertical Drawable 竖直方向上填充容器,如果为竖直裁剪,仅当等级为 0 时有效;
  • fill_horizontal Drawable 水平方向上填充容器,如果为水平裁剪,仅当等级为 0 时有效;
  • clip_vertival 附加项,表示竖直裁剪,较少使用
  • clip_horizontal 附加项,表示水平裁剪,较少使用

上面的属性规定了裁剪的方向和位置,裁剪的比例则是通过 level 设置的,在clip 标签中并没有 level 属性,只能在代码中通过 Drawable#setLevel
方法设置,level 取值 0 ~ 10000,0 表示完全裁剪,10000 表示不裁剪啊。
ClipDrawable 类的 public 构造方法只有一个,上面说的属性都是通过构造方法传入:

public ClipDrawable(Drawable drawable, int gravity, int orientation)

RotateDrawable

对应 <rotate> 标签,根据 level 将指定 Drawable 旋转的角度

<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable=""
    android:pivotX=""
    android:pivotY=""
    android:fromDegrees=""
    android:toDegrees="">
</rotate>

public 方法

public RotateDrawable()
public void setFromDegrees(float fromDegrees)
public void setToDegrees(float toDegrees)
public void setPivotX(float pivotX)
public void setPivotY(float pivotY)
public void setPivotYRelative(boolean relative)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容