动画视图上的onTouch事件

时间:2015-11-22 19:18:37

标签: android android-animation

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

这是我的活动代码:

    @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 有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:0)

好的,这就是问题。

您正在使用的视图动画来自较旧的系统,它只模拟动画,而不是移动视图的位置。因此,当您触摸视图移动的区域时,触摸上没有读数,因此会被忽略。但是如果你触摸视图原始位置的区域,它将触发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) {


        }
    });