Android ClipDrawable
Clip 可以译为剪的意思,我们可以把 ClipDrawable 理解为从位图上剪下一个部分
Android 中的进度条就是使用 ClipDrawable
来实现的,它根据设置 level 的值来决定剪切
区域的大小
ClipDrawable
根节点是 <clip>
属性 | 说明 |
---|---|
android:clipOrietntion | 设置剪切的方向,可以设置水平和竖直2个方向 |
android:gravity | 从那个位置开始裁剪 |
android: drawable | 引用的 drawable 资源,为空的话需要有一个 Drawable 类型的子节点 |
范例
-
创建一个 空的 Android 项目
cn.twle.android.ClipDrawable
-
下载 /static/i/meimei.jpg 并把图片放到
res/drawable
目录 -
定义一个
ClipDrawable
资源red/drawable/clip_image.xml
<?xml version="1.0" encoding="utf-8"?> <clip xmlns:android="http://schemas.android.com/apk/res/android" android:clipOrientation="horizontal" android:drawable="@drawable/meimei" android:gravity="left" />
-
修改
activity_main.xml
添加一个ImageView
将
android:src
设置为 clipDrawable@drawable/clip_image
注意:是 src ,如果设置
android:background
会报错<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:id="@+id/img_show" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="center" android:src="@drawable/clip_image" /> </LinearLayout>
-
修改
MainActivity.java
通过代码修改ClipDrawable
的 level 的值Level的值是 0~10000
package cn.twle.android.clipdrawable; import android.graphics.drawable.ClipDrawable; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.ImageView; import java.util.Timer; import java.util.TimerTask; public class MainActivity extends AppCompatActivity { ClipDrawable cd; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 0x123) { cd.setLevel(cd.getLevel() + 500); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView img_show = (ImageView) findViewById(R.id.img_show); // 核心实现代码 cd = (ClipDrawable) img_show.getDrawable(); final Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { handler.sendEmptyMessage(0x123); if (cd.getLevel() >= 10000) { timer.cancel(); } } }, 0, 300); } }