diff --git a/pickerview/src/main/java/com/bigkoo/pickerview/view/WheelTime.java b/pickerview/src/main/java/com/bigkoo/pickerview/view/WheelTime.java index 5941f934..9d1cee32 100755 --- a/pickerview/src/main/java/com/bigkoo/pickerview/view/WheelTime.java +++ b/pickerview/src/main/java/com/bigkoo/pickerview/view/WheelTime.java @@ -710,6 +710,33 @@ public void setCyclic(boolean cyclic) { wv_seconds.setCyclic(cyclic); } + public void setItemsVisibleNum(int visibleNum){ + wv_year.setItemsVisibleNum(visibleNum); + wv_month.setItemsVisibleNum(visibleNum); + wv_day.setItemsVisibleNum(visibleNum); + wv_hours.setItemsVisibleNum(visibleNum); + wv_minutes.setItemsVisibleNum(visibleNum); + wv_seconds.setItemsVisibleNum(visibleNum); + } + + public void setCenterItemBgColor(int color){ + wv_year.setCenterItemBgColor(color); + wv_month.setCenterItemBgColor(color); + wv_day.setCenterItemBgColor(color); + wv_hours.setCenterItemBgColor(color); + wv_minutes.setCenterItemBgColor(color); + wv_seconds.setCenterItemBgColor(color); + } + + public void setLabelGravity(WheelView.LabelGravity gravity){ + wv_year.setLabelGravity(gravity); + wv_month.setLabelGravity(gravity); + wv_day.setLabelGravity(gravity); + wv_hours.setLabelGravity(gravity); + wv_minutes.setLabelGravity(gravity); + wv_seconds.setLabelGravity(gravity); + } + public String getTime() { if (isLunarCalendar) { //如果是农历 返回对应的公历时间 diff --git a/wheelview/src/main/java/com/contrarywind/view/WheelView.java b/wheelview/src/main/java/com/contrarywind/view/WheelView.java index b0a42f52..f40287b6 100644 --- a/wheelview/src/main/java/com/contrarywind/view/WheelView.java +++ b/wheelview/src/main/java/com/contrarywind/view/WheelView.java @@ -44,6 +44,10 @@ public enum DividerType { // 分隔线类型 FILL, WRAP } + public enum LabelGravity{ // label + RIGHT/*最右边*/, AFTER_CONTENT/*文字后面*/ + } + private DividerType dividerType;//分隔线类型 private Context context; @@ -61,6 +65,7 @@ public enum DividerType { // 分隔线类型 private Paint paintOuterText; private Paint paintCenterText; private Paint paintIndicator; + private Paint paintCenterBg; private WheelAdapter adapter; @@ -76,6 +81,7 @@ public enum DividerType { // 分隔线类型 private int textColorOut; private int textColorCenter; private int dividerColor; + private int centerItemBgColor; // 条目间距倍数 private float lineSpacingMultiplier = 1.6F; @@ -118,11 +124,16 @@ public enum DividerType { // 分隔线类型 private int widthMeasureSpec; private int mGravity = Gravity.CENTER; + private LabelGravity mLabelGravity = LabelGravity.RIGHT; private int drawCenterContentStart = 0;//中间选中文字开始绘制位置 private int drawOutContentStart = 0;//非中间文字开始绘制位置 private static final float SCALE_CONTENT = 0.8F;//非中间文字则用此控制高度,压扁形成3d错觉 private float CENTER_CONTENT_OFFSET;//偏移量 + //item内容的最大宽度 + private int maxItemContentWidth; + private String maxItemContent = ""; + private final float DEFAULT_TEXT_TARGET_SKEWX = 0.5f; public WheelView(Context context) { @@ -154,6 +165,7 @@ public WheelView(Context context, AttributeSet attrs) { mGravity = a.getInt(R.styleable.pickerview_wheelview_gravity, Gravity.CENTER); textColorOut = a.getColor(R.styleable.pickerview_wheelview_textColorOut, 0xFFa8a8a8); textColorCenter = a.getColor(R.styleable.pickerview_wheelview_textColorCenter, 0xFF2a2a2a); + centerItemBgColor = a.getColor(R.styleable.pickerview_wheelview_centerItemBgColor, 0x00000000); dividerColor = a.getColor(R.styleable.pickerview_wheelview_dividerColor, 0xFFd5d5d5); textSize = a.getDimensionPixelOffset(R.styleable.pickerview_wheelview_textSize, textSize); lineSpacingMultiplier = a.getFloat(R.styleable.pickerview_wheelview_lineSpacingMultiplier, lineSpacingMultiplier); @@ -205,6 +217,10 @@ private void initPaints() { paintIndicator.setColor(dividerColor); paintIndicator.setAntiAlias(true); + paintCenterBg = new Paint(); + paintCenterBg.setColor(centerItemBgColor); + paintCenterBg.setAntiAlias(true); + setLayerType(LAYER_TYPE_SOFTWARE, null); } @@ -324,10 +340,26 @@ public final void setOnItemSelectedListener(OnItemSelectedListener OnItemSelecte public final void setAdapter(WheelAdapter adapter) { this.adapter = adapter; + measureMaxItemContentWidth(); remeasure(); invalidate(); } + private void measureMaxItemContentWidth(){ + if(adapter != null){ + int maxWidth = 0; + for (int i = 0; i < adapter.getItemsCount(); i++) { + String content = adapter.getItem(i).toString(); + int width = getTextWidth(paintCenterText, content); + if(width > maxWidth){ + maxWidth = width; + maxItemContent = content; + } + } + maxItemContentWidth = maxWidth; + } + } + public final WheelAdapter getAdapter() { return adapter; } @@ -414,6 +446,9 @@ protected void onDraw(Canvas canvas) { } + //绘制中间item背景颜色 + canvas.drawRect(0.0f, firstLineY, measuredWidth, secondLineY, paintCenterBg); + //绘制中间两条横线 if (dividerType == DividerType.WRAP) {//横线长度仅包裹内容 float startX; @@ -438,9 +473,15 @@ protected void onDraw(Canvas canvas) { //只显示选中项Label文字的模式,并且Label文字不为空,则进行绘制 if (!TextUtils.isEmpty(label) && isCenterLabel) { - //绘制文字,靠右并留出空隙 - int drawRightContentStart = measuredWidth - getTextWidth(paintCenterText, label); - canvas.drawText(label, drawRightContentStart - CENTER_CONTENT_OFFSET, centerY, paintCenterText); + if(mLabelGravity == LabelGravity.RIGHT){ + //绘制文字,靠右并留出空隙 + int drawRightContentStart = measuredWidth - getTextWidth(paintCenterText, label); + canvas.drawText(label, drawRightContentStart - CENTER_CONTENT_OFFSET, centerY, paintCenterText); + }else { + measuredCenterContentStart(maxItemContent); + int drawRightContentStart = drawCenterContentStart + maxItemContentWidth; + canvas.drawText(label, drawRightContentStart + CENTER_CONTENT_OFFSET, centerY, paintCenterText); + } } counter = 0; @@ -591,7 +632,11 @@ private void measuredCenterContentStart(String content) { if (isOptions || label == null || label.equals("") || !isCenterLabel) { drawCenterContentStart = (int) ((measuredWidth - rect.width()) * 0.5); } else {//只显示中间label时,时间选择器内容偏左一点,留出空间绘制单位标签 - drawCenterContentStart = (int) ((measuredWidth - rect.width()) * 0.25); + if(mLabelGravity == LabelGravity.RIGHT){ + drawCenterContentStart = (int) ((measuredWidth - rect.width()) * 0.25); + }else { + drawCenterContentStart = (int) ((measuredWidth - rect.width()) * 0.5); + } } break; case Gravity.LEFT: @@ -611,7 +656,11 @@ private void measuredOutContentStart(String content) { if (isOptions || label == null || label.equals("") || !isCenterLabel) { drawOutContentStart = (int) ((measuredWidth - rect.width()) * 0.5); } else {//只显示中间label时,时间选择器内容偏左一点,留出空间绘制单位标签 - drawOutContentStart = (int) ((measuredWidth - rect.width()) * 0.25); + if(mLabelGravity == LabelGravity.RIGHT){ + drawOutContentStart = (int) ((measuredWidth - rect.width()) * 0.25); + }else { + drawOutContentStart = (int) ((measuredWidth - rect.width()) * 0.5); + } } break; case Gravity.LEFT: @@ -807,6 +856,35 @@ public float getItemHeight() { return itemHeight; } + public void setItemHeight(float itemHeight) { + this.itemHeight = itemHeight; + } + + public int getItemsVisibleNum() { + return itemsVisible; + } + + public void setItemsVisibleNum(int itemsVisible) { + this.itemsVisible = itemsVisible; + } + + public int getCenterItemBgColor() { + return centerItemBgColor; + } + + public void setCenterItemBgColor(int centerItemBgColor) { + this.centerItemBgColor = centerItemBgColor; + paintCenterBg.setColor(centerItemBgColor); + } + + public LabelGravity getLabelGravity() { + return mLabelGravity; + } + + public void setLabelGravity(LabelGravity mLabelGravity) { + this.mLabelGravity = mLabelGravity; + } + public int getInitPosition() { return initPosition; } diff --git a/wheelview/src/main/res/values/attrs.xml b/wheelview/src/main/res/values/attrs.xml index 142e2a34..2e47c111 100644 --- a/wheelview/src/main/res/values/attrs.xml +++ b/wheelview/src/main/res/values/attrs.xml @@ -10,6 +10,7 @@ + \ No newline at end of file