最近一直研究5.0的過度動畫,網上找了好多文章、博文,千篇一律,一個博文或者一個文章,引申出好多,然并卵,基本上都說的是一共分成兩種方法:
一,代碼實作:
<span style="font-size:12px;">Fade fade = new Fade();
fade.setDuration(2000);
getWindow().setReenterTransition(fade);</span>
<span style="font-size:12px;"><pre name="code" class="java">Intent intent = new Intent(MainActivity.this, SlideActivity.class);
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());</span>
第二個activity
<span style="font-size:12px;">getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().setEnterTransition(new Explode());
getWindow().setExitTransition(new Explode());
//getWindow().setReenterTransition(new Explode());
//getWindow().setReturnTransition(new Explode());
setContentView()</span>
二,xml實作
在res目錄下,建立一個transition檔案夾,建立xxx.xml檔案(就是動畫xml)
<span style="font-size:12px;"> 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>
</span>
style:
<span style="font-size:12px;"> <style name="BaseAppTheme" parent="android:Theme.Material">
<!-- enable window content transitions -->
<item name="android:windowContentTransitions">true</item>
<!-- specify enter and exit transitions -->
<item name="android:windowEnterTransition">@transition/explode</item>
<item name="android:windowExitTransition">@transition/explode</item>
<!-- specify shared element transitions -->
<item name="android:windowSharedElementEnterTransition">
@transition/change_image_transform</item>
<item name="android:windowSharedElementExitTransition">
@transition/change_image_transform</item>
</style></span>
activity跳轉
<span style="font-size:12px;">Intent intent = new Intent(MainActivity.this, SlideActivity.class);
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());</span>
相信自己親手寫過并調試過的都會出現一種情況,用xml寫,沒有效果,反正我沒做出來,效果一直出不來,知道在第二個activity裡邊加入如下代碼:
<span style="font-size:12px;">getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().setEnterTransition(new Explode());
getWindow().setExitTransition(new Explode());
//getWindow().setReenterTransition(new Explode());
//getWindow().setReturnTransition(new Explode());
setContentView()</span>
但是,什麼情況,這不是代碼實作的動畫嗎?既然這樣,那幹嘛還浪費時間寫xml動畫啊,沒辦法繼續研究吧
終于找到一篇文章,感謝作者的分享http://www.cnblogs.com/littlepanpc/p/4521624.html
首先,在你定義一個繼承自材料主題的風格時,通過
android:windowContentTransitions
屬性激活視窗内容過渡效果。你也可以在風格定義中指定出入和共享元素過渡效果:
<span style="font-size:12px;"><style name="BaseAppTheme" parent="android:Theme.Material">
<!-- enable window content transitions -->
<item name="android:windowContentTransitions">true</item>
<!-- specify enter and exit transitions -->
<item name="android:windowEnterTransition">@transition/explode</item>
<item name="android:windowExitTransition">@transition/explode</item>
<!-- specify shared element transitions -->
<item name="android:windowSharedElementEnterTransition">
@transition/change_image_transform</item>
<item name="android:windowSharedElementExitTransition">
@transition/change_image_transform</item>
</style></span>
這個例子子中的
change_image_transform
過渡效果定義如下:
<span style="font-size:12px;"><pre name="code" class="java"> <!-- res/transition/change_image_transform.xml -->
<!-- (see also Shared Transitions below) -->
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeImageTransform/>
</transitionSet></span>
changeImageTransform
元素對應于
ChangeImageTransform
類。
要想激活代碼中的視窗内容過渡效果,得調用
Window.requestFeature()
方法:
<span style="font-size:12px;"> // inside your activity (if you did not enable transitions in your theme)
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().setExitTransition(new Explode());</span>
要在代碼中指定過渡效果,調用這些方法使用
Transition
類:
<span style="font-size:12px;">Window.setEnterTransition();
Window.setExitTransition();
Window.setSharedElementEnterTransition();
Window.setSharedElementExitTransition();</span>
方法
setEnterTransition()
和
setSharedElementExitTransition()
給調用者
Acivity
定義了退出過渡效果,而方法
setEnterTransition()
和
setSharedElementEnterTransition()
為被調用者定義了進入過渡效果。
為了擷取過渡的全部效果,你必須激活調用和被調用
Activity
的視窗内容過渡效果。否則的話,否則的話,調用者
Activity
将會啟動退出過渡效果,但是你會看到這個視窗過渡效果的(例如縮放或者褪色)。
為了盡可能早的啟動進入過渡效果,得在被調用
Activity
中使用
Window.setAllowEnterTransitionOverlap()
。這将使你擁有更多戲劇般美妙的進入過渡效果。
也可以這麼了解:
1. 在style中使用使用android:windowContentTransitions屬性,聲明使用transitions,
2. 需要在xml中自定義自己的transitions,然後需要在style中寫入
<span style="font-size:12px;"><!--指定進入和退出的transitions-->
<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></span>
3. 在代碼中啟用transitions:
<span style="font-size:12px;">// inside your activity (if you did not enable transitions in your theme)
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
// set an exit transition
getWindow().setExitTransition(new Explode());</span>
無語,終于弄明白了,要不是自己去試了,就被網上那些博文,文章坑慘了,等到真正用的時候,指不定出現什麼問題呢