自由笔记-AndroidView模块之View滑动相关

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发送消息的机制来实现滚动动画。不断绘制。

你可能感兴趣的:(自由笔记-AndroidView模块之View滑动相关)