private void updateNotWrapYLimit(){ mNotWrapLimitYTop = 0; mNotWrapLimitYBottom = -mShowCount * mItemHeight; if(mDisplayedValues != null){ mNotWrapLimitYTop = (getOneRecycleSize() - mShowCount / 2 - 1)* mItemHeight; mNotWrapLimitYBottom = -(mShowCount / 2) * mItemHeight; } }
private int refineValueByLimit(int value, int minValue, int maxValue, boolean wrap) { if (wrap) { if (value > maxValue) { value = (value - maxValue) % getOneRecycleSize() + minValue - 1; } else if (value < minValue) { value = (value - minValue) % getOneRecycleSize() + maxValue + 1; } return value; } else { if(value > maxValue){ value = maxValue; }else if(value < minValue){ value = minValue; } return value; } }
private int getWillPickIndexByGlobalY(int globalY){ if(mItemHeight == 0) return 0; int willPickIndex = globalY / mItemHeight + mShowCount / 2; int index = getIndexByRawIndex(willPickIndex, getOneRecycleSize(), mWrapSelectorWheel && mWrapSelectorWheelCheck); if(0 <= index && index < getOneRecycleSize()){ return index + mMinShowIndex; }else{ throw new IllegalArgumentException("getWillPickIndexByGlobalY illegal index : " + index + " getOneRecycleSize() : " + getOneRecycleSize() + " mWrapSelectorWheel : " + mWrapSelectorWheel); } }
private void correctPositionByDefaultValue(int defaultPickedIndex, boolean wrap){ mCurrDrawFirstItemIndex = defaultPickedIndex - (mShowCount - 1) / 2; mCurrDrawFirstItemIndex = getIndexByRawIndex(mCurrDrawFirstItemIndex, getOneRecycleSize(), wrap); if(mItemHeight == 0){ mCurrentItemIndexEffect = true; }else { mCurrDrawGlobalY = mCurrDrawFirstItemIndex * mItemHeight; mInScrollingPickedOldValue = mCurrDrawFirstItemIndex + mShowCount / 2; mInScrollingPickedOldValue = mInScrollingPickedOldValue % getOneRecycleSize(); if (mInScrollingPickedOldValue < 0){ mInScrollingPickedOldValue = mInScrollingPickedOldValue + getOneRecycleSize(); } mInScrollingPickedNewValue = mInScrollingPickedOldValue; calculateFirstItemParameterByGlobalY(); } }
private void calculateFirstItemParameterByGlobalY(){ mCurrDrawFirstItemIndex = (int)Math.floor((float)mCurrDrawGlobalY / mItemHeight); mCurrDrawFirstItemY = -(mCurrDrawGlobalY - mCurrDrawFirstItemIndex * mItemHeight); if (mOnValueChangeListenerInScrolling != null){ if (-mCurrDrawFirstItemY > mItemHeight / 2){ mInScrollingPickedNewValue = mCurrDrawFirstItemIndex + 1 + mShowCount / 2; }else{ mInScrollingPickedNewValue = mCurrDrawFirstItemIndex + mShowCount / 2; } mInScrollingPickedNewValue = mInScrollingPickedNewValue % getOneRecycleSize(); if (mInScrollingPickedNewValue < 0){ mInScrollingPickedNewValue = mInScrollingPickedNewValue + getOneRecycleSize(); } if (mInScrollingPickedOldValue != mInScrollingPickedNewValue){ respondPickedValueChangedInScrolling(mInScrollingPickedOldValue, mInScrollingPickedNewValue); } mInScrollingPickedOldValue = mInScrollingPickedNewValue; } }
public void setPickedIndexRelativeToMin(int pickedIndexToMin){ if(0 <= pickedIndexToMin && pickedIndexToMin < getOneRecycleSize()){ mPrevPickedIndex = pickedIndexToMin + mMinShowIndex; correctPositionByDefaultValue(pickedIndexToMin, mWrapSelectorWheel && mWrapSelectorWheelCheck); postInvalidate(); } }
/** * * @param fromValue need to set the fromValue, can be greater than mMaxValue or less than mMinValue * @param toValue the value you want picker to scroll to * @param needRespond need Respond to the ValueChange callback When Scrolling, default is false */ public void smoothScrollToValue(int fromValue, int toValue, boolean needRespond){ int deltaIndex; fromValue = refineValueByLimit(fromValue, mMinValue, mMaxValue, mWrapSelectorWheel && mWrapSelectorWheelCheck); toValue = refineValueByLimit(toValue, mMinValue, mMaxValue, mWrapSelectorWheel && mWrapSelectorWheelCheck); if(mWrapSelectorWheel && mWrapSelectorWheelCheck) { deltaIndex = toValue - fromValue; int halfOneRecycleSize = getOneRecycleSize() / 2; if(deltaIndex < -halfOneRecycleSize || halfOneRecycleSize < deltaIndex ){ deltaIndex = deltaIndex > 0 ? deltaIndex - getOneRecycleSize() : deltaIndex + getOneRecycleSize(); } }else{ deltaIndex = toValue - fromValue; } setValue(fromValue); if(fromValue == toValue) return; scrollByIndexSmoothly(deltaIndex, needRespond); }
index = getIndexByRawIndex(mCurrDrawFirstItemIndex + i, getOneRecycleSize(), mWrapSelectorWheel && mWrapSelectorWheelCheck); if(i == mShowCount / 2){//this will be picked fraction = (float)(mItemHeight + mCurrDrawFirstItemY) / mItemHeight; mPaintText.setTextSize(textSize); if(0 <= index && index < getOneRecycleSize()){ CharSequence str = mDisplayedValues[index + mMinShowIndex]; if (mTextEllipsize != null) {
@Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mViewWidth = w; mViewHeight = h; mItemHeight = mViewHeight / mShowCount; mViewCenterX = ((float)(mViewWidth + getPaddingLeft() - getPaddingRight()))/2; int defaultValue = 0; if(getOneRecycleSize() > 1){ if(mHasInit) { defaultValue = getValue() - mMinValue; }else if(mCurrentItemIndexEffect) { defaultValue = mCurrDrawFirstItemIndex + (mShowCount - 1) / 2; }else{ defaultValue = 0; } } correctPositionByDefaultValue(defaultValue, mWrapSelectorWheel && mWrapSelectorWheelCheck); updateFontAttr(); updateNotWrapYLimit(); updateDividerAttr(); mHasInit = true; }