1.scrollTo()与scrollBy()使用

scrollTo()和scrollBy()是View的两个方法,可以进行View的移动。但是需要注意的是这两个方法移动的是View的内容,通俗的讲就是当View为ViewGroup时,移动的是此ViewGroup的子View;当View为单独的View时,移动的是内部内容。例如:View为TextView时,移动的是内容文字。

  1. 由于他是移动的内容,隐藏想要启动此View,需要使用((View)getParent()).scrollBy(offsetX,offsetY);的而不能直接使用当前的View的scrollBy方法。
  2. scrollBy()和ScollTo()方法,是content的移动,而content是再屏幕之下的,隐藏这两个方法的移动其实可以看做是屏幕的移动。因此给这两个方法设置值的时候,需要要设置-dx,-dy.
    例如:想让View想左移动dx,想下移动dy,需要使用((View)getParent()).scrollBy(-dx,-dy);

2. Scroller

Scoller可以实现平滑移动的效果,而不是瞬间移动的效果。

#一般情况下是用Scroller的步骤:

  1. 初始化Scroller
    mScroller = new Scroller(context)
  2. 重写View的computeScroll()方法,实现模拟滑动
    此方法会再View被绘制的是后即draw()方法内被调用。
    通常情况,computeScroll的代码可以利用如下模板来实现

    1
    2
    3
    4
    5
    6
    7
    8
    public void computeScroll(){
    super.computeScroll();
    //判断Scroller是否执行完毕
    if(mScroller.computeScrollOffset()){
    ((View) getParent()).scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
    invalidate();//invalidate方法会重绘View,从而调用draw()方法,draw()放再调用computreScroll()方法
    }
    }
  3. startScroll开启模拟过程

    1
    2
    3
    4
    case MotionEvent.ACTION_UP:
    mScroller.startScroll(getScrollX(),getScrollY(),-getScrollX(),-getScrollY());
    invalidate();//调用draw---computeScroll
    break;