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

TransitionDrawable

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


    
    

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

public TransitionDrawable(Drawable[] layers)

InsetDrawable

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



inset 属性是内置 Drawable 相对 InsetDrawable 的偏移量,内置的 Drawable 通过 android:drawable 属性设置,也可以在 标签内通过一系列标签定义 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

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



  • 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

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



  • 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

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



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)

你可能感兴趣的:(【Android Drawable】四、TransitionDrawable、InsetDrawable、ScaleDrawable、ClipDrawable 、RotateDrawable)