Android右滑销毁Activity

参考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);
    }

猜你喜欢

转载自blog.csdn.net/krubo1/article/details/51105427
今日推荐