背景
昨天用Scroller實作了下彈性滑動,而利用動畫,也可以實作類似的效果
步驟
1、建立ValueAnimator,添加updateListener
主要的scroll邏輯是放在updateListener裡的,代碼如下
final ValueAnimator animator = ValueAnimator.ofInt(0, 1).setDuration(250); // ofInt()裡的值一般用來表示動畫的起止區間,setDuration()裡面的機關是毫秒
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int offsetY, destY;
if (mIsDown) { // 如果是按下
offsetY = mImage1.getScrollY() - 0;
destY = 40;
} else { // 如果是擡起
offsetY = mImage1.getScrollY() - 40;
destY = -40;
}
mImage1.scrollBy(0, destY - offsetY); // 這裡scrollBy()就行,滾動一定的偏移量
mImage1.invalidate(); // 重繪
}
});
2、而後給mImage1設定onTouchListener
規定按下往上跳,擡起歸位,代碼如下
mImage1.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (!animator.isStarted() && !animator.isRunning()) {
mIsDown = true;
}
break;
case MotionEvent.ACTION_UP:
if (animator.isStarted() || animator.isRunning()) {
mIsDown = false;
}
break;
}
if (!animator.isStarted() && !animator.isRunning()) { // 要是按的時間長了,可能需要重新開機動畫
animator.start();
}
return true;
}
});
效果
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiNwgTO1EzMxEzMxYDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
結語
ValueAnimator動畫并沒有想象地那麼複雜,充其量隻是一個帶有計時功能的控制器罷了,處理view還是得我們自己來