From d1bdae9d2efb09b73c53c057bf1812178d0119f3 Mon Sep 17 00:00:00 2001 From: kHRYSTAL <723526676@qq.com> Date: Tue, 12 Nov 2019 12:27:43 +0800 Subject: [PATCH 1/2] fix[BaseCountdown]: getTextBounds of rect.width() will clip text --- .../iwgang/countdownview/BaseCountdown.java | 44 +++++++++++++------ 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/library/src/main/java/cn/iwgang/countdownview/BaseCountdown.java b/library/src/main/java/cn/iwgang/countdownview/BaseCountdown.java index d26533e..aa2d97e 100644 --- a/library/src/main/java/cn/iwgang/countdownview/BaseCountdown.java +++ b/library/src/main/java/cn/iwgang/countdownview/BaseCountdown.java @@ -6,6 +6,7 @@ import android.graphics.Paint; import android.graphics.Rect; import android.text.TextUtils; +import android.util.Log; import android.view.View; /** @@ -112,7 +113,7 @@ public void initialize() { // pick one of two (minute and second) // if (!isShowMinute && !isShowSecond) isShowSecond = true; if (!isShowSecond) isShowMillisecond = false; - + Log.e("BaseCountDown", "initialize"); initTimeTextBaseInfo(); } @@ -367,7 +368,7 @@ private void initSuffixMargin() { mSuffixSecondRightMargin = 0; } - if (isShowMillisecond && mSuffixMillisecondTextWidth > 0) { + if (isShowMillisecond && mSuffixMillisecondTextWidth > 0) { if (mSuffixMillisecondLeftMargin < 0) { if (!isSuffixLRMarginNull) { mSuffixMillisecondLeftMargin = mSuffixLRMargin; @@ -389,11 +390,25 @@ protected void initTimeTextBaseInfo() { // initialize time text width and height Rect rect = new Rect(); mTimeTextPaint.getTextBounds("00", 0, 2, rect); - mTimeTextWidth = rect.width(); + // NOTICE: rect.width() will clip text + mTimeTextWidth = getTextWidth(mTimeTextPaint, "00"); mTimeTextHeight = rect.height(); mTimeTextBottom = rect.bottom; } + private int getTextWidth(Paint paint, String str) { + int iRet = 0; + if (str != null && str.length() > 0) { + int len = str.length(); + float[] widths = new float[len]; + paint.getTextWidths(str, widths); + for (int j = 0; j < len; j++) { + iRet += (int) Math.ceil(widths[j]); + } + } + return iRet; + } + private void initTimeTextBaseline(int viewHeight, int viewPaddingTop, int viewPaddingBottom) { if (viewPaddingTop == viewPaddingBottom) { // center @@ -499,6 +514,7 @@ private float getDayAndHourContentWidth() { /** * get all view width + * * @return all view width */ public int getAllContentWidth() { @@ -526,7 +542,7 @@ public int getAllContentHeight() { public void onMeasure(View v, int viewWidth, int viewHeight, int allContentWidth, int allContentHeight) { initTimeTextBaseline(viewHeight, v.getPaddingTop(), v.getPaddingBottom()); - mLeftPaddingSize = v.getPaddingLeft() == v.getPaddingRight() ? (viewWidth - allContentWidth) / 2 : v.getPaddingLeft(); + mLeftPaddingSize = v.getPaddingLeft() == v.getPaddingRight() ? (viewWidth - allContentWidth) / 2 : v.getPaddingLeft(); } public void onDraw(Canvas canvas) { @@ -568,7 +584,7 @@ public void onDraw(Canvas canvas) { if (isShowMinute) { // draw minute text - canvas.drawText(Utils.formatNum(mMinute), mMinuteLeft + mTimeTextWidth / 2 , mTimeTextBaseline, mTimeTextPaint); + canvas.drawText(Utils.formatNum(mMinute), mMinuteLeft + mTimeTextWidth / 2, mTimeTextBaseline, mTimeTextPaint); if (mSuffixMinuteTextWidth > 0) { // draw minute suffix canvas.drawText(mSuffixMinute, mMinuteLeft + mTimeTextWidth + mSuffixMinuteLeftMargin, mSuffixMinuteTextBaseline, mSuffixTextPaint); @@ -602,7 +618,7 @@ public void onDraw(Canvas canvas) { } } - public boolean refTimeShow(boolean isShowDay, boolean isShowHour, boolean isShowMinute, boolean isShowSecond, boolean isShowMillisecond) { + public boolean refTimeShow(boolean isShowDay, boolean isShowHour, boolean isShowMinute, boolean isShowSecond, boolean isShowMillisecond) { if (!isShowSecond) isShowMillisecond = false; boolean isModCountdownInterval = false; @@ -824,17 +840,17 @@ public boolean setSuffix(String suffixDay, String suffixHour, String suffixMinut public void setSuffixLRMargin(float suffixLRMargin) { mSuffixLRMargin = Utils.dp2px(mContext, suffixLRMargin); setSuffixMargin(mSuffixDayLeftMargin, mSuffixDayLeftMargin, - mSuffixDayLeftMargin, mSuffixDayLeftMargin, - mSuffixDayLeftMargin, mSuffixDayLeftMargin, - mSuffixDayLeftMargin, mSuffixDayLeftMargin, - mSuffixDayLeftMargin); + mSuffixDayLeftMargin, mSuffixDayLeftMargin, + mSuffixDayLeftMargin, mSuffixDayLeftMargin, + mSuffixDayLeftMargin, mSuffixDayLeftMargin, + mSuffixDayLeftMargin); } public boolean setSuffixMargin(Float suffixDayMarginL, Float suffixDayMarginR, - Float suffixHourMarginL, Float suffixHourMarginR, - Float suffixMinuteMarginL, Float suffixMinuteMarginR, - Float suffixSecondMarginL, Float suffixSecondMarginR, - Float suffixMillisecondMarginL) { + Float suffixHourMarginL, Float suffixHourMarginR, + Float suffixMinuteMarginL, Float suffixMinuteMarginR, + Float suffixSecondMarginL, Float suffixSecondMarginR, + Float suffixMillisecondMarginL) { boolean isRef = false; if (null != suffixDayMarginL) { From c3ab94d2ec4027fcdae3e025e54ddeba1ae18927 Mon Sep 17 00:00:00 2001 From: kHRYSTAL <723526676@qq.com> Date: Tue, 12 Nov 2019 12:38:02 +0800 Subject: [PATCH 2/2] fix[BaseCountdown]: getTextBounds of rect.width() will clip text --- .../src/main/java/cn/iwgang/countdownview/BaseCountdown.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/library/src/main/java/cn/iwgang/countdownview/BaseCountdown.java b/library/src/main/java/cn/iwgang/countdownview/BaseCountdown.java index aa2d97e..5271f1d 100644 --- a/library/src/main/java/cn/iwgang/countdownview/BaseCountdown.java +++ b/library/src/main/java/cn/iwgang/countdownview/BaseCountdown.java @@ -6,7 +6,6 @@ import android.graphics.Paint; import android.graphics.Rect; import android.text.TextUtils; -import android.util.Log; import android.view.View; /** @@ -113,7 +112,6 @@ public void initialize() { // pick one of two (minute and second) // if (!isShowMinute && !isShowSecond) isShowSecond = true; if (!isShowSecond) isShowMillisecond = false; - Log.e("BaseCountDown", "initialize"); initTimeTextBaseInfo(); }