15

我在按钮上执行了翻译动画,一切正常,但唯一的问题是动画后按钮没有响应点击事件,请纠正我

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

7 回答 7

23

这将在 y 方向上平移对象:

ObjectAnimator mover = ObjectAnimator.ofFloat(v, "translationY", 0, 400);
mover.start();
于 2012-05-04T06:27:56.227 回答
21

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

于 2012-05-04T05:33:16.513 回答
10

我遇到了这个问题,我确实在几秒钟前修复了它。所以,我认为我应该与你们分享我的解决方案。

  • 在动画 xml 文件中,我android:fillAfter="true"在 keep 时删除了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:今天,您可以ObjectAnimator在 android 3.0 + 上使用。如果您正在为 3.0 以下的 android 开发,您可以在 support library v.4 中找到它。ObjectAnimator最适合动画。

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

mButton.animate()
                .setDuration(TIME)
                .translationY(VALUE)
                .start();
于 2012-06-13T11:11:37.453 回答
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);
        }
    };
}
于 2012-05-04T13:45:54.477 回答
4

动画不会改变 View 的实际位置。即使你设置了fillAfter(true),它可以接受点击事件的位置就是原来的位置。

于 2012-05-04T05:31:40.593 回答
1

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

于 2012-06-13T16:10:47.017 回答
0

尝试使用这个:

b.layout(0, -40, b.getWidth(), b.getHeight());
于 2012-05-04T06:14:04.407 回答