我想在动画视图上设置触摸事件,然后在触摸视图时停止动画。
这是我的活动代码:
@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 有人可以帮帮我吗?
答案 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) {
}
});