随手一写就是一个侧滑关闭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就可以了。那么我们最后来看下效果图:
随手一写就是一个侧滑关闭activity的更多相关文章
- 分分钟教你集成沉浸式侧滑关闭Activity
网上搜索侧滑关闭Activity,几乎没有系统状态栏跟随页面一起联动的,有明显的撕裂感,而这里则是状态栏跟随页面联动的,说来集成也是简单,等会你就知道了. 个人习惯,写博客前喜欢先截图 1.首先以项目 ...
- 侧滑关闭Activity的解决方案——SwipeBackLayout
项目地址:ikew0ng/SwipeBackLayout: An Android library that help you to build app with swipe back gesture. ...
- 【android】侧滑关闭activity
最近在使用IOS系统的时候,发现侧滑关闭很实用,因为单手就可以操作,不需要点击左上角的回退按钮.或者返回键了. 所以打算在android上实现这个技术. 需求: 1:IOS只能在屏幕边缘开始,往中间进 ...
- 【java基础】随手写的一个日期计算,新手可以看看
随手写的一个例子, 只是练习下自己的代码布局以及思路.. 1. 先写下简单的测试 2. 根据常用的不用修改的变量抽取出来, 作为常量(常量的命名可能有点不规范,谅解~) 3. 方法的作用不一样, 抽取 ...
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
sql server 关于表中只增标识问题 由于我们系统时间用的过长,数据量大,设计是采用自增ID 我们插入数据的时候把ID也写进去,我们可以采用 关闭和开启自增标识 没有关闭的时候 ,提示一下错 ...
- Activity详解一 配置、启动和关闭activity
先看效果图: Android为我们提供了四种应组件,分别为Activity.Service.Broadcast receivers和Content providers,这些组建也就是我们开发一个And ...
- Activity详解一 配置、启动和关闭activity转载 https://www.cnblogs.com/androidWuYou/p/5887726.html
先看效果图: Android为我们提供了四种应组件,分别为Activity.Service.Broadcast receivers和Content providers,这些组建也就是我们开发一个And ...
- 自己写的一个SqlHelper,感觉使用起来挺方便的
自己写的一个SqlHelper,感觉使用起来挺方便的 using System; using System.Data; using System.Collections.Generic; using ...
- 用c#写的一个局域网聊天客户端 类似小飞鸽
用c#写的一个局域网聊天客户端 类似小飞鸽 摘自: http://www.cnblogs.com/yyl8781697/archive/2012/12/07/csharp-socket-udp.htm ...
随机推荐
- windows server 2012泛域名解析配置
应测试要求,要将一个泛域名(*.office.baibai.com)解析到一个内网的IP(10.1.100.240)地址上(使用域控DNS解析)...以下为我的配置过程,做的时候将图顺便接了下来: 1 ...
- 20145216史婧瑶《Java程序设计》第7周学习总结
20145216 <Java程序设计>第7周学习总结 教材学习内容总结 第十三章 时间与日期 13.1 认识时间与日期 就目前来说,即使标注为GMT(无论是文件说明,或者是API的日期时间 ...
- Centos7.5静默安装Oracle18c
环境: CentOS7.5.Oracle18c(LINUX.X64_180000_db_home.zip) 1. 安装必要的依赖包 [root@bogon ~]# yum install bc bin ...
- Examining the Rooms - 第一类斯特灵数
---恢复内容开始--- 2017-08-10 20:32:37 writer:pprp 题意如下: Recently in Teddy's hometown there is a competiti ...
- Restful Api CRUD 标准示例 (Swagger2+validator)
为什么要写这篇贴? 要写一个最简单的CRUD 符合 Restful Api 规范的 一个Controller, 想百度搜索一下 直接复制拷贝 简单修改一下 方法内代码. 然而, 搜索结果让我无 ...
- u-boot-2015.07 make xxx_config 分析
1.u-boot编译脚本:mk.sh #! /bin/sh export PATH=$PATH:/opt/ti-sdk-am335x-evm-08.00.00.00/linux-devkit/sysr ...
- PHP 操控微信公众号
<?php class AutoAction extends CommonAction { public function index() { $timestamp = $_GET['times ...
- ArrayBuffer
ArrayBuffer对象.TypedArray视图和DataView视图是 JavaScript 操作二进制数据的一个接口.这些对象早就存在,属于独立的规格(2011 年 2 月发布),ES6 将它 ...
- 关于IIS权限问题(Selenium WebDriver调用出错记录)
本地VS调试过程中用Selenium WebDriver打开FF浏览器可以正常工作,项目部署至IIS后请求调用浏览器一直提示超时,异常如下: 因为本地调试可以成功,首先排除组件版本问题和浏览器兼容问题 ...
- nRF5 SDK软件架构及softdevice工作原理
本文将介绍Nordic nRF5 SDK软件架构以及softdevice工作原理,以加深大家对Nordic产品开发的理解,这样开发过程中碰到问题时,大家也知道如何去调试. 如果你刚开始接触nRF5 S ...