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