Activity侧滑退出

原创 2016年08月30日 16:20:02

  最近看到几个APP上都有侧滑退出activity的功能,自己就尝试也写了一个。下面先看下代码。
  

public class ScrollHelper {

    private ValueAnimator valueAnimator;
    private ViewGroup rootView;
    private ViewGroup content;
    private ViewGroup contentParent;
    private int screenWidth;
    private float downX;
    private float downY;
    private Context mContext;
    private boolean isMove =  false;

    public ScrollHelper(final Activity mActivity){
        //这个是关键,将activity的背景设置为透明,滑动的时候才能露出下层界面。
        mActivity.setTheme(android.R.style.Theme_Translucent_NoTitleBar);
        mContext = mActivity;
        rootView = (ViewGroup) mActivity.findViewById(android.R.id.content);
        screenWidth = mActivity.getResources().getDisplayMetrics().widthPixels;
        //利用属性动画来使activity划出屏幕或者恢复原状。
        valueAnimator = new ValueAnimator();
        valueAnimator.setDuration(300);
        valueAnimator.setInterpolator(new LinearInterpolator());
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                int tempOffsetX = (int) animation.getAnimatedValue();
                content.setTranslationX(tempOffsetX);

                if(tempOffsetX>=screenWidth){
                    mActivity.finish();
                }
            }
        });
    }

    //这个方法要在activity中的dispatchTouchEvent中调用
    public boolean dispatchTouchEvent(MotionEvent ev) {

        if(rootView!=null){
            content = (ViewGroup) rootView.getChildAt(0);
        }

        switch (ev.getAction()){
            case MotionEvent.ACTION_DOWN:

                downX = ev.getX();
                downY = ev.getY();

                break;
            case MotionEvent.ACTION_MOVE:
                float nowX = ev.getX();
                float nowY = ev.getY();
                float diffX = Math.abs(nowX-downX);
                float diffY = Math.abs(nowY-downY);
                if((diffX>diffY)&&(downX<dp2px(50))){
                    content.setTranslationX(ev.getX());
                    isMove = true;
                }

                break;
            case MotionEvent.ACTION_UP:
                //设置当滑动超过屏幕宽度的1/3时,将view划出屏幕。
                if(ev.getX()>screenWidth/3){
                    valueAnimator.setIntValues((int)ev.getX(),screenWidth);
                }else{
                    //不到1/3则恢复原状。
                    valueAnimator.setIntValues((int)ev.getX(),0);
                }
                if(isMove){
                    valueAnimator.start();
                    isMove = false;
                }
                break;
        }
        return true;
    }

    public int dp2px(float dpVal){
        return (int)(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpVal,
               mContext.getResources().getDisplayMetrics()));
    }
}

  大致说下思路。这个类是一个侧滑退出的助手类,在构造方法中传入需要用侧滑退出功能的activity对象。接着将该activity的theme设置为Theme_Translucent_NoTitleBar,这部是将activity的背景设置为透明,以便滑动的时候能看到下层的界面。然后创建一个属性动画,目的是为了处理界面在UP事件后是复原还是退出,具体逻辑在添加的动画数值监听器中处理,annimateValue达到或者大于屏幕宽度时,退出Activty.
  接下来说下dispatchTouchEvent这个方法。这个方法要在activity的dispatchTouchEvent方法中执行,并将事件作为参数传递进来。在方法开始先通过之前的rootView拿到第一个子view,接下来的移动操作都是针对这个view来进行。在ACTION_DOWN事件中,记录下按下去的xy坐标。在ACTION_MOVE事件中,再用两个变量来记录当前的xy坐标。然后通过X方向和Y方向的坐标差的绝对值来判断左右滑动还是上下滑动,还有就是down事件中的坐标x必须在左边缘的某个数值范围内(这里我设定的是50),才判断是view可滑动,然后将isMove标志位设置为true,调用view的setTranslationX方法来进行移动。最后在UP事件中做判断,如果此时的X坐标大于屏幕的宽的某个比例(此处我设定的是1/3),就将动画的终点值设置为屏幕的宽(划出屏幕),否则设置为0(恢复原状).接下来要注意的是一定要在isMove这个标记位为true在执行动画的start操作,否则单纯的点击事件也会触发动画效果。
  以上就是这个侧滑的退出的代码以及大致思路。但这个没有应用的实际场景之中,可能会存在一定的问题,目前有可能存在的问题就是事件的冲突问题,等到以后实际用到的时候再加以完善。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

侧滑退出activity

  • 2016年07月08日 14:53
  • 6.19MB
  • 下载

[android]手把手通过一个类实现侧滑退出activity功能

1、概述 *本文代码 非原创 来自于 一个 叫做NBAPlus的开源代码中.https://github.com/SilenceDut/NBAPlus 有兴趣的小伙伴们可以好好去了解下,推荐下,真™可...

侧滑删除activity

  • 2015年12月22日 09:56
  • 1.48MB
  • 下载

随手一写就是一个侧滑关闭activity

刚忙完一段时间,今天刚清闲会,就把以前写的东西整理整理。于是冥冥中发现有些东西完全可以共享出来,毕竟那么常见,而且简单实用。实现原因其实侧滑关闭activity在网上也有大量的文章去介绍他,我也有去看...

一个简单的侧滑关闭Activity的示例

需求描述: 手指侧滑Activity,关闭之,等同于按下返回键。 实现原理: 在Activity的父类中重写setContentView方法,在其中统一添加一个父布局。来实现滑动的处理。 /** ...

实现Activity侧滑返回效果

实现Activity侧滑返回效果,通过ViewDragHelper来检测到屏幕侧滑,然后通过内置接口传递给Acitivity触发了侧滑事件,通知其关闭。实现Activity侧滑返回效果...

activity实现弹出菜单,仿网易云音乐侧滑菜单

activity设置成dialog 浮动窗口,样式,可以完成dialog无法实现的功能,例如:它能悬浮在手机桌面,且不受Activity界面的影响,说明该悬浮窗口是不隶属于Activity界面的,也就...

简单实现侧滑返回上层activity,无效果

向右滑动返回,对于屏幕过大的手机来说,在单手操作时,是一个不错的用户体验,用户不必再费力的或者用另一个手去点击屏幕左上角的返回按钮或者,手机右下角的返回按钮,轻轻向右滑动屏幕即可返回上一页,这个功能如...

android:activity最简单的侧滑效果

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8714621 人人客户端有一个特效还是挺吸引人的,在主界面手指向右滑动,就可以...

Activity随着手指移动侧滑返回

相对与ios来说,Android有着特有的物理按键,但是ios的系统原生的侧滑返回用户体检很好,所以就在此封装了一个activity,继承次activity就可以实现侧滑返回功能。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Activity侧滑退出
举报原因:
原因补充:

(最多只允许输入30个字)