Android右滑销毁Activity
2016-04-09 15:32
435 查看
参考http://blog.csdn.net/lmj623565791/article/details/46858663
在很多应用中,我们都能看到右滑退出当前界面的功能,网上也有一些例子讲解如何去实现这样的操作,但是大部分的都是自己监听手势并进行处理,代码很多很复杂,所以我就在想,是否有更简单的方法去实现。前不久,在学习自定义ViewGroup的时候,看到了ViewDragHelper,就想到这个应该能实现我想要的效果。ViewDragHelper基本使用方法请参考上述的博客,本文不过多讲解。
在很多应用中,我们都能看到右滑退出当前界面的功能,网上也有一些例子讲解如何去实现这样的操作,但是大部分的都是自己监听手势并进行处理,代码很多很复杂,所以我就在想,是否有更简单的方法去实现。前不久,在学习自定义ViewGroup的时候,看到了ViewDragHelper,就想到这个应该能实现我想要的效果。ViewDragHelper基本使用方法请参考上述的博客,本文不过多讲解。
自定义一个ViewGroup
首先我们需要自定义一个ViewGroup,ViewDragHelper是需要和ViewGroup结合使用的。这个ViewGroup是我们操作滑动退出所用的容器。package com.example.dragfinishactivity; import android.content.Context; import android.graphics.Color; import android.support.v4.widget.ViewDragHelper; import android.support.v4.widget.ViewDragHelper.Callback; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; public abstract class DragViewGroup extends ViewGroup { private ViewDragHelper dragHelper; private int leftMargin; private boolean isFinish; public DragViewGroup(Context context) { super(context); // TODO Auto-generated constructor stub init(); } public DragViewGroup(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub init(); } public DragViewGroup(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); // TODO Auto-generated constructor stub init(); } @Override public LayoutParams generateLayoutParams(AttributeSet attrs) { // TODO Auto-generated method stub return new MarginLayoutParams(MarginLayoutParams.MATCH_PARENT, MarginLayoutParams.MATCH_PARENT); } private void init() { dragHelper = ViewDragHelper.create(this, new Callback() { @Override public boolean tryCaptureView(View child, int pointerId) { // TODO Auto-generated method stub return true; } public int clampViewPositionHorizontal(View child, int left, int dx) { if (left < 0) { return 0; } leftMargin = ((MarginLayoutParams) child.getLayoutParams()).leftMargin + left; return left; }; public void onViewReleased(View releasedChild, float xvel, float yvel) { if (xvel > 3000) { isFinish = true; dragHelper.settleCapturedViewAt(getWidth(), 0); invalidate(); return; } if (leftMargin < getWidth() / 3) { dragHelper.settleCapturedViewAt(0, 0); invalidate(); } else { isFinish = true; dragHelper.settleCapturedViewAt(getWidth(), 0); invalidate(); } }; public void onEdgeDragStarted(int edgeFlags, int pointerId) { if (edgeFlags == ViewDragHelper.EDGE_LEFT) { dragHelper.captureChildView(getChildAt(0), pointerId); } }; }); dragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_ALL); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // TODO Auto-generated method stub // super.onMeasure(widthMeasureSpec, heightMeasureSpec); View view = getChildAt(0); view.setBackgroundColor(Color.WHITE); measureChild(view, widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(view.getMeasuredWidth(), view.getMeasuredHeight()); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { // TODO Auto-generated method stub getChildAt(0).layout(0, 0, getWidth(), getHeight()); } @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub dragHelper.processTouchEvent(event); return true; } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { // TODO Auto-generated method stub return dragHelper.shouldInterceptTouchEvent(ev); } @Override public void computeScroll() { // TODO Auto-generated method stub super.computeScroll(); if (dragHelper.continueSettling(true)) { invalidate(); } else if (isFinish) { finishActivity(); } } public abstract void finishActivity(); }
使用该ViewGroup进行处理右滑退出
我们需要获取Activity根视图的第一个子视图,并将其移除添加到该自定义的ViewGroup中,并将该自定义的ViewGroup添加到根视图中,同时我们还需要注意的是,这个Activity需要把样式设置为透明的,要不然会出现滑动时看不见下一个出现界面public static void dragFinish(final Activity activity) { DragViewGroup viewGroup = new DragViewGroup(activity) { @Override public void finishActivity() { // TODO Auto-generated method stub activity.finish(); } }; viewGroup.setLayoutParams( new MarginLayoutParams(MarginLayoutParams.MATCH_PARENT, MarginLayoutParams.MATCH_PARENT)); ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView(); ViewGroup decorItemView = (ViewGroup) decorView.getChildAt(0); decorView.removeView(decorItemView); viewGroup.addView(decorItemView); decorView.addView(viewGroup); }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories