问题场景:
利用OverScroller实现点击“上滑按钮”将一个View从窗口底部滑动到顶部,上滑失败。涉及的函数为:OverScroller.startScroll。
跟踪问题:
利用OverScroller实现View滑动的机制:
//第一步:开启滑动计算器,通知View刷新
void onClickUpMoveButton(){
mScroller.startScroll(startX, startY, dx, dy, duration) ;
mView.invalidate();
}
//第二步:View刷新会反复调用View.computeScroll(),重写此函数,实现View缓慢移动的效果
@Override
public void computeScroll() {
super.computeScroll();
if(mScroller.computeScrollOffset()){
scrollTo(0,mScroller.getCurrY());
}
}
但实际测试中发现,点击“上滑按钮”View没有上滑,通过插点打Log发现View.computeScroll()没有被执行过,然后查阅资料发现只有view被附加在当前窗口上,View.computeScroll()才会被执行。
解决方案:
方案一:初始化view的时候,保证1dp漏出屏幕,可以解决问题,但出现了一个1dp的白线,不美观。
方案二:执行mScroller滑动前,先滑动到窗口可见位置:
void onClickUpMoveButton(){
mView.setTranslationY(-1);
mScroller.startScroll(startX, startY, dx, dy, duration) ;
mView.invalidate();
mView.setTranslationY(0);
}