【问题标题】:onTouch event on an animated view动画视图上的 onTouch 事件
【发布时间】:2015-11-22 19:18:36
【问题描述】:

我想在动画视图上设置触摸事件,然后在触摸视图上停止动画。

这是我的活动代码:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       touch_me = (TextView) findViewById(R.id.touch_me);
       touch_me.setOnTouchListener(new OnTouchMeListener());
       Display display = getWindowManager().getDefaultDisplay();
       Point size = new Point();
       display.getSize(size);
       int fromX = size.x;
       int fromY = size.y;
       int toX = (-1) * view.getWidth();
       TranslateAnimation animation = new TranslateAnimation(fromX, -100, 0, 0);
       animation.setDuration(6000);
       animation.setRepeatCount(5);
       animation.setFillAfter(true);
       touch_me.startAnimation(animation);
   }

这是我的班级听众:

public class OnTouchMeListener implements View.OnTouchListener{

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        touch_me.clearAnimation();
        return true;
    }
}

问题是仅在视图的初始位置(在 XML 文件中)检测到 onTouch 谁能帮帮我?

【问题讨论】:

  • 什么是OnTouchMeListener ?这是嵌套类吗?您是否尝试将touch_me.clearAnimation(); 更改为v.clearAnimation();
  • @DamianKozlak OnTouchMeListener 是我自己在触摸事件上调用的类。让我试试这个我会告诉你的
  • 嗨 @DamianKozlak 我试过 v.clearAnimation 但它不起作用
  • v.getAnimation().cancel(); 怎么样?你试过了吗?
  • 是的,但它也不起作用。

标签: android android-animation


【解决方案1】:

好的,问题来了。

您使用的视图动画来自旧系统,它只模拟动画,不移动视图的位置。因此,当您触摸视图移动的区域时,您的触摸没有读数,因此它会被忽略。但是如果您触摸视图原始位置的区域,它将触发 touchevent 回调方法并根据您的代码取消动画。

有几种方法可以解决这个问题。

一个是通过调用 onlayout 并在每次动画发生变化时通过调用视图的 onlayout 方法重新定位视图。 Button is not clickable after TranslateAnimation

或者另一个是通过使用 touchdelegate 类来改变视图的触摸区域 http://cyrilmottier.com/2012/02/16/listview-tips-tricks-5-enlarged-touchable-areas/

但我认为这两个选项不是解决您问题的好方法。

我会选择第三个选项: 改用 propertyanimation。它与旧系统的不同之处在于它更新了更改所需的值,而不是执行实际的动画。实际的动画是在 update 方法中使用您自己的算法完成的。

http://developer.android.com/guide/topics/graphics/prop-animation.html

这是一个例子:

    ValueAnimator animTranslation = ValueAnimator.ofFloat(valueStart, valueEnd);
    animTranslation.setDuration(300);
    animTranslation.removeAllUpdateListeners();
    animTranslation.removeAllListeners();
    animTranslation.addUpdateListener(new     ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {

          myView.setRotation(currValue - (Float) animation.getAnimatedValue());


            }

        }


    });
    animRotation2.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {


        }

        @Override
        public void onAnimationEnd(Animator animation) {

        }

        @Override
        public void onAnimationCancel(Animator animation) {

        }

        @Override
        public void onAnimationRepeat(Animator animation) {


        }
    });

【讨论】:

  • 我不知道如何在我的情况下实现您的示例。你能解释一下什么是 animRotation2 和 currValue 吗?
  • 哎呀。只需将 animRotation 替换为 animTranslation 即可,您可以忽略当前值。你用animation.getanimatedvalue得到更新值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
相关资源
最近更新 更多