package com.bigkoo.pickerview.lib; import java.util.TimerTask; /** * @TODO<滚动惯性的实现> * @author 小嵩 */ final class InertiaTimerTask extends TimerTask { float a; final float velocityY; final WheelView loopView; InertiaTimerTask(WheelView loopview, float velocityY) { super(); loopView = loopview; this.velocityY = velocityY; a = Integer.MAX_VALUE; } @Override public final void run() { if (a == Integer.MAX_VALUE) { if (Math.abs(velocityY) > 2000F) { if (velocityY > 0.0F) { a = 2000F; } else { a = -2000F; } } else { a = velocityY; } } if (Math.abs(a) >= 0.0F && Math.abs(a) <= 20F) { loopView.cancelFuture(); loopView.handler.sendEmptyMessage(MessageHandler.WHAT_SMOOTH_SCROLL); return; } int i = (int) ((a * 10F) / 1000F); loopView.totalScrollY = loopView.totalScrollY - i; if (!loopView.isLoop) { float itemHeight = loopView.itemHeight; float top = (-loopView.initPosition) * itemHeight; float bottom = (loopView.getItemsCount() - 1 - loopView.initPosition) * itemHeight; if(loopView.totalScrollY - itemHeight*0.25 < top){ top = loopView.totalScrollY + i; } else if(loopView.totalScrollY + itemHeight*0.25 > bottom){ bottom = loopView.totalScrollY + i; } if (loopView.totalScrollY <= top){ a = 40F; loopView.totalScrollY = (int)top; } else if (loopView.totalScrollY >= bottom) { loopView.totalScrollY = (int)bottom; a = -40F; } } if (a < 0.0F) { a = a + 20F; } else { a = a - 20F; } loopView.handler.sendEmptyMessage(MessageHandler.WHAT_INVALIDATE_LOOP_VIEW); } }