在Android中,要开发一个控件拖动的模块,代码是比较繁琐的。好在Android在support.v4中为我们提供了一个强大的拖动类——ViewDragHelper。

  我们只需要为它提供一个ViewGroup,这个ViewGroup中的所有childView就可以随意拖动了。同时,它为我们提供了大量的监听方法,可以方便我们进行各种拖动中,拖动后的处理。

  通常,我们会自定义一个控制来使用它,使结构更好看,其实它的使用并不一定需要自定义控件。

  

public class CustomDragView extends RelativeLayout {
    ViewDragHelper mDragHelper;

    public CustomDragView(Context context) {
        super(context);
        initView();
    }

    public CustomDragView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView();
    }

    public CustomDragView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView();

    }

    private void initView() {
        mDragHelper = ViewDragHelper.create(this, 1.0f, new ViewDragHelper.Callback() {
            @Override
            public boolean tryCaptureView(View view, int i) {
                return true;
            }

            @Override
            public int clampViewPositionHorizontal(View child, int left, int dx) {
                return left;
            }

            @Override
            public int clampViewPositionVertical(View child, int top, int dy) {
                return top;
            }
        });
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return mDragHelper.shouldInterceptTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mDragHelper.processTouchEvent(event);
        return true;
    }
}

   代码比较简单。最简单的使用方法,只需要三步。

  第一步:create一个ViewDragHelper。ViewDragHelper为我们提供了构造方法,我们只需要传入三个参数,这三个参数分别是:

    1.需要子控件允许拖动的ViewGroup

    2.拖动的灵敏度,我们这里设为1.0f

    3.拖动中和拖动后的回调类,这里新建了一个匿名对象。 

    private void initView() {
        mDragHelper = ViewDragHelper.create(this, 1.0f, new ViewDragHelper.Callback() {
            @Override
            public boolean tryCaptureView(View view, int i) {
                return true;
            }

            @Override
            public int clampViewPositionHorizontal(View child, int left, int dx) {
                return left;
            }

            @Override
            public int clampViewPositionVertical(View child, int top, int dy) {
                return top;
            }
        });
    }

 

  第二步:将拦截事件,交由ViewDragHelper接管

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return mDragHelper.shouldInterceptTouchEvent(event);
    }

  第三步,让ViewDragHelper参与onTouchEvent

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mDragHelper.processTouchEvent(event);
        return true;
    }

 

经过了这三步的设置,ViewGroup中的childView已经可以被拖动了。

 

同时,ViewDragHelper的Callback为我们提供了大量的监听,我们可以通过官方说明进行了解:

 

初次使用ViewDragHelper,对它的认识,还有限。其他功能,在后面进行补充。

Done~

 

posted on 2016-04-10 23:15  Fishbonell  阅读(238)  评论(0编辑  收藏  举报