欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现全局右滑返回

程序员文章站 2022-06-14 14:25:01
目前android手机的全面屏越来越盛行,很多应用都已经支持了右滑返回上一级页面的功能,那么这个功能如何实现呢?首先来说下思路吧,主要是通过 motionevent 这个事件通过对这个事件的不同处理,...

目前android手机的全面屏越来越盛行,很多应用都已经支持了右滑返回上一级页面的功能,那么这个功能如何实现呢?

首先来说下思路吧,主要是通过 motionevent 这个事件通过对这个事件的不同处理,在通过 pointf 来监听按下去的点,处于什么位置。

接下来,通过代码给大家讲解一下

显示新建一个gesture的这个样一个类,用来处理,滑动的逻辑。

public class gesturehandler {}

接下来是定义相关的一些屏幕宽高、滑动的区间的一些表示

//屏幕宽高
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 来监听

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,来进行一个处理了

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

public void left() {
 
  //处理左边缘滑动事件,这里你可以自己写一个activityutil,用来finish当前的activity(这个网上很多,随便搜一下就有了)
   
}

这里处理好之后,就要思考一下了,如何能达到全局的右滑返回了,那么你就需要让所有的activity继承一个baseactivity,然后再这个基类里面来处理是否需要右滑返回。

/** 手势监听 */
 gesturehandler mgesturehandler;
 /** 是否需要监听手势关闭功能 */
 private boolean mneedbackgesture = false;

然后通过一个dispatchtouchevent 来进行一个手势分发

@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设置不可滑动退出,比如首页

public final void setneedbackgesture(boolean mneedbackgesture){
  this.mneedbackgesture = mneedbackgesture;
 }

那么你在使用的时候只需要再oncreate方法里面 new 一个gesture对象就好了

如果你想在首页做不返回,同样在oncreate方法里面设置setneedbackgesrure(false)就还可以了

这样你就实现了一个全局的右滑返回了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。