【问题标题】:How to use default animations in Android?如何在 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();

提示?谢谢! :)

【问题讨论】:

    标签: android android-fragments android-animation


    【解决方案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?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 2021-09-19
      • 2019-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多