一、视图坐标
分别为Android坐标系和视图坐标系。
1.Android坐标系
将屏幕的左上角的顶点作为Android坐标系的原点,这个原点向右是X轴正方向,原点向下是Y轴正方向,getRawX()和getRawY()获取的坐标都是Android坐标系的坐标。
2.视图坐标系
描述的是子视图在父视图中的位置。(如图)
视图坐标系是以父视图的左上角为坐标原点的。相应的原点向右为x轴正方向,原点向下为y轴正方向。在触控中,通过getX()和getY()来获取的坐标值就是视图坐标系中的坐标值。
View提供的获取的坐标以及距离的方法:
getTop() 获取到的是view自身的顶边到其父布局顶边的距离getLeft() 获取到的是view自身的左边到其父布局左边的距离getRight() 获取到的是view自身的右边到其父布局左边的距离getBottom() 获取到的是view自身底边到其父布局底边的距离 MotionEvent提供的方法:
getX() 获取点击事件距离控件左边的距离,即视图坐标getY() 获取点击事件距离控件顶边的距离,即视图坐标getRawX() 获取到的是点击事件距离整个屏幕左边的距离,即绝对坐标getRawY() 获取到的是点击事件距离整个屏幕顶边的距离,即绝对坐标。
二、实现 View 滑动的六种方法
- 使用layout的方法;
- 使用offsetLeftAndRight()与offsetTopAndBottom();
- 使用LayoutParams();
- 使用scrollTo()与scrollBy();
- 使用Scroller类
- 使用属性动画
1.使用layout的方法使用onLayout的方法可以试着view的位置,那么我们就可以通过改变left,right,top,bottom来使View移动,结合MontionEvent来实现view跟着手指的滑动移动。
@Override
public boolean onTouchEvent(MotionEvent event) {
//使用getx,getY实现view移动
A:
// int x = (int) event.getX();
// int y = (int) event.getY();
//使用getrawx,rawY,实现移动;
int rawX = (int) event.getRawX();
int rawY = (int) event.getRawY();
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
B:
// lastX = x;
// lastY = y;
/ lastX = rawX;
lastY = rawY;
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_MOVE:
C:
// int offsetX = x - lastX;
// int offsetY = y - lastY;
int offsetX = rawX-lastX;
int offsetY = rawY-lastY;
// layout(getLeft()+offsetX,getTop()+offsetY,getRight()
// +offsetX,getBottom()+offsetY);
// layout(getLeft()+offsetX,getTop()+offsetY,getRight()+offsetX,getBottom()+offsetY);
D: