国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > 综合技术 > Android 向右滑动关闭页面

Android 向右滑动关闭页面

来源:程序员人生   发布时间:2014-12-09 08:13:08 阅读次数:3641次

前言:

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

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下。然后直接关闭就行。

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

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


生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生