【问题标题】:Starting activity on mouse click makes animation slow单击鼠标时开始活动会使动画变慢
【发布时间】:2016-01-27 20:17:44
【问题描述】:

所以我正在开发 Android 应用程序,其中有一个主屏幕和另一个显示应用程序内容的屏幕。在主屏幕上,我有一个按钮可以将用户导航到内容的屏幕(实际上它是图像视图,但用作按钮)。 单击此按钮时,应启动其自身被单击的动画,然后启动内容屏幕的活动。 但它实际上工作得非常糟糕而且很慢,当我单击按钮时动画开始但它变慢了(滞后)。我尝试将事件从点击更改为点击以及许多其他可能的解决方案,但都没有奏效。 我尝试评论“startActivity”方法并修复它,动画运行顺利。显然我需要 startActivity 方法,那么这里最好的方法是什么,我该如何解决这个问题。可以将 startActivity 放在不同的线程中工作吗,我不知道该怎么做

这是我的代码:

((Button)findViewById(R.id.btnPlay)).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(final View v) {
            //shake.reset();
            findViewById(R.id.btnPlay).startAnimation(shake);

            shake.setAnimationListener(new Animation.AnimationListener() {
                Intent i;

                @Override
                public void onAnimationStart(Animation animation) {
                    i = new Intent(v.getContext(), GameActivity.class);
                    startActivity(i);
                }

                @Override
                public void onAnimationEnd(Animation animation) {
                    ((Button) findViewById(R.id.btnPlay)).setVisibility(View.INVISIBLE);
                }

                @Override
                public void onAnimationRepeat(Animation animation) {

                }
            });
        }
    });

shake 是从自定义 xml 文件加载的动画。我在内容屏幕中有相同的动画并且运行流畅,当然那里没有 startActivity。代码如下:

<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
    android:duration="70"
    android:fromDegrees="-5"
    android:pivotX="50%"
    android:pivotY="50%"
    android:repeatCount="5"
    android:repeatMode="reverse"
    android:interpolator="@android:anim/linear_interpolator"
    android:toDegrees="5" />
<translate
    android:fromXDelta="-10"
    android:toXDelta="10"
    android:repeatCount="5"
    android:repeatMode="reverse"
    android:interpolator="@android:anim/linear_interpolator"
    android:duration="70" />

【问题讨论】:

  • 只是一个注释,((Button)findViewById(R.id.btnPlay)).setOnClickListener(... 可以简化为 findViewById(R.id.btnPlay).setOnClickListener(...setVisibility 也一样
  • 请定义shake 是什么。如果它从自定义 xml 资源加载,也将其添加到您的问题中
  • 另外,在调用 startAnimation 之前设置你的 animationListener
  • 是的,它来自自定义 xml 资源
  • 也将此添加到您的问题中

标签: java android android-intent android-activity mobile


【解决方案1】:

在onAnimationEnd()中移动这几行代码

i = new Intent(v.getContext(), GameActivity.class);
startActivity(i);

更新

我刚刚尝试了这段代码,它对我很有效:

    Animation animation = AnimationUtils.loadAnimation(MyApplication.getAppContext(), R.anim.shake);

    public void onClick(View v) {
        if (v.getId() == R.id.btnPlay) {
            animation.setAnimationListener(new Animation.AnimationListener() {
                @Override
                public void onAnimationStart(Animation animation) {

                }

                @Override
                public void onAnimationEnd(Animation animation) {
                    Intent intent = new Intent(getActivity(), ArticleActivity.class);
                    startActivity(intent);
                }

                @Override
                public void onAnimationRepeat(Animation animation) {

                }
            });
            v.startAnimation(animation);
        }
    }

如果 Activity 是在按钮的动画开始时启动的,那么可能有太多的东西(例如:按钮动画、Activity 生命周期方法的执行,包括 Fragment 的生命周期方法、用于在 Activity 之间转换的动画)在主线程上执行 => 按钮动画可能会卡住(动画不流畅)。

【讨论】:

  • 我试过了,没有任何改变,它仍然很慢并且动画错误
  • 大卫,我同意这一点。但是您能否详细说明为什么这很重要? (对于其他读者)
  • 我想动画会播放到最后。我试过了,我几乎把 startActivity 代码放在了任何地方。我仍然会放慢动画速度
  • 感谢您的回答。事实证明,我正在加载的活动的 onCreate 中有很多东西。所以我可能不得不考虑优化它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
相关资源
最近更新 更多