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)
网友评论