1. 程式人生 > >Android5.0:Activity過渡動畫

Android5.0:Activity過渡動畫

Android 在5.0(API 級別 21)中提供了三種Transition 型別

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

進入和退出的效果包括:

1.explode(分解)-----從螢幕中間進入或退出,移動檢視
2.slide(滑動)---------從螢幕邊緣進入或退出,移動檢視
3.fade(淡出)---------通過改變螢幕上檢視的不透明度達到新增或移除檢視

共享元素包括:

1.changeBounds -------改變目標檢視的佈局邊界
2.changeClipBounds ------裁剪目標檢視邊界
3.changeTransform --------改變目標檢視的縮放比例和旋轉角度
4.changeImageTransform -----改變目標圖片的大小和縮放比例

效果圖如下:

如何使用過渡動畫:
1.比如從ActivityA跳轉到ActivityB

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

2.ActivityB中

getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);

3.在ActivityB中寫具體的進入的動畫效果

getWindow().setEnterTransition(new Explode());
getWindow().setEnterTransition(new Slide());
getWindow().setEnterTransition(new Fade());

4.在ActivityB中設定離開ActivityB的動畫

getWindow().setExitTransition(new Explode())
getWindow().setExitTransition(new Slide());
getWindow().setExitrTransition(new Fade());

5.共享元素的設定:
首先給要共享的元素設定屬性 AB兩個活動中都要設定

android:transitionName="xxx"

啟動方式

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

多個元素共享的書寫方式

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

6.實列程式碼:
活動A程式碼以及佈局

package com.example.a37443.trasition;

import android.app.ActivityOptions;
import android.content.Intent;
import android.provider.Contacts;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Pair;
import android.view.View;

public class MainActivity extends AppCompatActivity {
    Intent intent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onclick(View view){
        switch(view.getId()){
            case R.id.btn_1:
                 intent = new Intent(this,Main2Activity.class);
                intent.putExtra("flag",0);
                startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
                break;
            case R.id.btn_2:
                 intent = new Intent(this,Main2Activity.class);
                intent.putExtra("flag",1);
                startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
                break;
            case R.id.btn_3:
                Intent intent = new Intent(this,Main2Activity.class);
                intent.putExtra("flag",2);
                startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
                break;
            case R.id.fab_button:
                View fab = findViewById(R.id.fab_button);
                intent = new Intent(this,Main2Activity.class);
                intent.putExtra("flag",3);
                startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this,view,"share").toBundle());
                break;
                default:
                    break;
        }
    }
}

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
   <Button
       android:id="@+id/btn_1"
       android:layout_width="match_parent"
       android:layout_height="100dp"
       android:onClick="onclick"
       android:text="explode"/>
   <Button
       android:id="@+id/btn_2"
       android:layout_width="match_parent"
       android:layout_height="100dp"
       android:onClick="onclick"
       android:text="slide" />
   <Button
       android:id="@+id/btn_3"
       android:layout_width="match_parent"
       android:layout_height="100dp"
       android:onClick="onclick"
       android:text="fade"/>
   <Button android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:id="@+id/fab_button"
       android:onClick="onclick"
       android:transitionName="fab"
       android:background="@drawable/icon_person"
       android:elevation="5dp"/>
</LinearLayout>

活動B程式碼以及佈局:

package com.example.a37443.trasition;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.transition.Explode;
import android.transition.Fade;
import android.transition.Slide;
import android.view.Window;

public class Main2Activity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
        int flag = getIntent().getExtras().getInt("flag");
        switch (flag){
            case 0:
                getWindow().setEnterTransition(new Explode());
                break;
            case 1:
                getWindow().setEnterTransition(new Slide());
                break;
            case 2:
                getWindow().setEnterTransition(new Fade());
                getWindow().setExitTransition(new Fade());
            case 3:
                break;
        }

        setContentView(R.layout.activity_main2);
    }
}
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <View
        android:id="@+id/holder_view"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:transitionName="share"
        android:background="@drawable/icon_person">
    </View>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingTop="10dp"
        android:layout_below="@+id/holder_view">
        <Button
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:id="@+id/button"
            android:layout_below="@+id/button4"
            android:layout_marginTop="10dp"/>
        <Button
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:layout_marginTop="10dp"
            android:id="@+id/button4"
            android:layout_alignParentStart="true"/>
    </RelativeLayout>
</RelativeLayout>

學習路上且行且記錄~