翻译动画后按钮没有响应Click事件

时间:2012-05-04 05:29:02

标签: android

我在按钮上执行了翻译动画,一切都按照我的预期工作,但只有问题是动画后按钮没有响应点击事件请纠正我

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);

7 个答案:

答案 0 :(得分:23)

这将在y方向上转换对象:

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

答案 1 :(得分:21)

如果您正在使用较低级别的API(HoneyComb下方)处理动画,那么您的动画实际上不会移动按钮而只移动其图像。它的点击将位于您将其放置在布局中的相同位置。

答案 2 :(得分:6)

我遇到了这个问题,而且我在几秒钟之前就解决了这个问题。所以,我认为我应该与你们分享我的解决方案。

  • 在动画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%的宽度。

工作正常。希望这会有所帮助。

@Update:今天,你可以在android 3.0 +上使用ObjectAnimator。如果您正在为3.0下的android开发,可以在支持库v.4中找到它。 ObjectAnimator是动画的bester。

@ Update#2:你可以在android api更高版本12上使用ViewPropertyAnimator。 它提供了更好的性能,并修复了点击事件的问题。例如:

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

答案 3 :(得分: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);
        }
    };
}

答案 4 :(得分:4)

动画不会更改“查看实际位置”。即使你setfillAfter(true),它可以接受点击事件的位置也是原始位置。

答案 5 :(得分:0)

尝试使用它:

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

答案 6 :(得分:0)

我找到了一个简单的解决方案来定义布局中的按钮最终位置并从某个位置开始动画,即指定fromX或fromY而不是将其置为零