ClipDrawable代表从其他位图上截取的一个"图片片段"。在XML文件中定义ClipDrawable对象使用<clip.../>元素,该元素的语法为:
<?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"] />
上面的语法格式中可指定如下三个属性:
- android:drawable:指定截取的源Drawable对象。
- android:clipOrientation:指定截取方向,可设置水平截取或垂直截取。
- android:gravity:指定截取时的对齐方式。
使用ClipDrawable对象时可调用setLevel(int level)方法来设置截取的区域大小,当level为0时,截取的图片片段为空;当level为10000时,截取整张图片。
下面以一个示例来说明ClipDrawable对象的用法。
实例:徐徐展开的风景
因为ClipDrawable对象可调用setLevel(int level)控制截取图片的部分,因此本示例只要设置一个定时器,让程序不断调用ClipDrawable的setLevel(int level)方法即可实现图片徐徐展开的效果。
程序先定义如下ClipDrawable对象。
程序清单my_clip.xml
<?xml version="1.0" encoding="utf-8"?> <clip xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/shuangta" android:clipOrientation="horizontal" android:gravity="center" > </clip>
上面的程序控制从中间开始截取图片,截取方向为水平截取。接下来程序将通过一个定时器来定期修改ClipDrawable对象的level,即可实现图片徐徐展开的效果。
package com.example.studyresources; import java.util.Timer; import java.util.TimerTask; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.graphics.drawable.ClipDrawable; import android.view.Menu; import android.widget.ImageView; public class ClipDrawableTest extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_clip_drawable_test); ImageView imageView=(ImageView)findViewById(R.id.image); //获取图片所显示的ClipDrawable对象 final ClipDrawable drawable=(ClipDrawable)imageView.getDrawable(); final Handler handler=new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub //如果该程序是本程序所发送的 if(msg.what==0x123) { //修改ClipDrawable的level值 drawable.setLevel(drawable.getLevel()+200); } } }; final Timer timer=new Timer(); timer.schedule(new TimerTask(){ @Override public void run() { // TODO Auto-generated method stub Message msg=new Message(); msg.what=0x123; //发送消息,通知应用修改ClipDrawable对象的Level值 handler.sendMessage(msg); //取消定时器 if(drawable.getLevel()>=10000) { timer.cancel(); } } }, 0,300); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.clip_drawable_test, menu); return true; } }
运行上面的程序,将看到如图6.6所示的结果。
从图6.6所示的运行结果可以看出,通过使用这种徐徐展开的图片,用户会感觉就像进度条一样——实际上,实际应用中完全可以用这种ClipDrawable对象来实现图片进度条。