View-->scrooTo & ScrollBy
View中 的两个方法—因此需要view才能调用
正的往左走
scrollTo(x,y) 会定位到具体的位置 0 -10 = -10
scrollBy(x,y) 在原来的基础上加X
scrollBy实际上也是调用了scrollTo
scrollBy/scrollTo只改变view内容的位置,而不能改变view在布局中的位置
scroller平滑滚动
创建scroller对象
//这个类封装了一个滚动,可以通过这个类来手机需要的数据,并且产生一个动画效果
//在这个区间,这个类会给我们产生好多个数据--再调用scrollTo(x)--产生动画效果
mScroller = new Scroller(getContext());
产生模拟滚动数据(产生多少数据由时间决定)--并调用invalidate方法—最终调用computeScroll方法
// 3这个方法执行只是产生了模拟滚动的数据
int startX = distancX;
int endX = 0;//结束 的位置
int dx = endX - startX;
//时间动态的变化
int duration = Math.abs(dx) * 20;
//调用startScroll
mScroller.startScroll(startX, 0, dx, 0, duration);
/**
* 参数:
* 参1:startX以水平滚动偏移量(以像素为单位)。 正数将滚动内容到left.
* 参2:startY开始垂直滚动偏移(以像素为单位)。 正数将滚动内容up.
* 参3:dx水平距离旅行。 正数将滚动内容到left.
* 参4:dy垂直距离的旅行。 正数将滚动内容up.
* 参5:duration滚动的持续时间以毫秒为单位
*/
//想实现x轴的平滑滚动—把y的值设置为0
//调用invalidate方法—最终调用computeScroll方法
invalidate(); // --->computeScroll
重写computeScroll方法—取出刚刚模拟的值(父类什么也没做)
@Override
public void computeScroll() {
//(当这里面没有值了这个循环就跳出了)
if (mScroller.computeScrollOffset()) {
//获取我们刚刚模拟的数据
int currX = mScroller.getCurrX();
//让view滚动
startScrollSlide(currX);
//调用invalidate-让这个方法不停的执行--
invalidate();
}
}
滚动滑动块—scrollTo
/**
* 当传入正数的时候 往左移动 ,为了符合中国人思维 在X前加一个 "-" 调用这个方法滚动 滑块
*/
public void startScrollSlide(int x) {
super.scrollTo(-x, 0);
}