PS:本文为转载文章,原文可读性会更好。文末附有原文链接。目录1、TransitionDrawable2、InsetDrawable3、ScaleDrawable1、TransitionDrawable我们是基于Android中的Drawable(二)本文继续分析其他常用的Drawable;xml文件中TransitionDrawable对应的标签是transition,实现两个Drawable之间的淡入淡出效果。为了更好的理解它,我们也先写了一个demo;(1)在drawable文件夹下新建my_transition.xml文件;现在img_3的图片如下;img_4的图片如下(2)Activity的布局文件activity_transition.xml如下图;<按钮android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/iv"android:onClick="onClick"android:text="按键"/>名称为TransitionActivity的Activity的处理总论如下所示;publicclassTransitionActivityextendsAppCompatActivity{ImageViewmIv;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_transition);mIv=findViewById(R.id.iv);}publicvoidonClick(Viewv){TransitionDrawabletransitionDrawable=(TransitionDrawable)mIv.getDrawable();transitionDrawable.startTransition(3000);}}一开始app的渲染图如下;当我们点击“按钮”时,3秒后会变成如下效果图;在my_transition.xml文件中,transition标签下的item标签其实是一个Drawable;一般我们使用TransitionDrawable作为ImageView的前景图,或者作为View的背景图,我们可以使用TransitionDrawable的startTransition和reverseTransition方法来实现淡入淡出的效果及其逆过程2、InsetDrawableInsetDrawable对应xml布局文件中的inset;如果想让View的背景比View本身小,可以使用InsetDrawable来实现,类似于Drawable的padding属性;InsetDrawable也可以实现自己嵌入其他Drawable,并且可以在周围留出一定的距离;好吧,为了更好的理解,我们也写了一个demo;(1)在drawable文件夹下新建my_inset_drawable.xml文件;(2)Activity的activity_inset_drawable.xml文件如下;应用运行结果如下;第一眼看,我们ImageView的区域就是红色背景的那个吧?ImageView的前景就是我们看到的图片对不对?很明显,图片距离ImageView顶部30dp,图片距离ImageView底部30dp;好了,下面来解释一下开发中常见的inset标签的属性;android:insetBottom:View的背景或前景在View实际区域的底部距离内android:insetTop:View的背景或前景在View实际区域的顶部内边距看法。android:insetRight:View的背景或前景在View实际区域的右内边距。android:insetLeft:View的背景或前景在View实际区域的左内边距。3.ScaleDrawableScaleDrawable对应xml文件中的scale标签。它可以根据自己的层级将指定的Drawable按一定的比例缩放。为了更好的理解,我们也先写了一个demo;(1)在drawable文件夹下新建一个scale_drawable.xml文件;(2)Activity的布局文件activity_scale_drawable.xml如下;(3)ScaleDrawableActivity,Activity的子类,处理ScaleDrawable;公共类ScaleDrawableActivity扩展AppCompatActivity{ImageViewiv;私有ScaleDrawablescaleDrawable;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_scale_drawable);;scaleDrawable=(ScaleDrawable)iv.getBackground();scaleDrawable.setLevel(1);}}app运行结果如下;OK,我们现在把ScaleDrawableActivity中的scaleDrawable.setLevel(1)这行代码改成scaleDrawable。setLevel(1000),然后再次运行app,效果图如下;看看有没有,图片明显变大了,看ScaleDrawable中setLevel方法中的参数,参数的取值范围是1-10000,在该值范围内,参数越大,内部越大可绘制的外观;比例绘图e的默认level是0,那么ScaleDrawable是不会显示的。我们可以将Drawable的级别设置为大于10000的值,比如10050,虽然可以正常工作,但是不建议这样做,可能会出现其他问题。刚才说了如果ScaleDrawable为0,那么ScaleDrawable就不能显示了。这是真的?我们来看看ScaleDrawable的draw(Canvascanvas)方法;看到level不为0时调用Drawable的draw方法了吗?好吧,让我们看看scale标签的属性;android:scaleGravity:相当于形状的android:gravity属性。android:scaleHeight:表示Drawable的高缩放比例。值越大,内部Drawable显示的高度越小。例如android:scaleHeight=70%",那么Drawable显示时高度只有原来的30%。android:scaleWidth:表示Drawable宽度的缩放比例,值越大,高度越小显示内部Drawable的宽度。例如android:scaleWidth=70%",则显示时Drawable的宽度只有原来宽度的30%。