如何在 Android 中使用默认动画?
Posted
技术标签:
【中文标题】如何在 Android 中使用默认动画?【英文标题】:How to use default animations in Android? 【发布时间】:2014-05-06 17:37:57 【问题描述】:我正在尝试使用带有片段的 Activity 的默认动画.. 在这里我找到了一些关于它的东西:
android: using Activity's default animation for Fragments
问题是:好的,我需要(例如)“activityOpenEnterAnimation”.. 我该如何使用它?
使用以下代码不起作用:
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(android.R.anim.activityOpenEnterAnimation, android.R.anim.activityOpenExitAnimation);
transaction.replace(R.id.container, fragment)
.addToBackStack(((Object) fragment).getClass().getName())
.commit();
提示?谢谢! :)
【问题讨论】:
【参考方案1】:如今,Android 文档明确建议不要直接使用来自 android.R.*
的资源,因为平台的每个版本都会对其进行更改。甚至某些资源也会从一个版本消失到另一个版本,因此您不应该依赖它们。另一方面,很多资源是私有的,不能从开发者的代码中获得。
最安全(也是推荐)的方法是简单地将您需要的资源(在本例中为动画)从您想要的 Android 版本的源代码中复制并粘贴到您自己的代码中,并通过常规 @ 使用它们987654323@.
您可以通过多种方式浏览 Android 源代码,如 [1] 中所述。
[1]Where can I find Android source code online?
【讨论】:
我试过了:transaction.setCustomAnimations(R.anim.activity_open_enter, R.anim.activity_open_exit);但这和活动中的不一样...建议? 在Android平台的源码中搜索R.anim.activity _open_enter
,看看具体是怎么用的,可能唯一的区别就是简单配置,或者使用其他构造函数等
Nowadays, Android documentation clearly recommends not to use resources directly
-> 你在 2014 年写了这篇文章。它的来源在哪里?我从没听他们说过,事实上,他们大多说:一定要使用平台价值观,这就是我们拥有它们的原因!
它在 4 年前曾经说过(如果你真的看到日期,不难弄清楚,顺便说一句......)。我不知道他们最近是否删除了它,但我肯定不会依赖任何 android.R.*
资源。到目前为止,我已经在许多遗留的 Android 应用程序中工作过,我真的不需要文档来说明。通过“在家”控制我的资源,我睡得更好......答案中清楚地说明了原因。祝你好运!【参考方案2】:
后按发生时使用默认android动画的示例
@Override
public void onBackPressed()
super.onBackPressed();
overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out);
要使用默认动画,您应该使用 android.R.anim.ANIMATIONNAME
【讨论】:
【参考方案3】:我设法让它以这种方式工作:
static public int getResourceIdFromCurrentThemeAttribute(FragmentActivity activity, int attribute)
TypedValue a = new TypedValue();
activity.getTheme().resolveAttribute(attribute, a, false);
return a.resourceId;
//This type of fragment will be opened like an activity
static public void openActivityLikeFragment(FragmentActivity activity, BaseFragment fragment, int containerId, String stackRef)
FragmentManager fm = activity.getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
//The fragment open/close transition should have the same animations as its activity
ft.setCustomAnimations(
getResourceIdFromCurrentThemeAttribute(activity, android.R.attr.activityOpenEnterAnimation),
getResourceIdFromCurrentThemeAttribute(activity, android.R.attr.activityOpenExitAnimation),
getResourceIdFromCurrentThemeAttribute(activity, android.R.attr.activityCloseEnterAnimation),
getResourceIdFromCurrentThemeAttribute(activity, android.R.attr.activityCloseExitAnimation)
);
ft.replace(containerId, fragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(stackRef);
ft.commit();
此解决方案比直接引用资源更安全,因为它引用的属性在没有一些弃用警告的情况下不会更改。
【讨论】:
好主意,但它对我不起作用,我总是从 resolveAttributes 得到 0,你使用的是哪个 Theme?以上是关于如何在 Android 中使用默认动画?的主要内容,如果未能解决你的问题,请参考以下文章
如何在Android中加载带有动画的cardview GridView?