Scroller、scrollBy scrollTo
2018-11-16 本文已影响9人
大漠孤烟直_v
public class MyView extends android.support.v7.widget.AppCompatTextView {
private Scroller scroller;
public MyView(Context context) {
super(context);
}
public MyView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
scroller = new Scroller(context);
}
/**
* 缓慢滚动到指定位置
*
* @param destX 目的x
* @param destY 目的y
*/
public void smoothScrollTo(int destX, int destY) {
//原本内容在X轴的偏移量
int scrollX = getScrollX();
//原本内容在Y轴的偏移量
int scrollY = getScrollY();
//偏移量 -为正方向 +为反方向
int deltaX = scrollX - destX;
int deltaY = scrollY - destY;
scroller.startScroll(scrollX, scrollY, deltaX, deltaY, 1500);
invalidate();
}
@Override
public void computeScroll() {
//先判断mScroller滚动是否完成
if (scroller.computeScrollOffset()) {
//这里调用View的scrollTo()完成实际的滚动
scrollTo(scroller.getCurrX(), scroller.getCurrY());
//必须调用该方法,否则不一定能看到滚动效果
postInvalidate();
}
super.computeScroll();
}
}
final RelativeLayout rl = findViewById(R.id.rl);
final MyView myView = findViewById(R.id.txtOne);
rl.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//使用scrollTo或scrollBy来实现view的滑动,只能将view的内容进行滑动,并不能将view本身进行移动 so -为正方向 +为反方向
//scrollTo()方法是让View相对于初始的位置滚动某段距离,由于View的初始位置是不变的,因此不管我们点击多少次scrollTo按钮滚动到的都将是同一个位置。
// 而scrollBy()方法则是让View相对于当前的位置滚动某段距离,那每当我们点击一次scrollBy按钮,View的当前位置都进行了变动.
rl.scrollBy(100, 0);
// rl.scrollTo(0, 0);
}
});
myView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
myView.smoothScrollTo(100, 50);
}
});