View滑动的三种方式
1、使用scrollTo/scrollBy
起始坐标为左上角(0,0)
1、移动View内容的相关变量和方法 (注意:是移动View所包含的内容,而非View本身)
//View的内容相对于View在水平方向上的偏移量,以像素为单位
//当mScrollX为正数时,内容相对于View从右向左移动,反之则向从左向右移动
protected int mScrollX; //该视图内容相当于视图起始坐标的偏移量 , X轴方向,mScrollX=View位置的原始坐标0-视图内容的坐标,所以向左移动的时候是正,向右移动是负。
//View的内容相对于View在垂直方向上的偏移量,以像素为单位
//当mScrollY为正数时,内容相对于View从下向上移动,反之则向从上向下移动
protected int mScrollY; //该视图内容相当于视图起始坐标的偏移量 , Y轴方向,计算方式如X。
public void scrollTo(int x, int y),说明:在当前视图内容偏移至(x , y)坐标处,即显示(可视)区域位于(x , y)坐标处。
public void scrollTo(int x, int y) {
//偏移位置发生了改变
if (mScrollX != x || mScrollY != y) {
int oldX = mScrollX;
int oldY = mScrollY;
mScrollX = x; //赋新值,保存当前便宜量
mScrollY = y;
//回调onScrollChanged方法
onScrollChanged(mScrollX, mScrollY, oldX, oldY);
if (!awakenScrollBars()) {
invalidate(); //一般都引起重绘
}
}
}
public void scrollBy(int x, int y)说明:在当前视图内容继续偏移(x , y)个单位,显示(可视)区域也跟着偏移(x,y)个单位。
public void scrollBy(int x, int y) {
scrollTo(mScrollX + x, mScrollY + y);
}
2、使用动画
利用属性动画的translationX和translationY的属性
3、改变布局参数
Layoutparams params = view.getLayoutParams();
params.width +=10;
params.leftMargin +=10;
view.setLayoutParams(params);//或者view.requestLayout();
弹性滑动:
1、使用Scroller
一般在自定义View的时候,会新建一个Scroller scroller = new Scroller(context)
private void smoothScrollTo(int x,int y){
int scrollX = getScrollX();
int dx = x-scrollX;
scroller.startScroll(scrollX,0,dx,0,1000);//表示从scrollX滚动到x,时间间隔1000
invalidate();
}
调用上面的方法的时候,其实并没有开始滑动。只是记录下来了所需要的参数和一个起始动画时间。然后调用重新绘制的方法
重新绘制的时候,会调用computeScroll方法,在view中这个是一个空方法,需要我们去自定义实现
public void computeScroll(){
if(scroller.computeScrollOffset()){
scrollTo(scroller.getCurrX(),scroller.getCurrY());
postInvalidate();
}
}
于是我们可以得出结论,重绘的时候,会不断的调用scrollTo方法去实现内容的移动,而computeScrollOffset方法就是用于判断滑动是否结束
2、通过属性动画的ValueAnimatior的插值器,这个很好理解,就是通过属性动画的监听value值的变化来计算需要滚动的距离
3、使用handler发送消息的机制来实现滚动动画。不断绘制。