文档章节

Android 右滑退出当前Activity

江湖三弟
 江湖三弟
发布于 2016/08/01 17:58
字数 824
阅读 73
收藏 2

SwipeBack

利用滑动手势退出当前Activity

License maven--central

Features

  • 不需要设置透明theme或windowIsTranslucent = true
  • 不影响activity的生命周期
  • 只需继承SwipeBackActivity
  • 支持Dialog的滑动返回

Getting started

Firstly,add the following lines to your app/build.gradle.

dependencies {  
    compile 'com.aitangba:swipeback:1.0.1'
}

Secondly, add the following lines to your application.

public class CustomApplication extends Application{

    @Override
    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(ActivityLifecycleHelper.build());
    }

}

Finally, set the activity which need to swipe extends the SwipeBackActivity.

public class BaseActivity extends SwipeBackActivity {

}

Usage

API

Application在Api14之后添加了新的Callback方法

    public void registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {

    }

这样就可以根据activity的生命周期缓存所有Activity,通过list获取上一个activity的实例,从而获取id为content的ContentView的子View(即setContentView中的View),并进行滑动展示。

默认SwipeBackActivity是支持滑动返回的,不需要滑动返回时则需要复写SwipeBackActivity的方法supportSlideBack,其中方法canBeSlideBack意思是能否返回至本Activity;两个方法相互配合使用,以应对各种需求。

 
   public class SwipeBackActivity extends AppCompatActivity implements SwipeBackHelper.SlideBackManager {

    private static final String TAG = "SwipeBackActivity";

    private SwipeBackHelper mSwipeBackHelper;

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if(mSwipeBackHelper == null) {
            mSwipeBackHelper = new SwipeBackHelper(this);
        }
        return mSwipeBackHelper.processTouchEvent(ev) || super.dispatchTouchEvent(ev);
    }

    @Override
    public Activity getSlideActivity() {
        return this;
    }

    @Override
    public boolean supportSlideBack() {
        return true;
    }

    @Override
    public boolean canBeSlideBack() {
        return true;
    }

    @Override
    public void finish() {
        if(mSwipeBackHelper != null) {
            mSwipeBackHelper.finishSwipeImmediately();
            mSwipeBackHelper = null;
        }
        super.finish();
    }
}

6种事件状态


    private static final int MSG_ACTION_DOWN = 1; //点击事件  
    private static final int MSG_ACTION_MOVE = 2; //滑动事件
    private static final int MSG_ACTION_UP = 3;  //点击结束
    private static final int MSG_SLIDE_CANCEL = 4; //开始滑动,不返回前一个页面
    private static final int MSG_SLIDE_CANCELED = 5;  //结束滑动,不返回前一个页面
    private static final int MSG_SLIDE_PROCEED = 6; //开始滑动,返回前一个页面
    private static final int MSG_SLIDE_FINISHED = 7;//结束滑动,返回前一个页面
  1. 在Down手势发生时,只要将上一个Activity的ContentView从parentView中剥离,并加入到当前View的ContentView中;
  2. 在滑动手势发生时,加上阴影View,并进行滑动;同时滑动的有当前Activity的ContentView、上一个Activity的ContentView和自定义的阴影View;
  3. 在Up手势发生时,判断滑动是否超过半屏,触发返回操作,并展示滑动动画;
  4. 滑动取消或滑动返回发生时,需要将上个Activity的ContentView从新加入到上一个Acitivity的布局中。

Tips:
在设计过程中遇到也有过其他思路:
1)设置Activity的透明theme,可是发现只要activity的层级变多就会变得非常卡顿;
2)动态设置Activity的theme,这需要通过反射,而且还需要判断api,部分手机还不兼容;
3)在滑动展示上个Activity的View时,直接将上个Activity的contentView截图保存在内存卡上,然后显示在当前Activity的view上,但是有明显的卡顿感;
以上都是在设计过程中想到的方案,也逐个实践了一下,发现问题还是比较多的,想想还不如另辟蹊径,就有了现在的方案,目前看来还是能兼容大部分手机的。

ScreenShot

image

Update

  • 1.0.1
    添加接口SlideBackManager;
    修正手势判断,仅在可滑动区域进行滑动手势判断,不干扰点击或长按事件;
    修复由于其他多线程在滑动页面进行中时,调用finish方法导致异常发生的问题

gitHub地址:https://github.com/XBeats/and_swipeback

© 著作权归作者所有

共有 人打赏支持
江湖三弟
粉丝 31
博文 65
码字总数 30485
作品 0
苏州
高级程序员
私信 提问
dispatchDraw不执行

版权声明:有些文章写的很随意,那是仅作为个人记录的文章,建议直接关掉,多看一秒亏一秒 https://blog.csdn.net/qq_36523667/article/details/82461350 在开发Android下的右滑退出Activit...

徐风来
09/06
0
0
请问知乎的android客户端的这个动画是怎么实现的?

就是右滑能显示上一个activity,滑动大于一定距离时finish掉当前activity

oldfeel
2014/02/08
608
3
Android 滑动效果入门篇(一)—— ViewFlipper

ViewFilpper 是Android官方提供的一个View容器类,继承于ViewAnimator类,用于实现页面切换,也可以设定时间间隔,让它自动播放。 又ViewAnimator继承至于FrameLayout的,所以ViewFilpper的L...

长平狐
2013/01/06
383
0
ZBLibrary 19.0 发布,Star 数已达 3K

更新内容: 新增一键自动删除所有编译缓存 build 目录的 Window 批处理脚本 clearAllBuildCache.bat; getActivity 抽象到 BaseActivity; 解决条形码与预览框的水平倾角超过30%识别不了,感...

孤独的探索号
11/28
1K
0
关于设置 android:parentActivityName 后过渡动画的问题

首先,先简单介绍一下 android:parentActivityName 。 安卓开发文档中如此解释:Activity 逻辑父项的类名称。此处的名称必须与为相应 元素的 android:name 属性指定的类名称一致。系统会读取...

equationl
12/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

EOS docker开发环境

使用eos docker镜像是部署本地EOS开发环境的最轻松愉快的方法。使用官方提供的eos docker镜像,你可以快速建立一个eos开发环境,可以迅速启动开发节点和钱包服务器、创建账户、编写智能合约....

汇智网教程
今天
3
0
《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
今天
6
0
IC-CAD Methodology知识图谱

CAD (Computer Aided Design),计算机辅助设计,指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义同样可以用来近似描述IC公司CAD工程师这个岗位的工作。 早期IC公司的CAD岗位最初...

李艳青1987
今天
6
0
CompletableFuture get方法一直阻塞或抛出TimeoutException

问题描述 最近刚刚上线的服务突然抛出大量的TimeoutException,查询后发现是使用了CompletableFuture,并且在执行future.get(5, TimeUnit.SECONDS);时抛出了TimeoutException异常,导致接口响...

xiaolyuh
今天
5
0
dubbo 搭建与使用

官网:http://dubbo.apache.org/en-us/ 一,安装监控中心(可以不安装) admin管理控制台,monitor监控中心 下载 bubbo ops 这个是新版的,需要node.js环境,我没有就用老版的了...

小兵胖胖
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部