前言:
用最简单的例子来讲明此问题。
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;
}
<strong><span style="color:#ff6666;">return true;</span></strong>
}
}
重点观看上面的红色加粗字段。
我处理的是每次滑动向右滑动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();
}
}
所有的代码就是这点,延迟1秒的就是为了接受isFinishScrollLeft变量,我是在已有的工程中修改的,就是为了在有些页面不需要关闭传此变量就OK了!。方法有点笨。大家有好方法可以提供。先多谢!
接下来就是头疼的问题,为何要这么做:
恶补知识:1.dispatchTouchEvent 2.onInterceptTouchEvent 3.onTouchEvent 传递事件 直接给你们来个学习地址
http://www.cnblogs.com/sunzn/archive/2013/05/10/3064129.html
除此以外看的迷迷糊糊的可以自己写1个demo实践1下 或多google几个介绍看看,就是事件的传递,然后在dispatchTouchEvent接受1下。然后直接关闭就行。
其实也没有甚么,帮助想要该功能的童鞋。
有甚么问题可以跟帖询问。