安卓Animation類與xml製作動畫

來源:互聯網
上載者:User

標籤:

有時要對控制項添加一點動畫效果,在安卓中,動畫效果也是一個類,也就是Animation類。把動畫效果這個類弄好後,在與控制項類關聯到一起,就可以實現控制項有一些動作特效這樣的效果了。動畫效果的定義,要在xml檔案中。

 

 

螢幕錄製有些卡頓。不過影響不大。

以上的例子其實只是用了ImageView這個控制項,然後不同的控制項用了逐漸放大,還有位置平移這個動作。

 

下面說說怎麼實現:

先執行個體化Animation類:

 Animation myAnimation;//通過loadAnimation函數 把動畫效果的xml檔案載入進來  執行個體化動作類 myAnimation = AnimationUtils.loadAnimation(Selection.this, R.anim.my_anim);

  

實現xml檔案(以下給出內建的4種特效):

 

alpha 漸層透明度動畫效果

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" >    <alpha        android:duration="1000"        android:fromAlpha="0.0"        android:toAlpha="1.0" />    <!--     透明度控制動畫效果 alpha 漸層透明度動畫效果        浮點型值:            fromAlpha 屬性為動畫起始時透明度            toAlpha   屬性為動畫結束時透明度            說明:                 0.0表示完全透明                1.0表示完全不透明            以上值取0.0-1.0之間的float資料類型的數字                長整型值:            duration  屬性為動畫期間            說明:                     時間以毫秒為單位    --></set>

 

scale 漸層尺寸伸縮動畫效果

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" >    <scale        android:duration="1000"        android:fillAfter="false"        android:fromXScale="0.0"        android:fromYScale="0.0"        android:interpolator="@android:anim/accelerate_decelerate_interpolator"        android:pivotX="50%"        android:pivotY="50%"        android:toXScale="1.4"        android:toYScale="1.4" /></set><!--     尺寸伸縮動畫效果 scale       屬性:interpolator 指定一個動畫的插入器        在我實驗過程中,使用android.res.anim中的資源時候發現        有三種動畫插入器:            accelerate_decelerate_interpolator  加速-減速 動畫插入器            accelerate_interpolator        加速-動畫插入器            decelerate_interpolator        減速- 動畫插入器        其他的屬於特定的動畫效果      浮點型值:                     fromXScale 屬性為動畫起始時 X座標上的伸縮尺寸                toXScale   屬性為動畫結束時 X座標上的伸縮尺寸                         fromYScale 屬性為動畫起始時Y座標上的伸縮尺寸                toYScale   屬性為動畫結束時Y座標上的伸縮尺寸                        說明:                 以上四種屬性值                            0.0表示收縮到沒有                     1.0表示正常無伸縮                         值小於1.0表示收縮                      值大於1.0表示放大                    pivotX     屬性為動畫相對於物件的X座標的開始位置            pivotY     屬性為動畫相對於物件的Y座標的開始位置                    說明:                    以上兩個屬性值 從0%-100%中取值                    50%為物件的X或Y方向座標上的中點位置                長整型值:            duration  屬性為動畫期間            說明:   時間以毫秒為單位        布爾型值:            fillAfter 屬性 當設定為true ,該動畫轉化在動畫結束後被應用
-->

 

translate 畫面轉換位置移動動畫效果

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" >    <translate        android:duration="2000"        android:fromXDelta="30"        android:fromYDelta="30"        android:toXDelta="-80"        android:toYDelta="300" />    <!--     translate 位置轉移動畫效果        整型值:            fromXDelta 屬性為動畫起始時 X座標上的位置                toXDelta   屬性為動畫結束時 X座標上的位置            fromYDelta 屬性為動畫起始時 Y座標上的位置            toYDelta   屬性為動畫結束時 Y座標上的位置            注意:                     沒有指定fromXType toXType fromYType toYType 時候,                     預設是以自己為相對參照物                     長整型值:            duration  屬性為動畫期間            說明:   時間以毫秒為單位--></set>

 

rotate 畫面轉移旋轉動畫效果

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" >    <rotate        android:duration="3000"        android:fromDegrees="0"        android:interpolator="@android:anim/accelerate_decelerate_interpolator"        android:pivotX="50%"        android:pivotY="50%"        android:toDegrees="+350" />    <!--     rotate 旋轉動畫效果       屬性:interpolator 指定一個動畫的插入器             在我實驗過程中,使用android.res.anim中的資源時候發現             有三種動畫插入器:                accelerate_decelerate_interpolator   加速-減速 動畫插入器                accelerate_interpolator               加速-動畫插入器                decelerate_interpolator               減速- 動畫插入器             其他的屬於特定的動畫效果                                  浮點數型值:            fromDegrees 屬性為動畫起始時物件的角度                toDegrees   屬性為動畫結束時物件旋轉的角度 可以大於360度                       說明:                     當角度為負數——表示逆時針旋轉                     當角度為正數——表示順時針旋轉                                   (負數from——to正數:順時針旋轉)                        (負數from——to負數:逆時針旋轉)                      (正數from——to正數:順時針旋轉)                      (正數from——to負數:逆時針旋轉)                   pivotX     屬性為動畫相對於物件的X座標的開始位置            pivotY     屬性為動畫相對於物件的Y座標的開始位置                            說明:        以上兩個屬性值 從0%-100%中取值                         50%為物件的X或Y方向座標上的中點位置        長整型值:            duration  屬性為動畫期間            說明:       時間以毫秒為單位    --></set>

 

 把Animation類和控制項關聯在一起

  

  //控制項開始動作imgPic.startAnimation(myAnimation);

 

 挺簡單的吧,只要先實現xml檔案,定義好動作的類型。再通過loadAnimation函數,用xml檔案執行個體化Animaiton類。然後再把animaiton類和控制項類關聯在一起,控制項就會開始有動作效果了。

不過要注意的是:animation類只能運行在主線程中!!!!!!

而且我發現一個問題,直接在代碼中加入動作效果,不會自動執行。並且如果同時定義了多個有動作效果的控制項的話,他們是會同時執行的,那有什麼辦法可以按順序執行呢?

結合到UI還有主線程的問題,很自然就想到了Handler類。

 

我的解決辦法是:進入activity後,開啟一個新線程,這個線程按我們的需求,發訊息給Handler類來執行動作,這樣就可以執行了。

 

這是在onCreate裡面的代碼:

    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //用於更新在主線程的UI        handler = new Handler() {            @Override            public void handleMessage(Message msg) {                super.handleMessage(msg);                switch (msg.arg1){                    case 0: {                        myAnimation = AnimationUtils.loadAnimation(Selection.this, R.anim.my_anim);                        imgPic.startAnimation(myAnimation);                        imgPic.setVisibility(View.VISIBLE);                             }break;                    case 1: {                        myAnimation = AnimationUtils.loadAnimation(Selection.this, R.anim.studio_anim);                        LWGstudio.startAnimation(myAnimation);                        LWGstudio.setVisibility(View.VISIBLE);                    }break;                    case 2: {                        backAnimation = AnimationUtils.loadAnimation(Selection.this, R.anim.back_anim);                        back.startAnimation(backAnimation);                        back.setVisibility(View.VISIBLE);                    }break;                }            }        };        //透明狀態列        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);        imgPic = (ImageView)findViewById(R.id.ask);        imgPic.setVisibility(View.INVISIBLE);        back = (ImageView)findViewById(R.id.firstback);        back.setVisibility(View.INVISIBLE);        LWGstudio = (ImageView)findViewById(R.id.LWGstudio);        LWGstudio.setVisibility(View.INVISIBLE);                        new Thread(new Runnable() {                            @Override                            public void run() {                                //進去隔一秒 出現askFood                                try {                                    Thread.sleep(1000);                                } catch (InterruptedException e) {                                    e.printStackTrace();                                }                                Message ok = new Message();                                ok.arg1 = 0;//區分更新什麼UI                                handler.sendMessage(ok);                                try {                                    Thread.sleep(2000);                                } catch (InterruptedException e) {                                    e.printStackTrace();                                }                                //第一個動作執行後,隔兩秒執行LWGstudio出現的動作                                ok = new Message();                                ok.arg1 = 1;//區分更新什麼UI                                handler.sendMessage(ok);                                try {                                    Thread.sleep(1000);                                } catch (InterruptedException e) {                                    e.printStackTrace();                                }                                                                //最後出現全屏變綠的動作                                ok = new Message();                                ok.arg1 = 2;//區分更新什麼UI                                handler.sendMessage(ok);                            }                        }).start();            }

  

 

安卓Animation類與xml製作動畫

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.