View的坐标相关和滑动

1.基本坐标值

这里写图片描述

这里写图片描述

上面两图很清楚的描述了View和MotionEvent提供的关于自身坐标的方法。

View提供的方法:

getLeft:View的左边到父容器左边的距离
getRight:View的右边到父容器左边的距离
getTop:View的顶边到父容器顶边的距离
getBottom:View的底边到父容器顶边的距离

getWidth:获得View的宽度,值为mRight - mLeft
getHeight:获得View的高度,值为mBottom - mTop

getX:View左上角相对于父容器左边的距离
getY:View左上角相对于父容器顶边的距离

getTranslationX:View左上角相对于父容器左边的偏移量
getTranslationY:View左上角相对于父容器顶边的偏移量

x = left + translationX;
y = top + translationY;

getScrollX:View的内容发生滑动后,View原始位置左边缘和View内容左边缘在水平方向的间距,从左向右滑动mScrollX为负值,反之为正
getScrollY:View的内容发生滑动后,View原始位置上边缘和View内容上边缘在竖直方向的间距,从上向下滑动mScrollY为负值,反之为正

如果View发生位移,top、left等原声参数不会发生改变,改变的是x、y、translationX、translationY。View对象调用方法一般都是针对View的左上角,MotionEvent调用方法一般是针对手指的触点。

注意getRight和getBottom两个方法,getRight是View自身右边到父容器左边的距离,getBottom是自身到父容器顶边的距离,所有的测距方法都是以左上角为原点。

MotionEvent提供的方法:

getX:点击事件到控件左边的距离
getY:点击事件到控件顶边的距离
getRawX:点击事件到屏幕左边的距离
getRawY:点击事件到屏幕顶边的距离

2.View的滑动

实现滑动View的三种方法:

1.通过View提供的scrollTo(绝对位移)和scrollBy(相对位移)

scrollBy实际上也是调用了scrollTo方法,方法内部mScrollX是View左边缘和View中内容左边缘的间距,mScollY是View上边缘在竖直方向上和View中内容上边缘的间距。scrollTo和scrollBy只能改变View内容的位置,不能改变View在布局中的位置。如果从左向右滑mScrollX为负值,反之为正值。如果从上往下滑,mScrollY为负值,反之为正。

2.结合动画给View施加平移

使用动画移动View,主要操作View的translationX和translationY(View左上角相对于父容器的偏移量),可以采用传统的View动画和属性动画。
View动画是对View的影像做操作的,它并不能真正的改变View的位置参数,如果希望动画后的状态得以保留必须将fillAfter属性设置为true,如果fillAfter属性为false,在动画完成的一瞬间View会恢复到动画前的状态。而且View的位置并没有真正的改变。如果设置了点击事件,只有点击原先的位置才会触发,点击动画后完成的位置并不会触发。如果使用属性动画就不会存在上述问题。

3.改变View的LayoutParams(适用于有交互的View)

即改变LayoutParams,如果想把一个Button右移100px,只需将这个Button的LayoutParams里的marginLeft增加100px,也可以在Button左边放一个宽度为0的空View,当需要右移Button时,将View的宽度重新设置。