Android 仿IOS边缘滑动事件监听
Posted Wastrel_xyz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 仿IOS边缘滑动事件监听相关的知识,希望对你有一定的参考价值。
直接上代码,原理是利用Activity的dispatchTouchEvent进行全局触摸事件拦截,并且通过标志位拦截事件,避免在触发边缘侧滑时引起其他滑动控件的滑动。
//从dispatch拦截事件
@Override
public boolean dispatchTouchEvent(MotionEvent ev)
return gestureHandler.doEventFling(ev) || super.dispatchTouchEvent(ev);
class GestureHandler
//屏幕宽高
int sWidth = DisplayUtil.getInstance().getWidth();
int sHeight = DisplayUtil.getInstance().getHeight();
//按下的点
PointF down;
//Y轴滑动的区间
float minY, maxY;
//按下时的时间
long downTime;
//边缘判定距离,
double margin = sWidth * 0.035;
//Y轴最大区间范围,即Y轴滑动超出这个范围不触发事件
double height = sHeight * 0.2;
//X轴最短滑动距离 X轴滑动范围低于此值不触发事件
double width = sWidth * 0.5;
//是否处于此次滑动事件
boolean work = false;
public boolean doEventFling(MotionEvent event)
switch (event.getActionMasked())
case MotionEvent.ACTION_DOWN:
//记录下按下的点
downTime = System.currentTimeMillis();
down = new PointF(event.getX(), event.getY());
minY = maxY = down.y;
//判定是否处于边缘侧滑
if (down.x < margin || (sWidth - down.x) < margin) work = true;
break;
case MotionEvent.ACTION_MOVE:
//记录滑动Y轴区间
if (work)
if (event.getY() > down.y)
maxY = event.getY();
else
minY = event.getY();
break;
case MotionEvent.ACTION_UP:
if (work)
handle(new PointF(event.getX(), event.getY()));
work = false;
return true;
work = false;
//如果当前处于边缘滑动判定过程中,则消费掉此事件不往下传递。
return work;
public boolean handle(PointF up)
long upTime = System.currentTimeMillis();
float tWidth = Math.abs(down.x - up.x);
if (maxY - minY < height && tWidth > width && (upTime - downTime) / tWidth < 2.5)
//起点在左边
if (down.x < margin)
left();
return true;
//起点在右边
if ((sWidth - down.x) < margin)
right();
return true;
return false;
public void left()
//处理左边缘滑动事件
public void right()
以上是关于Android 仿IOS边缘滑动事件监听的主要内容,如果未能解决你的问题,请参考以下文章
Android之自己定义(上方标题随ViewPager手势慢慢滑动)