ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
#### 6.2.9 ClipDrawable ClipDrawable对应于`<clip>`标签,它可以根据自己当前的等级(level)来裁剪另一个Drawable,裁剪方向可以通过android:clipOrientation和android:gravity这两个属性来共同控制,它的语法如下所示。 <? xml version="1.0" encoding="utf-8"? > <clip xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/drawable_resource" android:clipOrientation=["horizontal" | "vertical"] android:gravity=["top" | "bottom"|"left" | "right"|"center_vertical" | "fill_vertical"|"center_horizontal"|"fill_horizontal" | "center" | "fill"|"clip_vertical"|"clip_horizontal"] /> 其中clipOrientation表示裁剪方向,有水平和竖直两个方向,gravity比较复杂,需要和clipOrientation一起才能发挥作用,如表6-4所示。另外gravity的各种选项是可以通过“|”来组合使用的。 :-: 表6-4 ClipDrawable的gravity属性 ![](https://img.kancloud.cn/ea/25/ea252085da688425497886431e22e19d_993x632.png) 下面举个例子,我们实现将一张图片从上往下进行裁剪的效果,首先定义ClipDrawable, xml如下: <? xml version="1.0" encoding="utf-8"? > <clip xmlns:android="http://schemas.android.com/apk/res/android" android:clipOrientation="vertical" android:drawable="@drawable/image1" android:gravity="bottom" /> 在上面的XML中,因为我们要实现顶部的裁剪效果,所以裁剪方向应该为竖直方向,同时从表6-4可以知道,gravity属性应该选择bottom。有了ClipDrawable如何使用呢?也是很简单的,首先将它设置给ImageView,当然也可以作为普通View的背景,如下所示。 <ImageView android:id="@+id/test_clip" android:layout_width="100dp" android:layout_height="100dp" android:src="@drawable/clip_drawable" android:gravity="center" /> 接着在代码中设置ClipDrawable的等级,如下所示。 ImageView testClip = (ImageView) findViewById(R.id.test_clip); ClipDrawable testClipDrawable = (ClipDrawable) testClip.getDrawable(); testClipDrawable.setLevel(5000); 在6.2.5节中已经提到,Drawable的等级(level)是有范围的,即0~10000,最小等级是0,最大等级是10000,对于ClipDrawable来说,等级0表示完全裁剪,即整个Drawable都不可见了,而等级10000表示不裁剪。在上面的代码中将等级设置为8000表示裁剪了2000,即在顶部裁剪掉20%的区域,被裁剪的区域就相当于不存在了,具体效果如图6-6所示。 :-: ![](https://img.kancloud.cn/5d/ee/5dee8fbf9aa1d293188e8bde889b6aaf_830x588.png) 图6-6 ClipDrawable的裁剪效果 对于本例来说,等级越大,表示裁剪的区域越小,因此等级10000表示不裁剪,这个时候整个图片都可以完全显示出来;而等级0则表示裁剪全部区域,这个时候整个图片将不可见。另外裁剪效果还受裁剪方向和gravity属性的影响,表6-4中的选项读者可以自行尝试一下,这样就能比较好地理解不同属性对裁剪效果的影响了。