文章目录

初步了解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://手指移动(从手指按下到抬起 move多次执行)
Log.d("MotionEvent","ACTION_MOVE");
break;
case MotionEvent.ACTION_UP://手指抬起
Log.d("MotionEvent","ACTION_UP");
break;
}
return false;
}
});

触摸事件onTouch_setOnTouchListener

返回true时
触摸事件onTouch_ide_02

通过日志发现,为​​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();​​​来获取位置(手指按下,移动或者是抬起时的位置)。通过位置来判断手指滑动的方向
触摸事件onTouch_setOnTouchListener_03
触摸事件onTouch_setOnTouchListener_04

触摸事件onTouch_setOnTouchListener_05
在左右滑动的过程中,需要对控件进行位置更改的,每一次更改位置,都需要保证将要移动到的位置需要在上面的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.obtain();获取跟踪类的实例
velocityTracker = VelocityTracker.obtain();
break;
case MotionEvent.ACTION_MOVE:
//将当前事件添加到速度跟踪类 进行速度的跟踪
velocityTracker.addMovement(motionEvent);
/**
* 使用computeCurrentVelocity(int)初始化速率的单位,并获得当前的事件的速率
* 设置units的值为1000,意思为一秒时间内运动了多少个像素
*/
velocityTracker.computeCurrentVelocity(1000);
获取x轴方向的速度
xVelocity = (int) velocityTracker.getXVelocity();
//获取x轴方向的速度
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