自定义控件<一> viewDragHelper介绍
viewDragHelper相当于ViewGroup,可以对于子孩子进行操作,但是viewDragHelper的一些方法 方便子孩子的操作<下一遍通讯录的自定义控件要用到viewDragHelper> ok~ 下面对viewDragHelper进行代码详解;
1.viewDragHelper的实例创建—>可以单例实现
ViewDragHelper dragHelper = ViewDragHelper.create(this,callback);//创建对象\\
2.ok~viewDragHelper中的一些方法
在ViewDragHelper中可以由DragHelper进行 拦截和触摸事件 的处理
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
//让ViewDragHelper帮助我们判断是否应该拦截
boolean result = dragHelper.shouldInterceptTouchEvent(ev);
return result;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//让ViewDragHelper帮我们处理触摸事件
dragHelper.processTouchEvent(event);
return true;
}
当然最重要的是ViewDragHelper要进行接口回调:
ViewDragHelper.Callback callback = new ViewDragHelper.Callback() {
/**
* 是否捕获View的触摸事件
* @param child 当前你所触摸的子View
* @param pointerId 多点触摸的时候每一个触摸点的索引
* @return true就是捕获, false就是不捕获
*/
@Override
public boolean tryCaptureView(View child, int pointerId) {
//确定触摸事件的view 即是child中哪些具备触摸点击
return child==main || child==menu;
}
/**
* 比较鸡肋的方法,从方法名来看好像是限制VIew水平拖拽范围的,然后并没有什么用,
* 目前该方法的范围值被用来作为你是否想横向滑动的条件之一,如果返回值大于0,表示想
* 强制水平滑动,反之不想强制水平滑动
* @param child
* @return
*/
@Override
public int getViewHorizontalDragRange(View child) {
//比较鸡肋 没有什么实在意义
return 1;
}
/**
* 修正View水平方向的位置
* @param child 当前触摸的子View
* @param left 表示ViewDragHelper帮我计算好的当前child最新的left值,left=child.getLeft()+dx
* @param dx 表示本次移动的距离
* @return 表示我们真正想让child的left变成的值
*/
@Override
public int clampViewPositionHorizontal(View child, int left, int dx) {
//修正水平方向的位置 其实就是对chid中左右边界的一个限制
//对main界面限制
if(child==main){
left = clampLeft(left);
}
return left;
}
/**
* 修正View垂直方向的位置
* @param child 当前触摸的子View
* @param top 表示ViewDragHelper帮我计算好的当前child最新的top值,top=child.getTop()+dy
* @param dy 表示本次移动的距离
* @return 表示我们真正想让child的top变成的值
*/
@Override
public int clampViewPositionVertical(View child, int top, int dy) {
//对垂直方向的一个限制 没有什么意义
return 0;
}
/**
* 当View位置改变之后调用
* @param changedView 位置改变的View
* @param left 改变的最新的left
* @param top 改变的最新的top
* @param dx 本次水平移动的距离
* @param dy 本次垂直移动的距离
*/
@Override
public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
//view位置改变之后调用 相当于对多个child的view进行联动的一个设置
super.onViewPositionChanged(changedView, left, top, dx, dy);
if(changedView==menu){
/**不让menu乱滑*/
//通过让manu固定在原点位置实现不动
menu.layout(0,0,menu.getMeasuredWidth(),menu.getMeasuredHeight());
/**先定位在放缩*/
int newLeft = main.getLeft()+dx;//main当前的left+本次移动的距离
newLeft = clampLeft(newLeft);
main.layout(newLeft,main.getTop(),newLeft+main.getMeasuredWidth()
,main.getBottom());
}
/**移动的是main*/
//执行伴随动画
//1.计算动画执行的百分比
float fraction = main.getLeft()*1f/maxLeft;
//2.根据百分比执行动画
executeAnim(fraction);
//3.回调接口的方法
if(main.getLeft()==0){
//回调关闭的方法
if(listener!=null){
listener.onClose();
}
}else if(main.getLeft()==maxLeft){
//回调打开的方法
if(listener!=null){
listener.onOpen();
}
}
//回调dragging
if(listener!=null){
listener.onDraging(fraction);
}
}
/**
* 当抬起手指的时候执行
* @param releasedChild 你抬起的那个子View
* @param xvel x方向滑动的速度
* @param yvel y方向滑动的速度
*/
@Override
public void onViewReleased(View releasedChild, float xvel, float yvel) {
//抬起手之后的回调 一般是需求需要 view回弹 或者弹出的一个设定
super.onViewReleased(releasedChild, xvel, yvel);
if(main.getLeft()>maxLeft/2){
//说明应该打开
openMenu();
}else {
//说明应该关闭
closeMenu();
}
}
};
viewDragHelper的一些主要方法,在viewGroup的自定义中确实方便许多