【问题标题】:Buttons on an animated view respond to clicks even when off screen?即使在屏幕外,动画视图上的按钮也会响应点击?
【发布时间】:2012-09-17 16:18:34
【问题描述】:

我有一个 LinearLayout,我正在对其应用翻译动画。我在之前和之后填充动画。视觉上它工作正常。动画通过将视图平移到屏幕外而结束。但是,如果我在屏幕上单击一个 x,y 坐标,而该坐标恰好是视图在其动画期间的某个位置,则视图上的一个按钮会触发其单击侦听器。

我找到的唯一解决方案是添加一个动画侦听器,当动画结束时,将(现在看不见的)布局上的按钮标记为 visibility=gone,enabled=false。这看起来很奇怪——视图不再出现在屏幕上,但它仍在响应点击事件。这是众所周知的事情吗,我可能没有正确设置动画?

谢谢

----- 更新--------

我稍微重构了我的动画。我没有使用 animation.setFillAfter(true),而是在动画完成时将布局的可见性设置为 GONE。现在它在屏幕外时不会注册点击。仍然有兴趣知道这是否是已知的事情,因为不必添加动画侦听器等会更容易。

【问题讨论】:

  • 是的,这是众所周知的事情。如果将 setFillAfter() 设置为 true 并转换视图,并且还向视图添加了点击侦听器,则视图不会在转换后的位置上获得点击,但原始 (x,y) 位置仍会收到点击。
  • 好的,你可以添加一个答案,这样我就可以关闭它了吗?

标签: android


【解决方案1】:

Translate Animations on lower level API(蜜梳下面)改变了按钮的绘制位置,但不改变按钮物理存在于容器中的位置。所以,你自己来处理这种情况。有关这方面的更多信息,您可以参考此link。一种方法是实际更改布局中按钮的位置(而不是通过动画)。以下是实现此目的的方法:

    params = (LayoutParams) mBtn.getLayoutParams();

    TranslateAnimation animation = new TranslateAnimation(0, 0, 0, 400);
    animation.setDuration(2000);
    animation.setAnimationListener(mAnimationListener);
    mBtn.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);
    }
};

这里通过改变布局参数,我们改变了按钮的物理位置。

在您的情况下,视图正在离开屏幕,因此您只需要在动画结束时更改按钮(View.GONE)的可见性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    相关资源
    最近更新 更多