Android5.0–Activity過度動畫
Android 提供了三種transition類型
- 進入動畫:一個activity全部視圖進入的過渡動畫
- 退出動畫:一個activity全部視圖退出的過渡動畫
- 共享元素:兩個activity共享視圖的過渡動畫
其中進入和退出動畫包括
- explode:從螢幕中間進入或者退出視圖
- fade:通過改變視圖的透明度來進入或者退出視圖
- slide:從螢幕邊緣進入或者退出視圖
共享元素包括
- changeBounds:改變目标視圖的布局邊界。
- changeClipBounds:裁剪目标視圖邊界。
- changeTransform:改變目标的縮放比例和旋轉角度。
- changeImageTransform:改變目标圖檔的大小和縮放比例。
- overlay
過渡動畫有XML跟代碼實作這兩種方法
*(這裡建議使用xml來實作,統一了頁面進入和退出動畫的風格,修改也比較友善)
A進入跟退出過渡動畫實作
一:XML實作
1. 在style.xml中設定
<!--設定支援過渡動畫-->
<item name="android:windowContentTransitions">true</item>
<!--設定進入動畫 通過分解(explode)方式進入-->
<item name="android:windowEnterTransition">@transition/explode</item>
<!--設定退出動畫 通過分解方式退出-->
<item name="android:windowExitTransition">@transition/explode</item>
<item name="android:windowReenterTransition">@transition/explode</item>
<item name="android:windowReturnTransition">@transition/explode</item>
2.在res下建立transition目錄,在transition目錄下建立所需要的過渡動畫的xxx.xml,要選擇标簽為transition
explode.xml
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<explode
android:duration="500"//動畫所需要的時間
android:interpolator="@android:interpolator/accelerate_decelerate" />
</transitionSet>
silde.xml
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<slide
android:duration="500"
android:interpolator="@android:interpolator/accelerate_decelerate" />
</transitionSet>
fade.xml
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<fade
android:duration="500"
android:interpolator="@android:interpolator/accelerate_decelerate" />
</transitionSet>
3.接下來就是重點了,如何跳轉并讓過渡動畫生效
Intent intent = new Intent(MainActivity.this, SlideActivity.class);
//注意要調用兩個參數的startActivity方法
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
4.好了一個進入或者退出的過渡動畫就可以實作了
二:通過Java代碼實作
1. 例如A跳轉到B
2. A中的核心代碼如下
Intent intent = new Intent(MainActivity.this, SlideActivity.class);
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
3.B中的核心代碼如下,代碼需要再setContentView之前
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().setEnterTransition(new Explode());
getWindow().setExitTransition(new Explode());
//getWindow().setReenterTransition(new Explode());
//getWindow().setReturnTransition(new Explode());
setContentView()
4.這樣代碼實作進入跟退出過渡動畫就已經完成了
B共享元素
兩個activity中的共享元素的transitionName要相同,否則不起作用
- setSharedElementEnterTransition();A->B,B進入動畫
- setSharedElementExitTransition();A->B,A退出動畫
- setSharedElementReenterTransition();B->A,A進入動畫
-
setSharedElementReturnTransition();B->A,B退出動畫
一: XML實作
- 在style.xml中(如果不設定,會使用系統預設動畫)
<!--設定支援過渡動畫-->
<item name="android:windowContentTransitions">true</item>
<item name="android:windowSharedElementEnterTransition">@transition/share1</item>
<item name="android:windowSharedElementExitTransition">@transition/share2</item>
<item name="android:windowSharedElementReenterTransition">@transition/share3</item>
<item name="android:windowSharedElementReturnTransition">@transition/share4</item>
2.xml動畫(res/transition/xxx.xml)
share1.xml
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeBounds
android:duration="500"
android:interpolator="@android:interpolator/accelerate_decelerate" />
</transitionSet>
share2.xml
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeClipBounds
android:duration="500"
android:interpolator="@android:interpolator/accelerate_decelerate" />
</transitionSet>
share3.xml
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeTransform
android:duration="500"
android:interpolator="@android:interpolator/accelerate_decelerate" />
</transitionSet>
share4.xml
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeImageTransform
android:duration="500"
android:interpolator="@android:interpolator/accelerate_decelerate" />
</transitionSet>
3.跳轉代碼
一個共享元素(該例子是講button4設定為共享元素)
Intent intent3 = new Intent(MainActivity.this, Share1Activity.class);
startActivity(intent3, ActivityOptions.makeSceneTransitionAnimation(this, button4, "share").toBundle());
多個共享元素
startActivity(intent3, ActivityOptions.makeSceneTransitionAnimation(this, new Pair<View, String>(button4, "share"), new Pair<View, String>(button4, "share")).toBundle());
//new Pair()是可變參數
//共享元素的key:view控件 ,value:與android:transitionName="share" 相同(也可以通過代碼設定setTransitionName())
<Button
android:id="@+id/btn4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="share"
android:transitionName="share" /> //兩個activity中的共享元素的transitionName要相同,否則不起作用
二:Java代碼實作
-
ChangeBounds -捕獲共享元素的layout bound,然後播放layout bound變化動畫。ChangeBounds 是
共享元素變換中用的最多的,因為前後兩個activity中共享元素的大小和位置一般都是不同的。
- ChangeTransform - 捕獲共享元素的縮放(scale)與旋轉(rotation)屬性 ,然後播放縮放(scale)與旋轉(rotation)屬性變化動畫。
- ChangeClipBounds - 捕獲共享元素clip bounds,然後播放clip bounds變化動畫。
-
ChangeImageTransform - 捕獲共享元素(ImageView)的transform matrices 屬性,然後播放ImageViewtransform matrices 屬性變化動畫。與ChangeBounds相結合,這個變換可以讓ImageView在動畫中高效實作大小,形狀或者ImageView.ScaleType 屬性平滑過度。
1.例如仍然是從A跳到B
A中的頁面跳轉代碼與XML相同這裡就不重複了還是建議使用xml實作
2.B中的代碼
仍然是在setContentView()前
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().setSharedElementExitTransition(new ChangeBounds());
//getWindow().setSharedElementEnterTransition(new ChangeBounds());
getWindow().setSharedElementReenterTransition(new ChangeBounds());
//getWindow().setSharedElementReturnTransition(new ChangeBounds());
setContentView()
3.具體的效果還是應該都敲敲看看,多敲才能真正了解,切勿眼高手低
*我隻是android開發中的國小生,以上有什麼錯誤還請各位大神多多指點,謝謝
參考:Android群英傳,深入了解共享元素變換(Shared Element Transition)-上