2011-11-30 46 views
30

我知道用下面的代碼startActivity()或完成()如何在Android應用程序中一次更改所有活動轉換?

activity.overridePendingTransition(R.anim.activity_close_enter, R.anim.activity_close_exit);

之後我可以改變活動的過渡,但如果我有我的應用程序十項活動,我必須這樣做十次;而且很難修改。所以我想知道是否有一種方法可以一次爲應用程序中的所有活動設置轉換。 AndroidManifest.xml中是否有相應的配置?

謝謝!

回答

52

您需要先創建在res一個<style>/styles.xml,像這樣:

<style name="YourAnimation.Activity" parent="@android:style/Animation.Activity"> 
     <item name="android:windowEnterAnimation">@anim/your_in_down</item> 
     <item name="android:windowExitAnimation">@anim/your_out_down</item> 
    </style> 

然後你可以將樣式應用到一個主題,在同一個文件:

<style name="YourTheme" parent="android:Theme.Translucent"> 
     ... 
     <item name="android:windowAnimationStyle">@style/YourAnimation.Activity</item> 
    </style> 

最後應用的主題,以你的活動清單:

<activity 
     android:name=".YourActivity" 
     android:theme="@style/YourTheme" /> 

看看這些鏈接FO R參考:

+20

它的工作原理!實際上,我改變了一點:'' –

+0

@DavidLiu,打開動畫看起來像他們工作,但收盤動畫不生效 – toobsco42

+0

@GenLiu你能告訴我你的。 xml的例子?我只是不能看到openexit和關閉輸入的區別,例如 –

13

我知道這已經回答了,但這裏是我在我做到了。我們仍然支持API 14,所以有一些動畫缺失,我不得不從API 22(sli​​de_in_right,slide_out_left)拉入項目。當你打開一個新的活動並將關閉的幻燈片向左滑動時,它所做的就是在屏幕上滑動。當您按回時,它會做相反的操作,從左側滑動前一個屏幕並向右關閉當前屏幕。

<style name="YourTheme" parent="android:Theme.Translucent"> 
    ... 
    <item name="android:windowAnimationStyle">@style/YourAnimation.Activity</item> 
</style> 

<style name="YourAnimation.Activity" parent="@android:style/Animation.Activity"> 
    <item name="android:activityOpenEnterAnimation">@anim/slide_in_right</item> 
    <item name="android:activityOpenExitAnimation">@anim/slide_out_left</item> 
    <item name="android:activityCloseEnterAnimation">@android:anim/slide_in_left</item> 
    <item name="android:activityCloseExitAnimation">@android:anim/slide_out_right</item> 
</style> 
+0

它直接從API 22庫中下載API 22的源代碼,它將位於動畫文件夾中。 – JPM

6

我的解決方案大多是像JPM的答案。但這裏有一些你可能需要的附加文件。

<!-- Base application theme. --> 
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <!-- Customize your theme here. --> 
    <item name="colorPrimary">@color/colorPrimary</item> 
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
    <item name="colorAccent">@color/colorPrimary</item> 
    <item name="android:windowAnimationStyle">@style/CustomActivityAnimation</item> 

</style> 

<style name="CustomActivityAnimation" parent="@android:style/Animation.Activity"> 
    <item name="android:activityOpenEnterAnimation">@anim/slide_in_right</item> 
    <item name="android:activityOpenExitAnimation">@anim/slide_out_left</item> 
    <item name="android:activityCloseEnterAnimation">@anim/slide_in_left</item> 
    <item name="android:activityCloseExitAnimation">@anim/slide_out_right</item> 
</style> 

創建res文件夾下的動畫文件夾,然後創建這四個動畫文件:

slide_in_right.xml

<?xml version="1.0" encoding="utf-8"?> 

<set xmlns:android="http://schemas.android.com/apk/res/android"> 
    <translate android:fromXDelta="100%p" android:toXDelta="0" 
     android:duration="@android:integer/config_mediumAnimTime"/> 
</set> 

slide_out_left.xml

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 
    <translate android:fromXDelta="0" android:toXDelta="-100%p" 
     android:duration="@android:integer/config_mediumAnimTime"/> 
</set> 

slide_in_left.xml

<?xml version="1.0" encoding="utf-8"?> 

<set xmlns:android="http://schemas.android.com/apk/res/android"> 
    <translate android:fromXDelta="-100%p" android:toXDelta="0" 
     android:duration="@android:integer/config_mediumAnimTime"/> 
</set> 

slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?> 

<set xmlns:android="http://schemas.android.com/apk/res/android"> 
    <translate android:fromXDelta="0" android:toXDelta="100%p" 
     android:duration="@android:integer/config_mediumAnimTime"/> 
</set> 
+0

這根本不起作用,至少不是在Android 6(華爲P8) – qkx

+0

它在我的華爲gPlay迷你(Android 6)和Nexus 9(Android 7)順利工作。請運行這個項目: https://github.com/ShohanAhmed/Android-Activity-Transition-Custom-Animation –

+0

我調查了一個問題,並且你有部分權利。它也在我的手機上運行,​​但只有當您從活動中調用intent(顯示新活動)時纔會運行。如果你想從小部件打開一些活動並使用Pending Intent,那麼它不在那裏工作。在這種情況下,唯一的選擇是像我最初提到的那樣以代碼的形式編程設置動畫.... – qkx

相關問題