触摸事件onTouch
原创
©著作权归作者所有:来自51CTO博客作者qq5d510d208e604的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
初步了解MotionEvent
public static final int ACTION_DOWN = 0;单点触摸动作
public static final int ACTION_UP = 1;单点触摸离开动作
public static final int ACTION_MOVE = 2;触摸点移动动作
public static final int ACTION_CANCEL = 3;触摸动作取消
public static final int ACTION_OUTSIDE = 4;触摸动作超出边界
public static final int ACTION_POINTER_DOWN = 5;多点触摸动作
public static final int ACTION_POINTER_UP = 6;多点离开动作
//以下是一些非touch事件
public static final int ACTION_HOVER_MOVE = 7;
public static final int ACTION_SCROLL = 8;
public static final int ACTION_HOVER_ENTER = 9;
public static final int ACTION_HOVER_EXIT = 10;
onTouchListener的return
返回false时
layout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()){
case MotionEvent.ACTION_DOWN:
Log.d("MotionEvent","ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.d("MotionEvent","ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.d("MotionEvent","ACTION_UP");
break;
}
return false;
}
});
返回true时
通过日志发现,为false
的时候,只会执行down
方法,不会执行move和up
只有在true
的时候,三个都会执行
return true
表示消费了触摸事件,onTouch
之后才执行onClick
,这里被消费了,所以,相关的点击事件不会执行
onTouch和onClick
onClick
的过程是手指按下和抬起的过程(中间,手指抖动会产生移动),可以将onClick
看做是一种特殊的onTouch
。如果onTouch
没有消费掉触摸事件(没有return true),在onTouch
后, 紧接着会执行onClick
事件;如果onTouch
消费掉了触摸事件(return true)
,后面将不会再执行onClick
事件
需求较为复杂时,不仅需要touch
事件也需要点击,甚至是长按事件,可以在onTouch
中判断要进行哪一种事件(根据触摸的时间,距离等来判断)
获取位置
使用event.getX();
、event.getY();
来获取位置(手指按下,移动或者是抬起时的位置)。通过位置来判断手指滑动的方向
在左右滑动的过程中,需要对控件进行位置更改的,每一次更改位置,都需要保证将要移动到的位置需要在上面的x变化中,大于或者小于两边的边界值时,就取边界值
滑动事件和VelocityTracker 速度跟踪
关于速度,速度是有方向的。向左(上)滑动所产生的速度是负数,向右(下)滑动所产生的速度是正数
什么时候需要速度跟踪?
根据用户手指操作的速度来进行某些操作时,需要进行速度跟踪。例如,对slidMenu的操作,手指可能并没有滑动到显示menu的一半(往显示menu的方向进行滑动),但是,如果我滑动的速度很快,那么此时还是应该显示menu界面
思路
在VIew的 onTouchEvent()
中,当MotionEvent.ACTION_DOWN
时初始化VelocityTracker, 在MotionEvent.ACTION_MOVE
进行追踪,当滑动停止之后(MotionEvent.ACTION_UP
or MotionEvent.ACTION_CANCEL
)不要忘记调用clear()
来回收内存
VelocityTracker velocityTracker;
int xVelocity = 0;
int yVelocity = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_input_filter);
layout = findViewById(R.id.layout);
layout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()){
case MotionEvent.ACTION_DOWN:
velocityTracker = VelocityTracker.obtain();
break;
case MotionEvent.ACTION_MOVE:
velocityTracker.addMovement(motionEvent);
velocityTracker.computeCurrentVelocity(1000);
获取x轴方向的速度
xVelocity = (int) velocityTracker.getXVelocity();
yVelocity = (int) velocityTracker.getYVelocity();
Log.d("MotionEvent","x轴速度:"+xVelocity);
Log.d("MotionEvent","y轴速度:"+yVelocity);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
velocityTracker.clear();
velocityTracker.recycle();
break;
}
return true;
}
});
}
由以下两篇文章整理
简书 作者:AxeChen链接:https://www.jianshu.com/p/29371bf70dff
作者:彼岸花you
原文:https://blognet/u012391876/article/details/54408804