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

用苹果的小伙伴们都会知道,ios系统退出当前的页面只需要向右边侧滑,这是一个非常好的用户体验,但是Android官方并没有出具有这有性质的Activity,所以我们只能辛苦辛苦,自己动手写一个具有这种...
  • java_android_js
  • java_android_js
  • 2016年03月07日 21:07
  • 1822

android手势滑动关闭当前activity

package com.bruce.testeventandscroll; import android.app.Activity; import android.os.Bundle; import...
  • bruceyangjie
  • bruceyangjie
  • 2016年03月23日 23:08
  • 1619

Android 向右滑动销毁(finish)Activity, 随着手势的滑动而滑动的效果

今天给大家带来一个向右滑动切换Activity的效果,Activtiy随着手指的移动而移动,该效果在Android应用中还是比较少见的,在IOS中就比较常见了,例如“网易新闻” ,"美食杰" , "淘...
  • xiaanming
  • xiaanming
  • 2014年03月13日 09:19
  • 75700

侧滑退出activity

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

最简单侧滑退出activity的实现

侧滑退出activity的原理其实很简单: 1.设置activity为透明主题。 2.自定义viewgroup作为activity的根布局。 3.在自定义的viewgroup中onTounEvent中...
  • cao185493676
  • cao185493676
  • 2017年12月21日 10:44
  • 32

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

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

侧滑删除activity

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

Android侧滑SliddingMenu+Activity详解

Android侧滑SliddingMenu+Activity详解     最近在写一个项目的时候需要用到侧滑效果,本想用View自己写一个,但是时间太紧就想着用开源项目。SliddingMenu...
  • u013573135
  • u013573135
  • 2015年04月25日 13:00
  • 862

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

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

侧滑(以Activity为页面)

===================================MainActivity=====================================================...
  • fangfangthinker
  • fangfangthinker
  • 2016年06月29日 14:28
  • 119
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Activity侧滑退出
举报原因:
原因补充:

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