群英傳之Android 5.X過渡動畫

Android 2.0之後可以通過overridePendingTransition()給Activity增加切換動畫.而在Android5.X中,Google對動畫效果進行瞭更深一步的詮釋,為Activity的跳轉設計瞭更加豐富的動畫效果。

以下是效果圖:


這裡寫圖片描述
建議拖到 “效果圖的具體實現代碼”,將代碼運行一遍,再重新看原理,速度就會快很多。
 vcD4NCjxoMyBpZD0=”android-5x提供瞭三種transition類型”>Android 5.X提供瞭三種Transition類型


進入:一個進入過渡動畫決定Activity中的所有視圖怎麼進入屏幕 退出:一個退出的渡動畫決定Activity中的所有視圖怎麼退出屏幕 共享元素:一個共享元素過渡動畫決定兩個Activity之間的過渡,怎麼共享它們的視圖

其中,進入效果和退出效果包括:


explode(分解) ——從屏幕中間進或出,移動視圖 slide(滑動) ——從屏幕邊緣進或出,移動視圖 fade(淡出) ——通過改變屏幕上視圖的不透明度達到添加或移除視圖

共享元素包括:


changeBounds ——改變目標視圖的佈局邊界 changeClipBounds——裁剪目標視圖邊界 changeTransform——改變目標視圖的縮放比例和旋轉角度 changeImageTransform——改變目標圖片的大小和縮放比例
以上元素屬性配置時,系統會自動設置..

具體操作


首先先看進入與退出三種過渡動畫##

例如從MainActivity跳轉到Main2ActivityB,隻需要在MainActivity中將基本的startActivity(intent)方法改成如下代碼:

startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle());

而在Main2Activity中,隻需要設置如下所示代碼:

 getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);//這句要寫在setContentView()前,具體原因到時再補充

  
        true

接下來就可以設置進入動畫,在Main2Activity設置,代碼如下:

//同樣,都是要寫在setContentView()前面
 getWindow().setEnterTransition(new Explode());
 getWindow().setEnterTransition(new Slide());
 getWindow().setEnterTransition(new Fade());         

退出動畫設置為,代碼如下:

//同樣,都是要寫在setContentView()前面
 getWindow().setExitTransition(new Explode());
 getWindow().setExitTransition(new Slide());
 getWindow().setExitTransition(new Fade());

 

共享元素效果

第一章圖片中的Android機器人就是共享元素,即Activity1與Activity2都擁有的元素,在Activity1跳轉到Activity2的時候,其他元素消失,而共享元素——Android機器人通過動畫效果直接顯示到Activity2中。

這裡寫圖片描述

所以,要想在程序中使用共享元素的動畫效果,需要再Activity1的佈局文件中設置共享元素,即給對應控件增加相關屬性,代碼如下:

 android:transitionName="XXX"

同時在Activity2的佈局文件中,給要實現共享效果的元素也增加相同的屬性,代碼如下:

 android:transitionName="XXX"

如果隻有一個共享元素,Activity1中隻需要使用如下代碼:

//view為共享元素,share為指定transitionName="XXX"對應的XXX
 startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this, view,"share")).toBundle());

如果有多個共享屬性,可以通過Pair.create()來創建多個共享元素,代碼如下:

 startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this, 
                     Pair.create(view,"share"),Pair.create(fab,"fab")).toBundle());

到這裡所有的步驟就完成。
 

效果圖的具體實現代碼


“跳轉按鈕”是Android2.0使用overridePendingTransition()的實現,所以以下代碼不會給出..
 

MainActivity代碼如下:

public class MainActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    //如果報錯就在每個方法前加上@TargetApi(Build.VERSION_CODES.LOLLIPOP),主要是為瞭防止版本太低
    public void explode(View v) {
        Intent intent = new Intent(this, Main2Activity.class);
        intent.putExtra("flag", 0);
        startActivity(intent,
                ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle());
    }

    public void slide(View v) {
        Intent intent = new Intent(this, Main2Activity.class);
        intent.putExtra("flag", 1);
        startActivity(intent,
                ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle());
    }

    public void fade(View view) {
        Intent intent = new Intent(this, Main2Activity.class);
        intent.putExtra("flag", 2);
        startActivity(intent,
                ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle());

    }

    public void share(View view) {
        Toast.makeText(MainActivity.this, "aaaaa", Toast.LENGTH_SHORT).show();
        View fab = findViewById(R.id.fab_button);
        Intent intent = new Intent(this, Main2Activity.class);
        intent.putExtra("flag", 3);
        startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, Pair.create(view,"share"),Pair.create(fab,"fab")).toBundle());

    }

}

 

MainActivity的Xml代碼如下:


但其實在MainActivity的xml中,transitionName其實不設置代碼也是沒問題的,有興趣可以去試試。因為在MainActivity的代碼的ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, Pair.create(view,”share”),Pair.create(fab,”fab”)).toBundle())中,view與fab 其實就是那兩個Button。
 

Main2Activity代碼:

public class Main2Activity extends AppCompatActivity {

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
        int flag = getIntent().getExtras().getInt("flag");

        switch (flag){
            case 0://explode
                getWindow().setEnterTransition(new Explode());
                getWindow().setExitTransition(new Explode());
                break;
            case 1://slide
                getWindow().setEnterTransition(new Slide());
                getWindow().setExitTransition(new Slide());
                break;
            case 2://fade
                getWindow().setEnterTransition(new Fade());
                getWindow().setExitTransition(new Fade());
                break;
            case 3://不用任何操作       
                break;
        }
        setContentView(R.layout.activity_main2);      
    }
}

You May Also Like