当前位置: 移动技术网 > 移动技术>移动开发>Android > Android 侧滑关闭Activity的实例

Android 侧滑关闭Activity的实例

2019年07月24日  | 移动技术网移动技术  | 我要评论

android 侧滑关闭activity的实例

实现原因

其实侧滑关闭activity在网上也有大量的文章去介绍他,我也有去看,要么是代码实在太多看不下去,要么就是跑了项目没有反应的。唯一的方法还是自己随手鲁一个~,侧滑这个东西在android中是比较少见的,ios是最常见不过了,因为毕竟他们没有物理返回键。还有uiscrollview那些。然而我们用的最多的qq也只是有个功能,并没有真正的滑动效果。至于微信的,我记得n久以前滑出了一个bug。也没什么印象了。估计也是极小的概率事件。于是,当初我就强行的鲁了一个。下面我们一步步分析实现的思路以及代码。

百行代码解决侧滑关闭

首先来看下我们一些简单的定义:

private activity activity;
  private scroller scroller;
  //上次action_move时的x坐标
  private int last_x;
  //屏幕宽度
  private int width;
  //可滑动的最小x坐标,小于该坐标的滑动不处理
  private int min_x;
  // 页面边缘的阴影图
  private drawable left_shodow;
  //页面边缘阴影的宽度默认值
  private static final int shadow_width = 16;
  // 页面边缘阴影的宽度
  private int shadow_width;
  // activity finish标识符
  private boolean isfinish;

这边我已经注释过了,就不做过多就写了。接下来,我们看下我们的一些初始化已经外部调用方法:

 private void initview(activity activity) {
    this.activity = activity;
    scroller = new scroller(activity);
    left_shodow = getresources().getdrawable(r.drawable.left_shadow);
    int density = (int) activity.getresources().getdisplaymetrics().density;
    shadow_width = shadow_width * density;
    // 这里你一定要设置成透明背景,不然会影响你看到底层布局
    setbackgroundcolor(color.argb(0, 0, 0, 0));
  }

  public void bindactivity(activity activity) {
    viewgroup decorview = (viewgroup) activity.getwindow().getdecorview();
    view child = decorview.getchildat(0);
    decorview.removeview(child);
    addview(child);
    decorview.addview(this);

我们主要看下bindactivity这个方法。这个是我们用来绑定一个activity的。这个activity你们可以基于baseactivity实现一个backactivity。为什么要这么做,因为你每个activity都要写这么一句话,我感觉就是浪费时间,一个基类直接解决。这个activity我们可以这么写:

public abstract class swbackactivity extends activity {

  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    swbacklayout layout = new swbacklayout(this);
    layout.bindactivity(this);
  }

  protected abstract void afterinject();

  protected abstract void afterinitview();

}

那么接下来我们看下,如果对手势的处理让他侧滑关闭呢?

  public boolean ontouchevent(motionevent event) {
    switch (event.getaction()) {
      case motionevent.action_down:
        last_x = (int) event.getx();
        width = getwidth();
        min_x = width / 10;
        break;
      case motionevent.action_move:
        int rightmovedx = last_x - (int) event.getx();
        if (getscrollx() + rightmovedx >= 0) {// 左侧即将滑出屏幕
          scrollto(0, 0);
        } else if ((int) event.getx() > min_x) {// 手指处于屏幕边缘时不处理滑动
          scrollby(rightmovedx, 0);
        }
        last_x = (int) event.getx();
        break;
      case motionevent.action_up:
        if (-getscrollx() < width / 3) {
          scrollback();
          isfinish = false;
        } else {
          scrollclose();
          isfinish = true;
        }
        break;
    }
    return true;
  }

  private void scrollback() {
    int startx = getscrollx();
    int dx = -getscrollx();
    scroller.startscroll(startx, 0, dx, 0, 300);
    invalidate();
  }

  private void scrollclose() {
    int startx = getscrollx();
    int dx = -getscrollx() - width;
    scroller.startscroll(startx, 0, dx, 0, 300);
    invalidate();
  }

  public void computescroll() {
    if (scroller.computescrolloffset()) {
      scrollto(scroller.getcurrx(), 0);
      postinvalidate();
    } else if (isfinish) {
      activity.finish();
    }
    super.computescroll();
  }

  protected void dispatchdraw(canvas canvas) {
    super.dispatchdraw(canvas);
    drawshadow(canvas);
  }

  private void drawshadow(canvas canvas) {
    // 保存画布当前的状态
    canvas.save();
    // 设置drawable的大小范围
    left_shodow.setbounds(0, 0, shadow_width, getheight());
    // 让画布平移一定距离
    canvas.translate(-shadow_width, 0);
    // 绘制drawable
    left_shodow.draw(canvas);
    // 恢复画布的状态
    canvas.restore();
  }

首先我们在action_down记录按下点的x坐标

然后在action_move中判断,如果我们getscrollx() + rightmovedx是否是大于0的,如果大于0,表示activity处于滑动状态,并且是向左滑动,同时我们进行了判断,手指处于屏幕边缘时不可以滑动。

最后在action_up中判断如果手指滑动的距离大于布局宽度的1/3,表示将activity滑出界面,否则滑动到起始位置,我们利用scroller类的startscroll()方法设置好开始位置,滑动距离和时间,然后调用postinvalidate()刷新界面,之后就到computescroll()方法中,我们利用scrollto()方法对该布局的父布局进行滚动,滚动结束之后,我们判断界面是否滑出界面,如果是那就划出页面让activity finish掉。否则,布局就归位。

使用方法

其实使用方法很简单,直接继承swbackactivity就可以了。那么我们最后来看下效果图:

以上就是实现android 侧滑关闭activity 的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网