ClipDrawable代表從其它位元影像上截取一個“圖片片段”。在XML檔案中使用<clip.../>元素定義ClipDrawable對象,可指定如下三個屬性:
android:drawable:指定截取的源Drawable對象
android:clipOrientation:指定截取的方向,可設定為水平截取或垂直截取
android:gravity:指定截取時的對齊
使用ClipDrawable對象時可以調用setLevel(int level)方法來設定截取的地區大小,當level為0時,截取的圖片片段為空白;當level為10000時,截取整張圖片。
通過以上說明,我們發現,可以使用ClipDrawable的這種性質控制截取圖片的地區大小,讓程式不斷調用setLevel方法並改變level的值,達到讓圖片慢慢展開的效果。
首先,我們定義一個ClipDrawable對象:
[html]
<?xml version="1.0" encoding="UTF-8"?>
<clip
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/muller"
android:clipOrientation="horizontal"
android:gravity="center" >
</clip>
<?xml version="1.0" encoding="UTF-8"?>
<clip
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/muller"
android:clipOrientation="horizontal"
android:gravity="center" >
</clip>
接下來,簡單設定下布局檔案,使得圖片能夠顯示在螢幕上(注意ImageView的src屬性的選擇):
[html]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<ImageView
android:id="@+id/view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/clip" />
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<ImageView
android:id="@+id/view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/clip" />
</LinearLayout>
下面在主程式中設定一個定時器來改變level值:
[java]
public class MainActivity extends Activity
{
private ImageView view=null;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
super.setContentView(R.layout.activity_main);
this.view=(ImageView)super.findViewById(R.id.view);
//擷取圖片所顯示的ClipDrawable對象
final ClipDrawable drawable=(ClipDrawable) view.getDrawable();
final Handler handler=new Handler()
{
@Override
public void handleMessage(Message msg)
{
//如果訊息是本程式發送的
if(msg.what==0x123)
{
//修改ClipDrawable的level值
drawable.setLevel(drawable.getLevel()+200);
}
}
};
final Timer timer=new Timer();
timer.schedule(new TimerTask()
{
@Override
public void run()
{
Message msg=new Message();
msg.what=0x123;
//發送訊息,通知應用修改ClipDrawable的level的值
handler.sendMessage(msg);
//取消定時器
if(drawable.getLevel()>=10000)
{
timer.cancel();
}
}
}, 0,300);
}
}
public class MainActivity extends Activity
{
private ImageView view=null;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
super.setContentView(R.layout.activity_main);
this.view=(ImageView)super.findViewById(R.id.view);
//擷取圖片所顯示的ClipDrawable對象
final ClipDrawable drawable=(ClipDrawable) view.getDrawable();
final Handler handler=new Handler()
{
@Override
public void handleMessage(Message msg)
{
//如果訊息是本程式發送的
if(msg.what==0x123)
{
//修改ClipDrawable的level值
drawable.setLevel(drawable.getLevel()+200);
}
}
};
final Timer timer=new Timer();
timer.schedule(new TimerTask()
{
@Override
public void run()
{
Message msg=new Message();
msg.what=0x123;
//發送訊息,通知應用修改ClipDrawable的level的值
handler.sendMessage(msg);
//取消定時器
if(drawable.getLevel()>=10000)
{
timer.cancel();
}
}
}, 0,300);
}
}
程式運行效果: