目前Android手机的全面屏越来越盛行,很多应用都已经支持了右滑返回上一级页面的功能,那么这个功能如何实现呢?
首先来说下思路吧,主要是通过 MotionEvent 这个事件通过对这个事件的不同处理,在通过 PointF 来监听按下去的点,处于什么位置。
接下来,通过代码给大家讲解一下
显示新建一个Gesture的这个样一个类,用来处理,滑动的逻辑。
代码语言:javascript复制public class GestureHandler {}
接下来是定义相关的一些屏幕宽高、滑动的区间的一些表示
代码语言:javascript复制//屏幕宽高
int sWidth = 1280;
int sHeight = 720;
//按下的点
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.1;
//是否处于此次滑动事件
boolean work = false;
当然了,这里我的屏幕是这样子,屏幕的宽高是按照自己的实际情况的。
然后是用 PointF 来监听
代码语言:javascript复制public boolean point(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;
}
}
return false;
}
在定义好之后就可以使用MontionEvent,来进行一个处理了
代码语言:javascript复制public boolean doEventF(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;
}
那这里是左滑退出当前activity
代码语言:javascript复制public void left() {
//处理左边缘滑动事件,这里你可以自己写一个ActivityUtil,用来finish当前的activity(这个网上很多,随便搜一下就有了)
}
这里处理好之后,就要思考一下了,如何能达到全局的右滑返回了,那么你就需要让所有的activity继承一个BaseActivity,然后再这个基类里面来处理是否需要右滑返回。
代码语言:javascript复制/** 手势监听 */
GestureHandler mGestureHandler;
/** 是否需要监听手势关闭功能 */
private boolean mNeedBackGesture = false;
然后通过一个dispatchTouchEvent 来进行一个手势分发
代码语言:javascript复制@Override
public boolean dispatchTouchEvent(MotionEvent event){
//TODO Auto-generated method stub
if (mNeedBackGesture){
return mGestureHandler.doEventF(event) || super.dispatchTouchEvent(event);
}
return super.dispatchTouchEvent(event);
}
设置一个手势监听,便于一些特殊的activity设置不可滑动退出,比如首页
代码语言:javascript复制public final void setNeedBackGesture(boolean mNeedBackGesture){
this.mNeedBackGesture = mNeedBackGesture;
}
那么你在使用的时候只需要再onCreate方法里面 new 一个Gesture对象就好了
如果你想在首页做不返回,同样在onCreate方法里面设置setNeedBackGesrure(false)就还可以了
这样你就实现了一个全局的右滑返回了。
以上就是本文的全部内容,希望对大家的学习有所帮助。