• 简易的拖动——ViewDragHelper


      在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~

  • 相关阅读:
    Markdown 语法说明 (简体中文版)
    Markdown Reference
    BZOJ 2229 最小割
    BZOJ 3569 DZY Loves Chinese II
    BZOJ 3563 DZY Loves Chinese
    BZOJ 2956 模积和
    BZOJ 2957 楼房重建
    查漏补缺:面向对象设计原则
    添砖加瓦:设计模式(简单工厂模式)
    添砖加瓦:设计模式(总述)
  • 原文地址:https://www.cnblogs.com/fishbone-lsy/p/5376474.html
Copyright © 2020-2023  润新知