Scroller的基础知识
Scroller类其实并不负责“滚动”这个动作,“滚动”的动作[1]是由基类View的scrollTo(x,y)
和scrollBy(dx,dy)
的这两个方法完成的,Scroller类只是根据要滚动的起始位置和结束位置生成中间的过渡位置,从而形成一个滚动的动画。
一个View在容器(比如ViewGroup)中的滚动不是自身发起的动作,而是由父容器驱动容器内的子控件来完成,换句话说就是发生滚动效果的是组件的内容。例如在ViewGroup中使用Scroller,移动的是所有子View。但如果在TextView中使用,那么移动的将是TextView中的文本。
scrollTo(x,y)和scrollBy(dx,dy)
scrollTo,滚动到指定的位置
scrollBy,在原来的基础上,在滚动(dx,dy)的距离,内部的实现其实是调用了scrollTo
public void scrollBy(int x, int y) {
scrollTo(mScrollX + x, mScrollY + y);
}
此处的x,y是相对于当前View左上角
当x为负数时,表示内容向右滚动
当y为负数时,表示内容向下滚动
getX,getTranslationX和getScrollX的区别
-
getX()与getY()方法获取的是View左上角相对于父容器的坐标
当View没有发生平移操作时,getX()==getLeft()、getY==getTop()。 -
getTranslationX与getTranslationY是View左上角相对于父容器的偏移量:translationX = getX() - getLeft(),当View未发生平移操作时,translationX 与translationY都为0。
-
getScrollX与getScrollY得到的是View调用scrollTo或者scrollBy方法得到的值,无论这个值怎么改变,都不会影响View相对于父View的坐标,因为它滚动的是View中的内容,而不是View本身
网友评论