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的宽度重新设置。