前言:

用最简单的例子来说明此问题。

1.在Activity中加上默认的布局Layout

2.在自定义的Layout中实现右滑关闭Activity的逻辑

 直接上代码!

自定义的布局HFFinishRelativeLayout!

package com.huofar.widget;import android.content.Context;import android.content.res.TypedArray;import android.support.v4.app.FragmentActivity;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.ViewGroup;import android.widget.RelativeLayout;import com.huofar.util.LogUtil;/** * Created by zhangxiwei on 14/11/25. */public class HFFinishRelativeLayout extends RelativeLayout{    private static final String TAG = LogUtil.makeLogTag(HFFinishRelativeLayout.class);    public interface ScrollLeftFinishListener{        public void finishPage();    }    FragmentActivity activity;    private ScrollLeftFinishListener scrollLeftFinishListener;    public void setScrollLeftFinishListener(ScrollLeftFinishListener scrollLeftFinishListener) {        this.scrollLeftFinishListener = scrollLeftFinishListener;    }    // 滑动距离及坐标    private float xDistance, yDistance, xLast, yLast;    public HFFinishRelativeLayout(Context context) {        super(context);    }    public HFFinishRelativeLayout(Context context, AttributeSet attrs) {        super(context, attrs);    }    public void attachToActivity(FragmentActivity activity) {        this.activity = activity;        TypedArray a = activity.getTheme().obtainStyledAttributes(                new int[] { android.R.attr.windowBackground });        int background = a.getResourceId(0, 0);        a.recycle();        ViewGroup decor = (ViewGroup) activity.getWindow().getDecorView();        ViewGroup decorChild = (ViewGroup) decor.getChildAt(0);        decorChild.setBackgroundResource(background);        decor.removeView(decorChild);        addView(decorChild);        decor.addView(this);    }    @Override    public boolean onInterceptTouchEvent(MotionEvent event) {        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:                break;            case MotionEvent.ACTION_MOVE:        }        return super.onInterceptTouchEvent(event);    }
    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:                xDistance = yDistance = 0f;                xLast = event.getX();                yLast = event.getY();                break;            case MotionEvent.ACTION_MOVE:                final float curX = event.getX();                final float curY = event.getY();                xDistance += Math.abs(curX - xLast);                yDistance += Math.abs(curY - yLast);                if (curX > xLast && xDistance > yDistance && xDistance > 300) {                    if(scrollLeftFinishListener != null){                        xLast = curX;                        yLast = curY;                        scrollLeftFinishListener.finishPage();                        return true;                    }                }                xLast = curX;                yLast = curY;        }        return super.dispatchTouchEvent(event);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:                break;            case MotionEvent.ACTION_MOVE:                break;        }        return true;    }}
重点观看上面的红色加粗字段。

我处理的是每次滑动向右滑动300px执行关闭操作,在需要的使用的Activity实现借口直接finish就OK了!

Activity中的调用:

package com.huofar.activity;import android.os.Bundle;import android.os.Handler;import android.support.v4.app.FragmentActivity;import android.view.LayoutInflater;import com.huofar.R;import com.huofar.widget.HFFinishRelativeLayout;/** * Created by zhangxiwei on 14/11/25. */public class HFBaseActivity extends FragmentActivity implements HFFinishRelativeLayout.ScrollLeftFinishListener  {    private boolean isFinishScrollLeft;    HFFinishRelativeLayout hfFinishRelativeLayout;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        isFinishScrollLeft = true;        //延后为了等待需要屏蔽返回滑动接受参数        new Handler().postAtTime(new Runnable() {            @Override            public void run() {                setFinishScrollLeft(isFinishScrollLeft);            }        },1000);    }    public void setFinishScrollLeft(boolean isFinishScrollLeft) {        this.isFinishScrollLeft = isFinishScrollLeft;        if(isFinishScrollLeft){            if(isFinishScrollLeft) {                hfFinishRelativeLayout = (HFFinishRelativeLayout) LayoutInflater.from(this).inflate(                        R.layout.activity_finish_base, null);                hfFinishRelativeLayout.attachToActivity(this);                hfFinishRelativeLayout.setScrollLeftFinishListener(this);            }        }    }    @Override    public void finishPage() {        finish();    }}

所有的代码就是这点,延迟一秒的就是为了接受isFinishScrollLeft变量,我是在已有的工程中修改的,就是为了在有些页面不需要关闭传此变量就OK了!。方法有点笨。大家有好方法可以提供。先多谢!


接下来就是头疼的问题,为什么要这么做:

恶补知识:1.dispatchTouchEvent 2.onInterceptTouchEvent 3.onTouchEvent 传递事件  直接给你们来个学习地址

http://www.cnblogs.com/sunzn/archive/2013/05/10/3064129.html

除此之外看的迷迷糊糊的可以自己写一个demo实践一下 或者多google几个介绍看看,就是事件的传递,然后在dispatchTouchEvent接受一下。然后直接关闭就行。

其实也没有什么,帮助想要该功能的童鞋。

有什么问题可以跟帖询问。


补上activity_finish_base.xml

<?xml version="1.0" encoding="utf-8"?>




更多相关文章

  1. Android(安卓)Material Design :LinearLayoutCompat添加分割线div
  2. android 实现悬架控制
  3. Android(安卓)adb 模拟滑动 按键 点击事件
  4. Android重写菜单增加系统自带返回键
  5. LINUX下Android(安卓)NDK下载并配置
  6. ListView-BaseAdapter
  7. Android(安卓)四种阴影实现方式对比
  8. android可重复利用的自定义提示确认框
  9. 初学Android,使用ContentResolver获取自己实现的ContentProvider

随机推荐

  1. android 动态设置background颜色
  2. 隐藏Android底部的虚拟按键
  3. android按键定义
  4. Android(安卓)TextToSpeech语音播放文本
  5. Android通过JNI操作串口《一》
  6. android的service中在后台弹出提示框
  7. android build (可参考之建立android编译
  8. Android(安卓)NavigationView 侧滑菜单
  9. 更新android studio gradle 不成功解决方
  10. android 获取短信验证码倒计时