Android 侧滑关闭Activity的实例
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 的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!