zoukankan      html  css  js  c++  java
  • 简易的拖动——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~

  • 相关阅读:
    关于js的语句类型运算符等
    关于flex的布局理解
    三天来都在写项目;今天开始学习了js
    12.13的学习内容
    Css多列语法笔记
    Css3关键帧动画
    codevs1085数字游戏(环形DP+划分DP )
    codevs1040统计单词个数(区间+划分型dp)
    POJ1062昂贵的聘礼
    POJ3687Labeling Balls
  • 原文地址:https://www.cnblogs.com/fishbone-lsy/p/5376474.html
Copyright © 2011-2022 走看看