【问题标题】:How to fade out all views when switching activities切换活动时如何淡出所有视图
【发布时间】:2013-03-03 00:41:45
【问题描述】:

我的活动有大约 4-5 次浏览。它有一个白色的背景。 理想情况下,我想将整个活动淡化为纯白色,然后淡入新活动。 但由于彩色动画是不可能的,我已经放弃了这个想法。我制作的动画是这样的:

淡入:

<?xml version="1.0" encoding="UTF-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0" 
        android:interpolator="@android:anim/accelerate_interpolator" 
        android:duration="1200"/>
</set>

淡出:

<?xml version="1.0" encoding="UTF-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha android:fromAlpha="1.0" android:toAlpha="0.0" 
        android:interpolator="@android:anim/accelerate_interpolator" 
        android:duration="1200"/>
</set>

我只是通过将以下代码行添加到我的所有活动来设置动画:

overridePendingTransition( R.animator.fadein, R.animator.fadeout);

但是问题来了:当使用activity的alpha值淡出时,当alpha值降低时整个activity变成灰色。这在白色背景下看起来不漂亮。

所以我想出了一个想法,就是淡出该活动的所有视图。我的问题:我该如何正确地做到这一点?顺便说一句,如果有人有更好的想法,请随时告诉我。谢谢!

【问题讨论】:

  • 我有一些问题:活动淡入/淡出的触发因素是什么?我的意思是,您如何为特定视图启动动画?你使用什么 setAlpha() (带有 int 或 float 参数的那个)?
  • 触发器是两个activity之间的切换。我只是用上面问题中的最后一行代码覆盖了标准的 android 转换。

标签: android animation


【解决方案1】:

一种方法是将视图包装在RelativeLayout 中,然后膨胀视图并将其添加到外部RelativeLayout,背景颜色为00ffffff,并带有fill_parent 参数。

在开始新活动之前,使用处理程序和 runnable 以设定的时间间隔增加 alpha 值(并使视图无效)。一旦 alpha 达到 255,就开始新的活动。根据自己的喜好调整 Handler.postDelayed() 的速度。

【讨论】:

    【解决方案2】:

    这是来自 Google 的一位 Android 图形专家的精彩博文 - Old Views Don't Die; They Just Fade Away

    我相信您可以将它用于您的项目。查看他关于动画的其他文章和 YouTube 视频,它们非常棒。祝你好运!

    【讨论】:

      【解决方案3】:

      我在 npace 提到的文章的启发下回答了我的问题。你会在下面找到我的淡出方法。它使用我上面已经创建的动画来淡出父容器RelativeLayout中的所有视图。

      RelativeLayout container = findViewById(R.id.mainContainer);
      
      for(int i = 0; i < container.getChildCount(); i++)
                  container.getChildAt(i).startAnimation(AnimationUtils.loadAnimation(c, R.animator.fadeout));
      
              new Handler().postDelayed(new Runnable()
              {
                  @Override
                  public void run()
                  {
                      for(int i = 0; i < container.getChildCount(); i++)
                          container.getChildAt(i).setVisibility(View.INVISIBLE);
                      c.startActivity(intent);
                  }
              }, fadeDuration);
      

      【讨论】:

        猜你喜欢
        • 2014-05-20
        • 1970-01-01
        • 2012-05-21
        • 2013-02-24
        • 1970-01-01
        • 2015-09-29
        • 2011-08-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多