天天看點

android5.0的過度動畫

最近一直研究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>
           

無語,終于弄明白了,要不是自己去試了,就被網上那些博文,文章坑慘了,等到真正用的時候,指不定出現什麼問題呢