您的位置:首页 > 移动开发 > Android开发

Android右滑销毁Activity

2016-04-09 15:32 435 查看
参考http://blog.csdn.net/lmj623565791/article/details/46858663

在很多应用中,我们都能看到右滑退出当前界面的功能,网上也有一些例子讲解如何去实现这样的操作,但是大部分的都是自己监听手势并进行处理,代码很多很复杂,所以我就在想,是否有更简单的方法去实现。前不久,在学习自定义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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息