ViewDragHelper实战应用之 高仿微信双向侧滑退出Activity

    

      在之前详细介绍了ViewDragHelper的基础应用后,本来想马上为大家写几篇这个强大的ViewDragHelper功能如何应用到实战中,不过最近有点忙啊。笔者在努力充电,希望在这一年基础稳固把握好,能够提高自己的能力,达到另一个程度!

     我相信,也很多读者此时此刻也在努力提高自我努力敲代码中。是!一起成长!!
     好了,现在直接进入这篇文章的重点。前些天无意中看到其他开发人员通过ViewDragHelper实现侧滑退出的效果,笔者也无意中跟ios开发的同事聊天的时候,发现ios自带的侧滑效果很赞啊,重点能够双向侧滑!即上一层界面右滑的时候,下一层也会缓慢滑动,体验感非常不错!后来发现我们强大的微信也有这种功能模仿。于是,我先是去百度看看别人实现方式。。。
     发现。。居然没有这个侧滑的模仿,有的顶多只是简单的右滑退出,并不是我想要的效果。因此,静下心,不如自己来写写试试看吧!很幸运,几天努力没有白费,认识第一个自己思考的特殊View终于出现哈哈!

希望分享给一起奋斗的你们!!!

大致效果图如下:


现在直接进入代码解释,这里需要注意几个问题:
(1)activity之间的逆向实时通信
因为上一层的实时滑动状态,是必须要通过回调告诉下一层activity状态才能够做好实时变化的。因此逆向通信很重要,这里笔者采用栈的形式管理Actiivty,通信的时候直接从栈中取出后通过接口回调的方式实现。

(2)ViewDragHelper与Activity通信
同样,在滑动变化的时候Activity需要监听滑动状态,这里笔者依然使用接口回调方式实现。

(3)注意ViewDragHelper配置问题
这个问题详细可以看上一篇博客,ViewDragHelper详细介绍。

一、Activity栈管理 ActivityStackManager.java
   
   
   
package cn.wsy.wechatslide.utils;
 
import android.app.Activity;
 
import java.util.Stack;
 
/**
* Activity 堆栈管理
* Created by wsy on 2016/3/4.
*/
public class ActivityStackManager {
 
private static Stack activityStack;
private static ActivityStackManager activityStackManager;
 
//单例模式创建
public static ActivityStackManager getInstance() {
if (activityStackManager == null) {
synchronized (ActivityStackManager.class) {
if (activityStackManager == null) {
activityStackManager = new ActivityStackManager();
}
}
}
return activityStackManager;
}
 
private Stack checkActivityStack() {
if (activityStack == null) {
activityStack = new Stack();
return activityStack;
}
return activityStack;
}
 
//进栈
public void addStack(Activity activity) {
if (activity != null) {
checkActivityStack().add(activity);
}
}
 
//出栈
public void removeStack(Activity activity) {
if (activity != null) {
if (checkActivityStack().contains(activity)) {
activityStack.remove(activity);
activity.finish();
activity = null;
}
}
}
 
//获取当前栈顶
public Activity getStackTop() {
return (Activity) checkActivityStack().lastElement();
}
 
public int getStackSize(){
return checkActivityStack().size();
}
 
//获取当前栈顶下面那个Activity
public Activity getNextStack() {
Activity activity = null;
if (activityStack.size() >1){
activity = (Activity) checkActivityStack().get(activityStack.size() - 2);
}
return activity;
}
}
这里我们可以通过getNextStack,里面获取下面一个activity对象实例。

二、滑动退出View SlideQuitView.java
   
   
   
package cn.wsy.wechatslide.views;
 
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.support.v4.view.ViewCompat;
import android.support.v4.widget.ViewDragHelper;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
 
import cn.wsy.wechatslide.R;
import cn.wsy.wechatslide.interfaces.SlideMoveInterface;
 
/**
* 滑动退出-仿IOS双向滑动
* Created by wsy on 2016/3/4.
*/
public class SlideQuitView extends LinearLayout {
 
/**
* slide control
*/
private ViewDragHelper mDragHelper;
 
/**
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值