/*
|
* Copyright (C) 2019 xuexiangjys(xuexiangjys@163.com)
|
*
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
* you may not use this file except in compliance with the License.
|
* You may obtain a copy of the License at
|
*
|
* http://www.apache.org/licenses/LICENSE-2.0
|
*
|
* Unless required by applicable law or agreed to in writing, software
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* See the License for the specific language governing permissions and
|
* limitations under the License.
|
*/
|
|
package com.kuanzhai.driver.utils.citypickerview.picker.wheelview.timer;
|
|
|
import com.kuanzhai.driver.utils.citypickerview.picker.wheelview.WheelView;
|
|
import java.util.TimerTask;
|
|
/**
|
* 平滑滚动的实现
|
*
|
* @author xuexiang
|
* @since 2019/1/1 下午5:09
|
*/
|
public final class SmoothScrollTimerTask extends TimerTask {
|
|
private int realTotalOffset;
|
private int realOffset;
|
private int offset;
|
private final WheelView wheelView;
|
|
public SmoothScrollTimerTask(WheelView wheelView, int offset) {
|
this.wheelView = wheelView;
|
this.offset = offset;
|
realTotalOffset = Integer.MAX_VALUE;
|
realOffset = 0;
|
}
|
|
@Override
|
public final void run() {
|
if (realTotalOffset == Integer.MAX_VALUE) {
|
realTotalOffset = offset;
|
}
|
//把要滚动的范围细分成10小份,按10小份单位来重绘
|
realOffset = (int) ((float) realTotalOffset * 0.1F);
|
|
if (realOffset == 0) {
|
if (realTotalOffset < 0) {
|
realOffset = -1;
|
} else {
|
realOffset = 1;
|
}
|
}
|
|
if (Math.abs(realTotalOffset) <= 1) {
|
wheelView.cancelFuture();
|
wheelView.getHandler().sendEmptyMessage(MessageHandler.WHAT_ITEM_SELECTED);
|
} else {
|
wheelView.setTotalScrollY(wheelView.getTotalScrollY() + realOffset);
|
|
//这里如果不是循环模式,则点击空白位置需要回滚,不然就会出现选到-1 item的 情况
|
if (!wheelView.isLoop()) {
|
float itemHeight = wheelView.getItemHeight();
|
float top = (float) (-wheelView.getInitPosition()) * itemHeight;
|
float bottom = (float) (wheelView.getItemsCount() - 1 - wheelView.getInitPosition()) * itemHeight;
|
if (wheelView.getTotalScrollY() <= top || wheelView.getTotalScrollY() >= bottom) {
|
wheelView.setTotalScrollY(wheelView.getTotalScrollY() - realOffset);
|
wheelView.cancelFuture();
|
wheelView.getHandler().sendEmptyMessage(MessageHandler.WHAT_ITEM_SELECTED);
|
return;
|
}
|
}
|
wheelView.getHandler().sendEmptyMessage(MessageHandler.WHAT_INVALIDATE_LOOP_VIEW);
|
realTotalOffset = realTotalOffset - realOffset;
|
}
|
}
|
}
|