如何在 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中调用另一个活动时如何提供动画?

如何启用从设置中删除动画-> 辅助功能 android

如何在Android中加载带有动画的cardview GridView?

如何动画添加或删除 Android ListView 行

如何在使用 Chaquopy 时在 android 中显示加载动画

如何在Android中给出从上到下的动画?