昨天试着自己写这个长按,欲仙欲死.今天静下心来,好好地百度了一波,终于找到了.俺就是CV的命了.主要就是GestureDetector.安卓自己有提供''''
找到了启舰大神14年的博客
https://blog.csdn.net/harvic880925/article/details/39520901
private class gestureListener implements GestureDetector.OnGestureListener {
/**
* 用户按下屏幕就会触发
*/
@Override
public boolean onDown(MotionEvent e) {
return false;
}
/**
* 如果是按下的时间超过瞬间,而且在按下的时候没有松开或者是拖动的,
* 那么onShowPress就会执行,具体这个瞬间是多久,我也不清楚呃
* 0.5-1s
*/
@Override
public void onShowPress(MotionEvent e) {
}
/**
* 从名子也可以看出,一次单独的轻击抬起操作,也就是轻击一下屏幕,立刻抬起来,
* 才会有这个触发,当然,如果除了Down以外还有其它操作,那就不再算是Single操作了,
* 所以也就不会触发这个事件
* 触发顺序:
* 点击一下非常快的(不滑动)Touchup:
* onDown->onSingleTapUp->onSingleTapConfirmed
* 点击一下稍微慢点的(不滑动)Touchup:
* onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed
*/
@Override
public boolean onSingleTapUp(MotionEvent e) {
Toast.makeText(MainActivity.this, "不要单击", Toast.LENGTH_SHORT).show();
return false;
}
/**
* 在屏幕上拖动事件。无论是用手拖动view,或者是以抛的动作滚动,
* 都会多次触发,这个方法 在ACTION_MOVE动作发生时就会触发
* 滑屏:手指触动屏幕后,稍微滑动后立即松开
* onDown-----》onScroll----》onScroll----》onScroll----》………----->onFling
* 拖动
* onDown------》onScroll----》onScroll------》onFiling
*
* 可见,无论是滑屏,还是拖动,影响的只是中间OnScroll触发的数量多少而已,
* 最终都会触发onFling事件!
*/
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
/**
* 长按触摸屏,超过一定时长,就会触发这个事件
* 触发顺序:
* onDown->onShowPress->onLongPress
*/
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onLongPress(MotionEvent event) {
setLongPressDoing(event);
}
/**
* 滑屏,用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN,
* 多个ACTION_MOVE, 1个ACTION_UP触发
* 参数解释:
* @param e1 第1个ACTION_DOWN MotionEvent
* @param e2 最后一个ACTION_MOVE MotionEvent
* @param velocityX X轴上的移动速度,像素/秒
* @param velocityY Y轴上的移动速度,像素/秒
* @return
*/
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return false;
}
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void setLongPressDoing(MotionEvent event){
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
float x = event.getX();
float y = event.getY();
//按下点 距上距下
int v1 = (int) Math.abs(bottom - y);
float min = Math.min(v1, y);
flag = !flag;
if (flag) {
Animator animator = ViewAnimationUtils.createCircularReveal(
change,//作用在哪个View上面
(int) x,
(int) y,//扩散的中心点
min,//开始扩散初始半径
defaul.getWidth());//扩散结束半