当前位置: 首页 > 知识库问答 >
问题:

Android-活动之间的正确(基于堆栈,前后正确)动画

孔鸿哲
2023-03-14

假设我有以下层次结构:

  • 1级活动(例如主菜单)
    • 2级活动(如日历)
      • 3级活动(如日历日)

      存在以下用例:

      1. 深入人心

      需要以下过渡行为:

      用例1 3:我希望旧活动从左侧滑出,新活动从右侧滑入

      用例2:我希望旧活动滑出到右侧,新活动滑入到左侧

      我尝试了很多方法来使用overridePendingTranplace来实现这一点,但没有一个组合可以正常工作...我被以下内容卡住了:

      public class BaseActivity extends Activity
      {
          @Override
          protected void onPause()
          {
              adjustWindowAnimation(this, false);
              super.onPause();
          }
      
          @Override
          protected void onResume()
          {
              adjustWindowAnimation(this, true);
              super.onResume();
          }
      
          protected void adjustWindowAnimation(Activity parent, boolean start)
          {
              if (start)
                  parent.overridePendingTransition(R.anim.slide_from_right_in, R.anim.slide_to_left_out);
              else
                  parent.overridePendingTransition(R.anim.slide_from_left_in, R.anim.slide_to_right_out);
          }
      
      //     @Override
      //     protected void onCreate(Bundle savedInstanceState)
      //     {
      //         adjustWindowAnimation(this, true);
      //         super.onCreate(savedInstanceState);
      //     }
      
      //     @Override
      //     protected void onRestoreInstanceState(Bundle savedInstanceState)
      //     {
      //         adjustWindowAnimation(this, true);
      //         super.onRestoreInstanceState(savedInstanceState);
      //     }
      
      //     @Override
      //     protected void onStart()
      //     {
      //         super.onStart();
      //         adjustWindowAnimation(this, true);
      //     }
      
      //     @Override
      //     protected void onNewIntent(Intent intent)
      //     {
      //         adjustWindowAnimation(this, true);
      //         super.onNewIntent(intent);
      //     }
      
      //     @Override
      //     protected void onStop()
      //     {
      //         adjustWindowAnimation(this, false);
      //         super.onStop();
      //     }
      
      //    @Override
      //    public void finish()
      //    {
      //        adjustWindowAnimation(this, false);
      //        super.finish();
      //    }
      
      //    @Override
      //    protected void onDestroy()
      //    {
      //        Crouton.clearCroutonsForActivity(this);
      //        super.onDestroy();
      //    }
      
      //     @Override
      //     public void onBackPressed()
      //     {
      //         adjustWindowAnimation(this, false);
      //         super.onBackPressed();
      //     }
      
      }
      

      动画(这些应该正常工作):

      SlideFromLeftIn:

      <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator">
          <translate android:fromXDelta="-100%" android:toXDelta="0"
              android:duration="@android:integer/config_shortAnimTime" />
      </set>
      

      SlideFromRightIn:

      <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator">
          <translate android:fromXDelta="100%" android:toXDelta="0"
                  android:duration="@android:integer/config_shortAnimTime" />
      </set>
      

      滑出:

      <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator">
          <translate android:fromXDelta="0%" android:toXDelta="-100%"
              android:duration="@android:integer/config_shortAnimTime" />
      </set>
      

      幻灯片右对齐:

      <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator">
          <translate android:fromXDelta="0" android:toXDelta="100%"
                  android:duration="@android:integer/config_shortAnimTime" />
      </set>
      

共有1个答案

聂和宜
2023-03-14

为了达到这种行为,你需要知道暂停和恢复的原因。比如,如果它的另一个活动将被呈现,那么应用程序将在onPause()中播放一个动画,但如果它没有(所以这是任何其他原因),那么您将播放另一个动画。同样在onResume()中-如果是某个活动开始了,现在它已经完成了,这就是为什么触发了onResume(),那么你播放一个相应的动画,但如果完成活动没有触发onResume(),那么你播放另一个动画<我做了以下类似的事情:

public class MainMenuActivity extends Activity{
...
    protected boolean isGoingToAlarmActivity;
    protected boolean isGoingToSettingsActivity;
    @Override
    protected void onPause() {
        // for animation choose
        if (isGoingToAlarmActivity){
            isGoingToAlarmActivity = false;
            overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
        }
        else if (isGoingToSettingsActivity){
            isGoingToSettingsActivity = false;
            overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
        }

        super.onPause();
    }

public void onAlarmButtonClick (View button){
    isGoingToAlarmActivity = true;
    startActivity(new Intent(this, AlarmActivity.class));
}

public void onSettingsButtonClick (View button){
    isGoingToSettingsActivity = true;
    startActivity(new Intent(this, SettingsActivity.class));
}

...
}

项目菜单中只有3个活动:报警和设置。因此,它进入“从右到左”的动画设置,并在返回菜单时反转,AlrmActivity反之亦然。在AlarmActivity中:

@Override
protected void onPause() {
    // for animation choose
    if (isFinishing())
        overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);

    super.onPause();
}

并在设置活动中:

@Override
protected void onPause() {
    // for animation choose
    if (isFinishing())
        overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
    super.onPause();
}

注意:活动的isFinishing()方法表示活动就像用户点击后退按钮一样结束(可能还有其他原因,但在大多数情况下是这样)。

 类似资料:
  • 我有两个活动A和B。A启动活动B。在活动B中,我在按钮单击处理程序中调用setResult(RESULT_OK,intent),而不调用finish()-这是理想的行为。 旋转B并按back后,A的onActivityResult接收resultCode的RESULT_Cancelled,而不是RESULT_ OK。 我知道这是因为活动B在旋转时被破坏了。确保从B返回正确的结果代码的常见做法是什么

  • 在实现并尝试将动画应用于箭头文本视图后,当单击箭头时,动画显示异常行为。如何修复动画并获得与预期动画图像相似的结果? 预期动画 当前动画 回收视图项目 MyRecyclerAdapter。JAVA 苏拉布的建议

  • 本文向大家介绍在C ++中正确使用堆栈和堆?,包括了在C ++中正确使用堆栈和堆?的使用技巧和注意事项,需要的朋友参考一下 堆栈-函数内部声明的所有变量将占用堆栈中的内存。因此,函数内的任何局部变量都位于堆栈中。 堆-这是程序的未使用内存,可用于在程序运行时动态分配内存。因此,如果我们希望某些东西的寿命比声明它的函数的寿命更长,则必须在堆上分配它。 示例 堆内存中的主要问题是碎片,而堆栈中更容易出

  • 好吧,所以我有点困惑该怎么处理这个。因此,我有了主活动,从那里可以启动一个活动到DegreePlan活动,从那里可以启动另一个活动到EditDegreeplan。我已经将EditDegreeplan设置为在Android清单中没有历史记录。问题是在他们保存EditDegreeplan后,它会启动一个活动到Degreeplan。因此,如果用户按下后退键,他们必须按两次才能再次进入主活动。我想摆脱它,

  • 当我在我的个人资料活动中点击注销按钮时,我想把用户带到登录页面,在那里他需要使用新的凭证。 所以我用了这个代码: 在。 但问题是,当我点击登录活动上的设备返回按钮时,它会把我带到Profile活动。我期待的应用程序应该关闭时,我按下设备返回按钮上的登录活动。 我做错了什么? 我还在清单中为我的登录活动添加了 非常感谢。

  • 问题内容: 有什么规范的方法可以从堆栈中删除添加的中间件?似乎应该可以直接修改数组,但是我想知道是否有一个我应该首先考虑的文档化方法。 问题答案: 实际上来自Connect(不是Express),它真正要做的就是将中间件功能推送到应用程序的。 因此,您应该很好地将函数拼接出数组。 但是,请记住,周围没有文档,也没有删除中间件的功能。您冒着将来版本的Connect进行更改与代码不兼容的风险。