如何在 Android 应用程序中一次更改所有活动转换?
Posted
技术标签:
【中文标题】如何在 Android 应用程序中一次更改所有活动转换?【英文标题】:How to change all the activity transitions at once in Android application? 【发布时间】:2012-01-09 07:21:19 【问题描述】:我知道我可以在 startActivity() 或 finish() 之后使用以下代码更改活动转换
activity.overridePendingTransition(R.anim.activity_close_enter, R.anim.activity_close_exit);
但如果我的应用中有十个活动,我必须这样做十次;并且很难修改。所以我想知道是否有一种方法可以一次为应用程序中的所有活动设置转换。 androidManifest.xml中有对应的配置吗?
谢谢!
【问题讨论】:
【参考方案1】:你要先在 res/styles.xml 中创建一个<style>
,像这样:
<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" />
查看这些链接以供参考:
Android Reference - Apply A Theme Android Reference - WindowEnterAnimation【讨论】:
有效!其实我稍微改了一下:<style name="CustomAnimationActivity" parent="@android:style/Animation.Activity"> <item name="android:activityOpenEnterAnimation">@anim/activity_open_enter</item> <item name="android:activityOpenExitAnimation">@anim/activity_open_exit</item> <item name="android:activityCloseEnterAnimation">@anim/activity_close_enter</item> <item name="android:activityCloseExitAnimation">@anim/activity_close_exit</item> </style>
@DavidLiu,打开的动画看起来正在运行,但关闭的动画不生效。
@GenLiu 你能告诉我你的xml例子吗?例如,我只是看不出 openexit 和 close enter 之间的区别。
感谢您的精彩回答,帮了大忙!
对我有用,但我必须删除parent="android:Theme.Translucent"
,否则它将不起作用。谢谢。【参考方案2】:
我知道这已经得到解答,但这是我在我的工作中所做的。我们仍然支持 API 14,因此缺少一些动画,我不得不从 API 22(slide_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>
【讨论】:
它直接来自 API 22 库,只需下载 API 22 的源代码,它将在动画文件夹中。 非常简单和最简单的屏幕转换方法非常感谢:)【参考方案3】:我的解决方案大多类似于 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文件夹下创建anim文件夹,然后创建这四个动画文件:
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>
【讨论】:
这根本行不通,至少在android 6(华为p8)上不行 它在我的 huawei gPlay mini (Android 6) 和 Nexus 9(Android 7) 上运行顺畅。请运行这个项目:github.com/ShohanAhmed/… 我调查了一个问题,你说对了一部分。它也在我的手机上运行,但仅当您从活动中调用意图(以显示新活动)时。如果您想从小部件打开一些活动并使用 Pending Intent,它在那里不起作用。在这种情况下,唯一的选择是在我最初提到的代码中以编程方式设置动画......【参考方案4】:My solution is mostly like of others...
<style name="YourAnimation.Activity" parent="@android:style/Animation.Activity">
<item name="android:windowEnterAnimation">@anim/slidefromright</item>
<item name="android:windowExitAnimation">@anim/slidetoright</item>
</style>
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:windowAnimationStyle">@style/YourAnimation.Activity </item>
</style>
</resources>
【讨论】:
【参考方案5】:第 1 步:创建一个基础活动
第 2 步:将所有活动扩展到此基础活动
第 3 步:在您的基础活动中添加以下代码
@Override
protected void onStart()
super.onStart();
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
@Override
protected void onPause()
super.onPause();
if (isFinishing())
overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out);
【讨论】:
非常漂亮和简单!以上是关于如何在 Android 应用程序中一次更改所有活动转换?的主要内容,如果未能解决你的问题,请参考以下文章