Loading core/java/android/widget/NumberPicker.java +98 −15 Original line number Diff line number Diff line Loading @@ -202,6 +202,16 @@ public class NumberPicker extends LinearLayout { */ private final EditText mInputText; /** * The max height of this widget. */ private final int mMaxHeight; /** * The max width of this widget. */ private final int mMaxWidth; /** * The height of the text. */ Loading Loading @@ -517,6 +527,8 @@ public class NumberPicker extends LinearLayout { getResources().getDisplayMetrics()); mSelectionDividerHeight = attributesArray.getDimensionPixelSize( R.styleable.NumberPicker_selectionDividerHeight, defSelectionDividerHeight); mMaxHeight = attributesArray.getDimensionPixelSize(R.styleable.NumberPicker_maxHeight, 0); mMaxWidth = attributesArray.getDimensionPixelSize(R.styleable.NumberPicker_maxWidth, 0); attributesArray.recycle(); mShowInputControlsAnimimationDuration = getResources().getInteger( Loading Loading @@ -665,7 +677,38 @@ public class NumberPicker extends LinearLayout { @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { if (mMaxHeight <= 0 && mMaxWidth <= 0) { super.onLayout(changed, left, top, right, bottom); } else { final int msrdWdth = getMeasuredWidth(); final int msrdHght = getMeasuredHeight(); // Increment button at the top. final int inctBtnMsrdWdth = mIncrementButton.getMeasuredWidth(); final int incrBtnLeft = (msrdWdth - inctBtnMsrdWdth) / 2; final int incrBtnTop = 0; final int incrBtnRight = incrBtnLeft + inctBtnMsrdWdth; final int incrBtnBottom = incrBtnTop + mIncrementButton.getMeasuredHeight(); mIncrementButton.layout(incrBtnLeft, incrBtnTop, incrBtnRight, incrBtnBottom); // Input text centered horizontally. final int inptTxtMsrdWdth = mInputText.getMeasuredWidth(); final int inptTxtMsrdHght = mInputText.getMeasuredHeight(); final int inptTxtLeft = (msrdWdth - inptTxtMsrdWdth) / 2; final int inptTxtTop = (msrdHght - inptTxtMsrdHght) / 2; final int inptTxtRight = inptTxtLeft + inptTxtMsrdWdth; final int inptTxtBottom = inptTxtTop + inptTxtMsrdHght; mInputText.layout(inptTxtLeft, inptTxtTop, inptTxtRight, inptTxtBottom); // Decrement button at the top. final int decrBtnMsrdWdth = mIncrementButton.getMeasuredWidth(); final int decrBtnLeft = (msrdWdth - decrBtnMsrdWdth) / 2; final int decrBtnTop = msrdHght - mDecrementButton.getMeasuredHeight(); final int decrBtnRight = decrBtnLeft + decrBtnMsrdWdth; final int decrBtnBottom = msrdHght; mDecrementButton.layout(decrBtnLeft, decrBtnTop, decrBtnRight, decrBtnBottom); } if (!mScrollWheelAndFadingEdgesInitialized) { mScrollWheelAndFadingEdgesInitialized = true; // need to do all this when we know our size Loading @@ -674,6 +717,24 @@ public class NumberPicker extends LinearLayout { } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); final int measuredWidth; if (mMaxWidth > 0) { measuredWidth = getMaxSize(widthMeasureSpec, mMaxWidth); } else { measuredWidth = getMeasuredWidth(); } final int measuredHeight; if (mMaxHeight > 0) { measuredHeight = getMaxSize(heightMeasureSpec, mMaxHeight); } else { measuredHeight = getMeasuredHeight(); } setMeasuredDimension(measuredWidth, measuredHeight); } @Override public boolean onInterceptTouchEvent(MotionEvent event) { if (!isEnabled() || !mFlingable) { Loading @@ -700,17 +761,14 @@ public class NumberPicker extends LinearLayout { hideInputControls(); return true; } if (isEventInViewHitRect(event, mInputText) || (!mIncrementButton.isShown() && isEventInViewHitRect(event, mIncrementButton)) || (!mDecrementButton.isShown() && isEventInViewHitRect(event, mDecrementButton))) { if (isEventInVisibleViewHitRect(event, mIncrementButton) || isEventInVisibleViewHitRect(event, mDecrementButton)) { return false; } mAdjustScrollerOnUpEvent = false; setSelectorWheelState(SELECTOR_WHEEL_STATE_LARGE); hideInputControls(); return true; } break; case MotionEvent.ACTION_MOVE: float currentMoveY = event.getY(); int deltaDownY = (int) Math.abs(currentMoveY - mLastDownEventY); Loading Loading @@ -1239,6 +1297,28 @@ public class NumberPicker extends LinearLayout { // perceive this widget as several controls rather as a whole. } /** * Gets the max value for a size based on the measure spec passed by * the parent and the max value for that size. * * @param measureSpec The measure spec. * @param maxValue The max value for the size. * @return The max size. */ private int getMaxSize(int measureSpec, int maxValue) { final int mode = MeasureSpec.getMode(measureSpec); switch (mode) { case MeasureSpec.EXACTLY: return MeasureSpec.getSize(measureSpec); case MeasureSpec.AT_MOST: return Math.min(MeasureSpec.getSize(measureSpec), maxValue); case MeasureSpec.UNSPECIFIED: return maxValue; default: throw new IllegalArgumentException(); } } /** * Resets the selector indices and clear the cached * string representation of these indices. Loading Loading @@ -1335,12 +1415,15 @@ public class NumberPicker extends LinearLayout { } /** * @return If the <code>event</code> is in the <code>view</code>. * @return If the <code>event</code> is in the visible <code>view</code>. */ private boolean isEventInViewHitRect(MotionEvent event, View view) { private boolean isEventInVisibleViewHitRect(MotionEvent event, View view) { if (view.getVisibility() == VISIBLE) { view.getHitRect(mTempRect); return mTempRect.contains((int) event.getX(), (int) event.getY()); } return false; } /** * Sets the <code>selectorWheelState</code>. Loading core/res/res/values/attrs.xml +4 −0 Original line number Diff line number Diff line Loading @@ -3572,6 +3572,10 @@ <attr name="selectionDivider" format="reference" /> <!-- @hide The height of the selection divider. --> <attr name="selectionDividerHeight" format="dimension" /> <!-- @hide The max height of the NumberPicker. --> <attr name="maxHeight" /> <!-- @hide The max width of the NumberPicker. --> <attr name="maxWidth" /> </declare-styleable> <declare-styleable name="TimePicker"> Loading core/res/res/values/styles.xml +4 −2 Original line number Diff line number Diff line Loading @@ -1646,6 +1646,8 @@ please see styles_device_defaults.xml. <item name="android:flingable">true</item> <item name="android:selectionDivider">@android:drawable/numberpicker_selection_divider</item> <item name="android:selectionDividerHeight">2dip</item> <item name="android:maxHeight">180dip</item> <item name="android:maxWidth">56dip</item> </style> <style name="Widget.Holo.TimePicker" parent="Widget.TimePicker"> Loading @@ -1661,13 +1663,13 @@ please see styles_device_defaults.xml. <item name="android:background">@null</item> <item name="android:src">@android:drawable/numberpicker_up_btn_holo_dark</item> <item name="android:paddingTop">16dip</item> <item name="android:paddingBottom">36dip</item> <item name="android:paddingBottom">22dip</item> </style> <style name="Widget.Holo.ImageButton.NumberPickerDownButton"> <item name="android:background">@null</item> <item name="android:src">@android:drawable/numberpicker_down_btn_holo_dark</item> <item name="android:paddingTop">36dip</item> <item name="android:paddingTop">22dip</item> <item name="android:paddingBottom">16dip</item> </style> Loading Loading
core/java/android/widget/NumberPicker.java +98 −15 Original line number Diff line number Diff line Loading @@ -202,6 +202,16 @@ public class NumberPicker extends LinearLayout { */ private final EditText mInputText; /** * The max height of this widget. */ private final int mMaxHeight; /** * The max width of this widget. */ private final int mMaxWidth; /** * The height of the text. */ Loading Loading @@ -517,6 +527,8 @@ public class NumberPicker extends LinearLayout { getResources().getDisplayMetrics()); mSelectionDividerHeight = attributesArray.getDimensionPixelSize( R.styleable.NumberPicker_selectionDividerHeight, defSelectionDividerHeight); mMaxHeight = attributesArray.getDimensionPixelSize(R.styleable.NumberPicker_maxHeight, 0); mMaxWidth = attributesArray.getDimensionPixelSize(R.styleable.NumberPicker_maxWidth, 0); attributesArray.recycle(); mShowInputControlsAnimimationDuration = getResources().getInteger( Loading Loading @@ -665,7 +677,38 @@ public class NumberPicker extends LinearLayout { @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { if (mMaxHeight <= 0 && mMaxWidth <= 0) { super.onLayout(changed, left, top, right, bottom); } else { final int msrdWdth = getMeasuredWidth(); final int msrdHght = getMeasuredHeight(); // Increment button at the top. final int inctBtnMsrdWdth = mIncrementButton.getMeasuredWidth(); final int incrBtnLeft = (msrdWdth - inctBtnMsrdWdth) / 2; final int incrBtnTop = 0; final int incrBtnRight = incrBtnLeft + inctBtnMsrdWdth; final int incrBtnBottom = incrBtnTop + mIncrementButton.getMeasuredHeight(); mIncrementButton.layout(incrBtnLeft, incrBtnTop, incrBtnRight, incrBtnBottom); // Input text centered horizontally. final int inptTxtMsrdWdth = mInputText.getMeasuredWidth(); final int inptTxtMsrdHght = mInputText.getMeasuredHeight(); final int inptTxtLeft = (msrdWdth - inptTxtMsrdWdth) / 2; final int inptTxtTop = (msrdHght - inptTxtMsrdHght) / 2; final int inptTxtRight = inptTxtLeft + inptTxtMsrdWdth; final int inptTxtBottom = inptTxtTop + inptTxtMsrdHght; mInputText.layout(inptTxtLeft, inptTxtTop, inptTxtRight, inptTxtBottom); // Decrement button at the top. final int decrBtnMsrdWdth = mIncrementButton.getMeasuredWidth(); final int decrBtnLeft = (msrdWdth - decrBtnMsrdWdth) / 2; final int decrBtnTop = msrdHght - mDecrementButton.getMeasuredHeight(); final int decrBtnRight = decrBtnLeft + decrBtnMsrdWdth; final int decrBtnBottom = msrdHght; mDecrementButton.layout(decrBtnLeft, decrBtnTop, decrBtnRight, decrBtnBottom); } if (!mScrollWheelAndFadingEdgesInitialized) { mScrollWheelAndFadingEdgesInitialized = true; // need to do all this when we know our size Loading @@ -674,6 +717,24 @@ public class NumberPicker extends LinearLayout { } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); final int measuredWidth; if (mMaxWidth > 0) { measuredWidth = getMaxSize(widthMeasureSpec, mMaxWidth); } else { measuredWidth = getMeasuredWidth(); } final int measuredHeight; if (mMaxHeight > 0) { measuredHeight = getMaxSize(heightMeasureSpec, mMaxHeight); } else { measuredHeight = getMeasuredHeight(); } setMeasuredDimension(measuredWidth, measuredHeight); } @Override public boolean onInterceptTouchEvent(MotionEvent event) { if (!isEnabled() || !mFlingable) { Loading @@ -700,17 +761,14 @@ public class NumberPicker extends LinearLayout { hideInputControls(); return true; } if (isEventInViewHitRect(event, mInputText) || (!mIncrementButton.isShown() && isEventInViewHitRect(event, mIncrementButton)) || (!mDecrementButton.isShown() && isEventInViewHitRect(event, mDecrementButton))) { if (isEventInVisibleViewHitRect(event, mIncrementButton) || isEventInVisibleViewHitRect(event, mDecrementButton)) { return false; } mAdjustScrollerOnUpEvent = false; setSelectorWheelState(SELECTOR_WHEEL_STATE_LARGE); hideInputControls(); return true; } break; case MotionEvent.ACTION_MOVE: float currentMoveY = event.getY(); int deltaDownY = (int) Math.abs(currentMoveY - mLastDownEventY); Loading Loading @@ -1239,6 +1297,28 @@ public class NumberPicker extends LinearLayout { // perceive this widget as several controls rather as a whole. } /** * Gets the max value for a size based on the measure spec passed by * the parent and the max value for that size. * * @param measureSpec The measure spec. * @param maxValue The max value for the size. * @return The max size. */ private int getMaxSize(int measureSpec, int maxValue) { final int mode = MeasureSpec.getMode(measureSpec); switch (mode) { case MeasureSpec.EXACTLY: return MeasureSpec.getSize(measureSpec); case MeasureSpec.AT_MOST: return Math.min(MeasureSpec.getSize(measureSpec), maxValue); case MeasureSpec.UNSPECIFIED: return maxValue; default: throw new IllegalArgumentException(); } } /** * Resets the selector indices and clear the cached * string representation of these indices. Loading Loading @@ -1335,12 +1415,15 @@ public class NumberPicker extends LinearLayout { } /** * @return If the <code>event</code> is in the <code>view</code>. * @return If the <code>event</code> is in the visible <code>view</code>. */ private boolean isEventInViewHitRect(MotionEvent event, View view) { private boolean isEventInVisibleViewHitRect(MotionEvent event, View view) { if (view.getVisibility() == VISIBLE) { view.getHitRect(mTempRect); return mTempRect.contains((int) event.getX(), (int) event.getY()); } return false; } /** * Sets the <code>selectorWheelState</code>. Loading
core/res/res/values/attrs.xml +4 −0 Original line number Diff line number Diff line Loading @@ -3572,6 +3572,10 @@ <attr name="selectionDivider" format="reference" /> <!-- @hide The height of the selection divider. --> <attr name="selectionDividerHeight" format="dimension" /> <!-- @hide The max height of the NumberPicker. --> <attr name="maxHeight" /> <!-- @hide The max width of the NumberPicker. --> <attr name="maxWidth" /> </declare-styleable> <declare-styleable name="TimePicker"> Loading
core/res/res/values/styles.xml +4 −2 Original line number Diff line number Diff line Loading @@ -1646,6 +1646,8 @@ please see styles_device_defaults.xml. <item name="android:flingable">true</item> <item name="android:selectionDivider">@android:drawable/numberpicker_selection_divider</item> <item name="android:selectionDividerHeight">2dip</item> <item name="android:maxHeight">180dip</item> <item name="android:maxWidth">56dip</item> </style> <style name="Widget.Holo.TimePicker" parent="Widget.TimePicker"> Loading @@ -1661,13 +1663,13 @@ please see styles_device_defaults.xml. <item name="android:background">@null</item> <item name="android:src">@android:drawable/numberpicker_up_btn_holo_dark</item> <item name="android:paddingTop">16dip</item> <item name="android:paddingBottom">36dip</item> <item name="android:paddingBottom">22dip</item> </style> <style name="Widget.Holo.ImageButton.NumberPickerDownButton"> <item name="android:background">@null</item> <item name="android:src">@android:drawable/numberpicker_down_btn_holo_dark</item> <item name="android:paddingTop">36dip</item> <item name="android:paddingTop">22dip</item> <item name="android:paddingBottom">16dip</item> </style> Loading