ViewDragHelper拖拽帮助类-2
关于ViewDragHelper在上篇中已经介绍,这里着重了解其回调方法Callback中需要重写的方法
1、tryCaptureView
capture ['kæptʃə] 捕获
回调方法会传入当前拖拽的View,供我们判断是否拖拽。返回true则可拖拽,返回false则不拖拽,那么下面的方法也都将不会调用,当前拖拽已结束
2、onViewCaptured
当View可以被拖拽时调用,此时也意味着View被捕获到了
3、getViewHorizontalDragRange
horizontal [hɒrɪ'zɒnt(ə)l] 水平的
drag [dræg] 拖拽
range [reɪn(d)ʒ] 范围
该方法需要我们返回View水平方向可拖拽的范围,该方法不是对View范围的限制,而是作为动画执行速度计算使用
4、clampViewPositionHorizontal
clamp [klæmp] 夹钳、固定
该方法会传入View水平方向拖拽后的坐标、拖拽像素,由我们决定View的坐标
它们的关系是child.getLeft() + dx = left
5、onViewPositionChanged
当执行了上面的方法后,我们重新赋予了View的坐标,这个方法的调用表示View的位置已经改变
这里也可自行再强制改变位置,如果需要的话
为了兼容低版本这里还需要调用invalidate方法
6、onViewReleased
View拖拽释放后处理的业务,这里用于完成拖拽后复位、状态改变等处理
这里再介绍一个控件尺寸变化时调用的方法
/*
* 尺寸有变化时调用
*/
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mHeight = getMeasuredHeight();
mWidth = getMeasuredWidth();
mRange = (int) (mWidth * 0.6f);
}
主要的方法就是以上这些,后面还会陆续扩展它的使用,下面提供一份示例代码供参考
ViewDragHelper.Callback mCallBack = new Callback() {
// 决定是否拖拽
// child 当前拖拽的View
// pointerId 区分多点触摸的Id
@Override
public boolean tryCaptureView(View child, int pointerId) {
Log.d("","tryCaptureView---> View是否拖拽");
// 只允许主面板拖拽
// return child == mMainContent;
return true;
}
/*
* View被捕获时调用
* 如果tryCaptureView返回false,即不能拖拽,那么就不能捕获,此方法自然不能执行
*/
@Override
public void onViewCaptured(View capturedChild, int activePointerId) {
Log.d("","onViewCaptured---> View捕获");
super.onViewCaptured(capturedChild, activePointerId);
}
/*
* View横向拖拽的范围,纵向的方法这里均不处理,可参考此方法
* 不对拖拽真正限制,作用仅决定动画执行的速度
*/
@Override
public int getViewHorizontalDragRange(View child) {
return mRange;
}
// 根据建议值返回移动的位置
// 不重写默认为0,则不能移动
// 此时还没有移动,返回值决定将要移动的位置
// 新的left = 旧left + dx
@Override
public int clampViewPositionHorizontal(View child, int left, int dx) {
// child拖拽的View
// left新的位置的建议值
// dx位置变化量
Log.d("","clampViewPositionHorizontal---> 新旧left+变化量:"+child.getLeft()+"=="+left+"=="+dx);
if(child == mMainContent){
left = fixLeft(left);
}
return left;
}
// View位置改变时调用
// 位置已经发生了改变
@Override
public void onViewPositionChanged(View changedView, int left, int top,
int dx, int dy) {
super.onViewPositionChanged(changedView, left, top, dx, dy);
Log.d("", "onViewPositionChanged---> left" + left +"---dx"+dx);
// mLeftContent的拖动传递给mMainContent
if(changedView == mLeftContent){
// 做面板移动后,再强制放回,还有更好的实现方法
mLeftContent.layout(0, 0, mWidth, mHeight);
int newLeft = mMainContent.getLeft() + dx;// 变化量给主面板
newLeft = fixLeft(newLeft);
mMainContent.layout(newLeft, 0, newLeft+mWidth, mHeight);
}
// 兼容低版本 改玩值需要重绘
invalidate();
}
/*
* View 释放后处理的业务
* 释放的view
* xvel 水平方向的速度
* 垂直方向的速度
*/
@Override
public void onViewReleased(View releasedChild, float xvel, float yvel) {
// TODO Auto-generated method stub
super.onViewReleased(releasedChild, xvel, yvel);
}
@Override
public void onViewDragStateChanged(int state) {
// TODO Auto-generated method stub
super.onViewDragStateChanged(state);
}
};
浙公网安备 33010602011771号