【问题标题】:Button not responding to Click Event after Translation animation翻译动画后按钮不响应点击事件
【发布时间】:2017-12-11 19:54:43
【问题描述】:

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

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

【问题讨论】:

  • 好像,你忘记给Button添加监听器了。

标签: android


【解决方案1】:

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

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

【讨论】:

  • 您还可以使用 AnimatorSet 在 x 和 y 方向组合平移动画。
【解决方案2】:

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

【讨论】:

  • :那么翻译后如何更改按钮位置,目前我已经设置了动画监听器,并且在动画结束回调中我已经获取了layoutparam并设置了它,但它不会解决问题
  • 动画完成后,您必须动态创建一个新按钮并将其添加到该位置并将按钮可见性更改为 view.gone。
  • 或者您可以在布局中创建两个相同的按钮并在动画中切换它们的可见性。
【解决方案3】:

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

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

  • 注册Animation listener,然后在onAnimationEnd()方法中,我调用View#Layout()来改变view的位置。

                    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 开发,您可以在 support library v.4 中找到它。 ObjectAnimator 最适合动画。

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

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

【讨论】:

  • ObjectAnimator 不在支持库中!!
  • +1 巨大的帮助“在动画 xml 文件中,我在保持 android:fillEnabled="true" 时删除了 android:fillAfter="true"”
  • mButton.animate() 完美运行。它也翻译和移动按钮。 +1
【解决方案4】:

我可以实现您想要的,但您需要手动管理坐标。 看看它是否适合你。

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,您的解决方案实际上对我有用,即使对于显示/隐藏动画也是如此,但我能看到的唯一问题是视图在屏幕另一侧闪烁动画结束并且它“坚持”在它的新位置。你也观察到了吗?
【解决方案5】:

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

【讨论】:

    【解决方案6】:

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

    【讨论】:

    • 这是否意味着没有可接受的答案?您也可以接受自己的答案。
    【解决方案7】:

    尝试使用这个:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      相关资源
      最近更新 更多