1. 程式人生 > >Android基礎學習,使用Drawable資源之ClipDrawable資源,實現圖片在特定位置展開。

Android基礎學習,使用Drawable資源之ClipDrawable資源,實現圖片在特定位置展開。

ClipDrawable代表從其它點陣圖上擷取一個"圖片片段",XML中的根元素為<clip.../>,擷取的方向由clipOrientation控制

下面以一個慢慢展開的圖片為例

ClipDrawable代表從其它點陣圖上擷取一個“圖片片段”。在XML檔案中使用<clip.../>元素定義ClipDrawable物件,可指定如下三個屬性:

android:drawable:指定擷取的源Drawable物件

android:clipOrientation:指定擷取的方向,可設定為水平擷取或垂直擷取

android:gravity:指定擷取時的對齊方式

使用ClipDrawable物件時可以呼叫setLevel(int level)方法來設定擷取的區域大小,當level為0時,擷取的圖片片段為空;當level為10000時,擷取整張圖片。

通過以上說明,我們發現,可以使用ClipDrawable的這種性質控制擷取圖片的區域大小,讓程式不斷呼叫setLevel方法並改變level的值,達到讓圖片慢慢展開的效果。

1.先定義一個ClipDrawable資原始檔drawable_clip.xml  效果是從中間向兩邊展開

<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/test"
android:clipOrientation=
"horizontal" android:gravity="center"> </clip>
2.在主Activity的佈局檔案中新增ImageView ,名稱activity_mian
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation=
"vertical"> <!-- 這裡imageView的src定義為clipdrawable資源 --> <ImageView android:id="@+id/image" android:layout_width="fill_parent" android:layout_height="wrap_content" android:src="@drawable/drawable_clip"/> </LinearLayout>
3.0 主Activity程式碼 MainActivity
package com.wuzhou.clipdrawabletest;
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 {
    private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.image);
//獲取圖片所顯示的ClipDrawble物件
final ClipDrawable clipdrawable = (ClipDrawable) imageView.getDrawable();/**
         * Handler
         * */
final Handler handler = new Handler() {
            public void handleMessage(Message msg) {
                if (msg.what == 0x1233) {
                    //修改ClipDrawable的level值
clipdrawable.setLevel(clipdrawable.getLevel() + 200);
}
            }
        };
/**
         * 計時器
         * */
final Timer timer = new Timer();
timer.schedule(new TimerTask() {
            public void run() {
                Message msg = new Message();
msg.what = 0x1233;
//傳送訊息,通知應用修改ClipDrawable物件的level值
handler.sendMessage(msg);
//取消定時器
if (clipdrawable.getLevel() >= 10000) {
                    timer.cancel();
}
            }
        }, 0, 300);
}
}
4.0 如果在佈局activity_main中圖片的顯示方式是
android:background="@drawable/drawable_clip"

//獲取圖片所顯示的ClipDrawble物件
final ClipDrawable clipdrawable = (ClipDrawable) imageView.getBackground();

這種方式。