翻译:在翻译动画后,按钮无响应点击事件。

16

我已经在按钮上执行了一个翻译动画,一切都按照我预期的进行,但唯一的问题是,在动画之后,按钮无法响应点击事件,请纠正我。

Button b=(Button)findViewById(R.id.button1);
    TranslateAnimation slide=new TranslateAnimation(0, 30, 0,-40);
    slide.setDuration(500);
    slide.setZAdjustment(TranslateAnimation.ZORDER_TOP);
    slide.setFillAfter(true);

    b.startAnimation(slide);

似乎你忘记给按钮添加监听器了。 - RobinHood
7个回答

23

这将沿 y 方向移动对象:

ObjectAnimator mover = ObjectAnimator.ofFloat(v, "translationY", 0, 400);
mover.start();

同时,您可以使用AnimatorSet结合翻译x和y方向的动画。 - Sushil Kadu

22

如果您在低于HoneyComb的API级别上处理动画,则您的动画实际上并不移动按钮,而只是移动其图像。它的点击将在您在布局中放置它的原始位置。


然后在翻译之后,我如何更改按钮的位置,目前我已经设置了动画监听器,在动画结束回调中获取了布局参数并将其设置为它,但这并不能解决问题。 - Bytecode
当动画完成后,您将需要动态创建一个新按钮并将其添加到该位置,并更改按钮的可见性以view.gone。 - Its not blank
或者您可以在布局中创建两个相同的按钮,并在动画中切换它们的可见性。 - Its not blank

10

我之前遇到了这个问题,但是刚刚解决了。因此,我想与大家分享我的解决方案。

  • 在动画的XML文件中,我删除了android:fillAfter="true",但保留了android:fillEnabled="true"

  • 注册动画监听器,在onAnimationEnd()方法中调用View#Layout()来改变视图的位置。

                int newLeft = (int) (layoutContent.getLeft() + layoutContent.getWidth() * 0.8);
                layoutContent.layout(newLeft, 
                                    layoutContent.getTop(), 
                                    newLeft + layoutContent.getMeasuredWidth(), 
                                    layoutContent.getTop() + layoutContent.getMeasuredHeight());

在我的情况下,动画的作用是将layoutContent向左滑动80%的宽度。

这个方法很好用。希望能对你有所帮助。

@更新:今天,你可以在Android 3.0+上使用ObjectAnimator。如果您正在开发低于3.0版本的Android应用程序,则可以在支持库v.4中找到它。ObjectAnimator是最好的动画工具。

@更新#2:你可以在Android API版本高于12的设备上使用ViewPropertyAnimator。它提供了更好的性能,并解决了点击事件的问题。例如:

mButton.animate()
                .setDuration(TIME)
                .translationY(VALUE)
                .start();

1
ObjectAnimator不在支持库中!! - amiekuser
+1 对于“在动画xml文件中,当保留android:fillEnabled =“true”时,我删除了android:fillAfter =“true””非常有帮助。 - Mazino
mButton.animate() 运行完美。它可以翻译并移动按钮。+1 - AndroDev

5
我可以完成您想要的内容,但是您需要手动管理坐标。 看看是否适用于您。
public class AnimationTestActivity extends Activity {

    private Button mButton;

    private LinearLayout.LayoutParams params;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mButton = (Button) findViewById(R.id.button);
        mButton.setOnClickListener(mClickListener);

        params = (LayoutParams) mButton.getLayoutParams();
    }

    private android.view.View.OnClickListener mClickListener = new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            TranslateAnimation animation = new TranslateAnimation(0, 0, 0, 400);
            animation.setDuration(2000);
            animation.setAnimationListener(mAnimationListener);
            v.startAnimation(animation);
        }
    };

    private AnimationListener mAnimationListener = new AnimationListener() {

        @Override
        public void onAnimationStart(Animation animation) {

        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            params.topMargin = params.topMargin + 400;
            mButton.setLayoutParams(params);
        }
    };
}

嗨,@Sushil,你的解决方案对我来说确实有效,即使是显示/隐藏动画,但我唯一能看到的问题是视图在动画结束时会在屏幕的相反侧闪烁,并且在其新位置上“持续存在”。你也注意到了这个问题吗? - mdelolmo

4
动画实际上不会改变视图的位置。即使您设置了fillAfter(true),它可以接受点击事件的位置仍然是原始位置。

1

我发现一个简单的解决方案,即在布局中定义按钮的最终位置,并从某个位置开始动画,例如指定fromX或fromY,而不是将其设置为零。


这是否意味着没有被接受的答案?您也可以接受自己的答案。 - Talha

0

尝试使用这个:

b.layout(0, -40, b.getWidth(), b.getHeight());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接