Android 右滑实现退出Activity,完美解决与viewPage的冲突。

最近的项目中需要添加右滑退出这个功能,在这里我是直接自定义一个view来实现。话不多说直接上代码。

package com.cad.view;

import android.content.Context;

import android.support.v4.view.ViewPager;

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.view.View;

import android.view.ViewConfiguration;

import android.view.ViewGroup;

import android.widget.FrameLayout;

import java.util.ArrayList;

import java.util.List;

public class SlidingFinishFrameForLToRLayout extends FrameLayout {

    private ViewGroup mParentView;

    private int mWidth;

    private int mHeight;

    private int mDownX, mDownY, mMoveX, mMoveY;

    private ViewPager mTouchView;

    private List mList_PassView= new ArrayList<>();

    private boolean DEBUG= false;

    private OnSlidingFinish onSlidingFinish;

    private int mTouchSlopValue; //滑动到超过此距离则表示有效操作

    public SlidingFinishFrameForLToRLayout(Context context) {

        this(context, null);

    }

    public SlidingFinishFrameForLToRLayout(Context context, AttributeSet attrs) {

        this(context, attrs, 0);

    }

    public SlidingFinishFrameForLToRLayout(Context context, AttributeSet attrs,

                                          int defStyle) {

        super(context, attrs, defStyle);

        mTouchSlopValue= ViewConfiguration.get(context).getScaledTouchSlop();

    }

    @Override

    protected void onLayout(boolean changed, int l, int t, int r, int b) {

        super.onLayout(changed, l, t, r, b);

        if (changed) {

            mParentView= (ViewGroup) this.getParent();

            this.mWidth= this.getWidth();

            this.mHeight= this.getHeight();

        }

}

    public void setOnSlidingFinish(OnSlidingFinish onSlidingFinish) {

        this.onSlidingFinish= onSlidingFinish;

    }

    @Override

    public boolean onInterceptTouchEvent(MotionEvent ev) {

        switch (ev.getAction()) {

            case MotionEvent.ACTION_DOWN:

                mDownX= (int) ev.getRawX();

                mDownY= (int) ev.getRawY();

                if (DEBUG)

                    System.out.println("tag-n debug 6-23 onInterceptTouchEvent  checkIsTouchPassView() " + checkIsTouchPassView());

                if (checkIsTouchPassView()) return false;

break;

            case MotionEvent.ACTION_MOVE:

                mMoveX= (int) ev.getRawX();

                mMoveY= (int) ev.getRawY();

//      System.out.println("tag-n onInterceptTouchEvent  MotionEvent.ACTION_MOVE-------"+((mMoveY - mDownY) > 50 && Math.abs(mMoveX - mDownX) < 50));

                if ((mMoveX- mDownX) > 50 && Math.abs(mMoveY- mDownY) < 50) {  //left to right

//                if (-(mMoveX - mDownX) > 50 && Math.abs(mMoveY - mDownY) < 50) {  //right to left

//                if ((mMoveY - mDownY) > 50 && Math.abs(mMoveX - mDownX) < 50) {  // top to bottom

// viewpager item 2 is lyric fragment

                    if (checkIsTouch(mTouchView, mDownX, mDownY) && (mTouchView!= null && mTouchView.getCurrentItem() != 0)) {

                        return super.onInterceptTouchEvent(ev);

                    } else {

                        return true;

                    }

}

                break;

            case MotionEvent.ACTION_UP:

//      if(-(mMoveX-mDownX) > 180){

//          onSlidingFinish.onSlidingFinish();

//          return true;

//      }

                break;

default:

break;

        }

        return super.onInterceptTouchEvent(ev);

    }

    @Override

    public boolean onTouchEvent(MotionEvent event) {

        switch (event.getAction()) {

            case MotionEvent.ACTION_DOWN:

//      mDownX = (int) event.getRawX();

//      mDownY = (int)event.getRawY();

//                break;

                boolean isTouchPassView = checkIsTouchPassView();

                if (DEBUG)

                    System.out.println("tag-n debug 6-23 onTouchEvent isTouchPassView " + isTouchPassView);

                if (isTouchPassView) return false;

return true;

            case MotionEvent.ACTION_MOVE:

                mMoveX= (int) event.getRawX();

                mMoveY= (int) event.getRawY();

break;

            case MotionEvent.ACTION_UP:

//      System.out.println("tag-n debug onTouchEvent    MotionEvent.ACTION_UP-------"+((mMoveY - mDownY) > 130 && Math.abs(mMoveX - mDownX) < 130));

                if ((mMoveX- mDownX) > 130 && Math.abs(mMoveY- mDownY) < 130) {  //left to right

//      if(-(mMoveX-mDownX) > 130 && Math.abs(mMoveY - mDownY) <130){  //right to left

//                if ((mMoveY - mDownY) > 130 && Math.abs(mMoveX - mDownX) < 130) {  // top to bottom

                    isTouchPassView = checkIsTouchPassView();

                    if (DEBUG)

                        System.out.println("tag-n debug 6-23 onTouchEvent isTouchPassView " + isTouchPassView);

                    if (isTouchPassView) return false;

                    if(onSlidingFinish!= null) onSlidingFinish.onSlidingFinish(checkIsTouch(mTouchView, mDownX, mDownY));

break;

                }

                break;

default:

break;

        }

        return super.onTouchEvent(event);

    }

    /*public boolean checkIsTouch(View touchView, int downX, int downY) {

if (touchView == null) return false;

Rect vRect = new Rect();

touchView.getHitRect(vRect);

boolean isTouch = vRect.contains(downX, downY);

if (DEBUG) {

System.out.println("tag-n debug Sliding    downX  ---  " + downX);

System.out.println("tag-n debug Sliding    downY  ---  " + downY);

System.out.println("tag-n debug Sliding    vRect.top  ---  " + vRect.top);

System.out.println("tag-n debug Sliding    vRect.bottom    ---  " + vRect.bottom);

System.out.println("tag-n debug Sliding    vRect.left    ---  " + vRect.left);

System.out.println("tag-n debug Sliding    vRect.right    ---  " + vRect.right);

System.out.println("tag-n debug Sliding    isTouch    --  " + isTouch);

}

return isTouch;

}*/

    private boolean checkIsTouch(View touchView, int downX, int downY) {

        if (touchView == null) {

            return false;

        }

        int[] location = new int[2];

        touchView.getLocationOnScreen(location);

        int left = location[0];

        int top = location[1];

        int right = left + touchView.getMeasuredWidth();

        int bottom = top + touchView.getMeasuredHeight();

        boolean isTouch = downY >= top && downY <= bottom && downX >= left

                && downX <= right;

        if (DEBUG) {

            System.out.println("tag-n debug Sliding    downX        ---  " + downX);

            System.out.println("tag-n debug Sliding    downY        ---  " + downY);

            System.out.println("tag-n debug Sliding    vRect.top    ---  " + top);

            System.out.println("tag-n debug Sliding    vRect.bottom ---  " + bottom);

            System.out.println("tag-n debug Sliding    vRect.left  ---  " + left);

            System.out.println("tag-n debug Sliding    vRect.right  ---  " + right);

            System.out.println("tag-n debug Sliding    isTouch      ---  " + isTouch);

        }

        return isTouch;

    }

    private boolean checkIsTouchPassView() {

        for (int i = 0; i < mList_PassView.size(); i++) {

            if (checkIsTouch(mList_PassView.get(i), mDownX, mDownY)) {

                return true;

            }

}

        return false;

    }

    public void setViewPager(ViewPager viewpager) {

        if (viewpager != null) {

            mTouchView= viewpager;

//      Rect VRect = new Rect();

//      viewpager.getHitRect(VRect);

        }

}

    public void setPassView(View passView) {

        if (passView != null) {

            mList_PassView.add(passView);

        }

}

    public void removePassView(View passView) {

        if (passView != null) {

            mList_PassView.remove(passView);

        }

}

    public interface OnSlidingFinish {

        void onSlidingFinish(boolean isInViewPager);

    }

}

在XML中 使用 如图所示:


然后就是在activity 里面调用:

mSlidingFinishFrameForLToRLayout.setOnSlidingFinish(new SlidingFinishFrameForLToRLayout.OnSlidingFinish() {

    @Override

    public void onSlidingFinish(boolean isInViewPager) {

        finish();

    }

});

如果有跟viewpage 有冲突,则在setOnSlidingFinish 之前调用下面的方法

mSlidingFinishFrameForLToRLayout.setViewPager(getViewpage()); 

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 2,695评论 0 3
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一...
    阿里高级软件架构师阅读 3,286评论 0 19
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,621评论 18 399
  • 每次回家规划和现实都是一次碰撞,这一次也不例外。找准目标和方向,注意方式方法 必是成功的保障。
    古风细雨阅读 202评论 0 0
  • 【原题呈现】 孩于们那大人真正的不同就在于,世界对于孩子们来说是灵感的源泉;世界对孩子们来说是有趣的,对大...
    彭丹0910阅读 2,478评论 1 3