Touch监听事件可以监听手指在屏幕上的行为,例如按下、滑动。抬起。根据这些事件,可以做出View任意推动的效果。
首先获取view的位置以及父控件viewgroup的位置(上下左右)。通过父控件的位置可以获得父控件的宽度和高度(width=right-left,height=bottom-top)。 然后实现OnTouchListener监听,监听MotionEvent.ACTION_DOWN以及MotionEvent.ACTION_MOVE。在ACTION_DOWN中记录第一次按下时的X、Y值。在ACTION_MOVE中再次记录移动后的X、Y值,计算出X。Y移动的距离dx、dy。 之后获取view的位置(t、b、l、r)。然后计算出移动后view的位置:dt=t+dy db=b+dy dl=l+dx dr=r+dx。然后执行view.layout(dl,dt,dr,db)固定移动后view的位置。保持移动后的X、Y坐标。最后调用view.postInvalidate();执行刷新。
避免View移动到边界然后被移出父控件消息不见。我们需要对上下左右边界进行处理。 获取view的宽高width、height,view的位置left、top、right、bottom,父控件viewgroup的宽高pwidth、pheighht。
//当view滑动到左边超过左边界时:
if(left<0){
left=0;
right=left+width;
}
//当view滑动到顶部超过顶部边界时:
if(top<0){
top=0;
bottom=top+height;
}
//当view滑动到右边超过右边边界时:
if(right>pwidth){
right=pwidth;
left=right-width;
}
//当view滑动到底部超过底部边界时:
if(bottom>pheight){
bottom=pheight;
top=bottom-height;
}