From aada4d58a8bd96fea75b4d7620317ea9027ed63c Mon Sep 17 00:00:00 2001 From: xingfei Date: Tue, 6 Jul 2021 16:07:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9findbugs=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 + README.md | 10 +- build.gradle | 4 +- entry/build.gradle | 2 +- pinview/build.gradle | 2 +- .../java/com/chaos/view/DecimalUtils.java | 199 ++++++++++++++++++ .../src/main/java/com/chaos/view/PinView.java | 185 ++++++++-------- 7 files changed, 304 insertions(+), 101 deletions(-) create mode 100644 pinview/src/main/java/com/chaos/view/DecimalUtils.java diff --git a/CHANGELOG.md b/CHANGELOG.md index cae93e3..4f15abd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,2 +1,5 @@ +# 0.0.2-SNAPSHOT: +- ohos 第二个版本,修改FindBugs问题 + # 0.0.1-SNAPSHOT: - ohos 第一个版本,完整实现了原库的全部 api diff --git a/README.md b/README.md index 84bff33..b0e9de6 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ * 调用差异:无 -* 开发版本:sdk5,DevEco Studio2.1 Release +* 开发版本:sdk6,DevEco Studio2.2 Beta1 * 基线版本:Release 1.4.3 @@ -33,12 +33,12 @@ allprojects { 2.在entry模块的build.gradle文件中 ```gradle dependencies { - implementation('com.gitee.chinasoft_ohos:PinView:0.0.1-SNAPSHOT') + implementation('com.gitee.chinasoft_ohos:PinView:0.0.2-SNAPSHOT') ...... } ``` -在sdk5,DevEco Studio2.1 Release下项目可直接运行 如无法运行,删除项目.gradle,.idea,build,gradle,build.gradle文件 并依据自己的版本创建新项目,将新项目的对应文件复制到根目录下 +在sdk6,DevEco Studio2.2 Beta1下项目可直接运行 如无法运行,删除项目.gradle,.idea,build,gradle,build.gradle文件 并依据自己的版本创建新项目,将新项目的对应文件复制到根目录下 ## 使用说明 @@ -89,12 +89,12 @@ CodeCheck代码测试无异常 CloudTest代码测试无异常 -火绒安全病毒安全检测通过 +安全病毒安全检测通过 当前版本demo功能与原组件基本无差异 ## 版本迭代 -- 0.0.1-SNAPSHOT +- 0.0.2-SNAPSHOT ## 版权和许可信息 Copyright 2017-2018 Chaos Leong diff --git a/build.gradle b/build.gradle index 0833109..671f97b 100644 --- a/build.gradle +++ b/build.gradle @@ -19,8 +19,8 @@ buildscript { jcenter() } dependencies { - classpath 'com.huawei.ohos:hap:2.4.4.2' - classpath 'com.huawei.ohos:decctest:1.0.0.6' + classpath 'com.huawei.ohos:hap:2.4.5.0' + classpath 'com.huawei.ohos:decctest:1.2.4.1' } } diff --git a/entry/build.gradle b/entry/build.gradle index 9eb1f5b..247998d 100644 --- a/entry/build.gradle +++ b/entry/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.huawei.ohos.hap' apply plugin: 'com.huawei.ohos.decctest' ohos { - compileSdkVersion 5 + compileSdkVersion 6 defaultConfig { compatibleSdkVersion 5 } diff --git a/pinview/build.gradle b/pinview/build.gradle index c531a17..615ea7b 100644 --- a/pinview/build.gradle +++ b/pinview/build.gradle @@ -1,6 +1,6 @@ apply plugin: 'com.huawei.ohos.library' ohos { - compileSdkVersion 5 + compileSdkVersion 6 defaultConfig { compatibleSdkVersion 5 } diff --git a/pinview/src/main/java/com/chaos/view/DecimalUtils.java b/pinview/src/main/java/com/chaos/view/DecimalUtils.java new file mode 100644 index 0000000..7db3678 --- /dev/null +++ b/pinview/src/main/java/com/chaos/view/DecimalUtils.java @@ -0,0 +1,199 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * 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 an 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.chaos.view; + +import java.math.BigDecimal; + +/** + * DecimalUtils + * + * @author:258767-shengyu + * @since 2021-04-28 + */ +public final class DecimalUtils { + private DecimalUtils() { + } + + /** + * 提供精确的加法运算。 + * + * @param v1 被加数 + * @param v2 加数 + * @return 两个参数的和 + */ + public static Double add(Double v1, Double v2) { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.add(b2).doubleValue(); + } + + /** + * 提供精确的加法运算。 + * + * @param v1 被加数 + * @param v2 加数 + * @return 两个参数的和 + */ + public static int add(Float v2, Double v1) { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Float.toString(v2)); + return b1.add(b2).intValue(); + } + + /** + * 提供精确的加法运算。 + * + * @param v1 被加数 + * @param v2 加数 + * @return 两个参数的和 + */ + public static int add(Float v1, Float v2) { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.add(b2).intValue(); + } + + /** + * 提供精确的加法运算。 + * + * @param v1 被加数 + * @param v2 加数 + * @return 两个参数的和 + */ + public static float add(int v1, Float v2) { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.add(b2).floatValue(); + } + + /** + * 提供精确的加法运算。 + * + * @param v1 被加数 + * @param v2 加数 + * @return 两个参数的和 + */ + public static float add(int v1, Double v2) { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.add(b2).floatValue(); + } + + /** + * 提供精确的加法运算。 + * + * @param v1 被加数 + * @param v2 加数 + * @return 两个参数的和 + */ + public static float addFloat(Double v1, Double v2) { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.add(b2).floatValue(); + } + + /** + * 提供精确的加法运算。 + * + * @param v1 被加数 + * @param v2 加数 + * @return 两个参数的和 + */ + public static float addFloat(Float v1, Float v2) { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.add(b2).floatValue(); + } + + /** + * 提供精确的加法运算。 + * + * @param v1 被加数 + * @param v2 加数 + * @return 两个参数的和 + */ + public static float addFloat(Float v1, Double v2) { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.add(b2).floatValue(); + } + + /** + * 提供精确的加法运算。 + * + * @param v1 被加数 + * @param v2 加数 + * @return 两个参数的和 + */ + public static int addInt(Double v1, Double v2) { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.add(b2).intValue(); + } + + /** + * 提供精确的减法运算。 + * + * @param v1 被减数 + * @param v2 减数 + * @return 两个参数的差 + */ + public static float sub(float v1, float v2) { + BigDecimal b1 = new BigDecimal(Float.toString(v1)); + BigDecimal b2 = new BigDecimal(Float.toString(v2)); + return b2.subtract(b1).floatValue(); + } + + /** + * 提供精确的减法运算。 + * + * @param v1 被减数 + * @param v2 减数 + * @return 两个参数的差 + */ + public static float sub(double v1, float v2) { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Float.toString(v2)); + return b2.subtract(b1).floatValue(); + } + + /** + * 提供精确的乘法运算。 + * + * @param v1 被乘数 + * @param v2 乘数 + * @return 两个参数的积 + */ + public static double mul(double v1, double v2) { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.multiply(b2).doubleValue(); + } + + /** + * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 + * 定精度,以后的数字四舍五入。 + * + * @param v1 被除数 + * @param v2 除数 + * @return 两个参数的商 + */ + public static float div(int v1, float v2) { + BigDecimal b1 = new BigDecimal(Integer.toString(v1)); + BigDecimal b2 = new BigDecimal(Float.toString(v2)); + return b2.divide(b1).floatValue(); + } +} diff --git a/pinview/src/main/java/com/chaos/view/PinView.java b/pinview/src/main/java/com/chaos/view/PinView.java index 53d17ba..d9d006e 100644 --- a/pinview/src/main/java/com/chaos/view/PinView.java +++ b/pinview/src/main/java/com/chaos/view/PinView.java @@ -78,7 +78,6 @@ public class PinView extends TextField implements Component.BindStateChangedList private static final int ONE_HUNDRED = 100; private static final int ONE_HUNDRED_AND_TEN = 110; private static final int FIVE_HUNDRED = 500; - private Context mContext; // 画笔 private RectFloat mRectFloatConnect; @@ -134,7 +133,6 @@ public class PinView extends TextField implements Component.BindStateChangedList private boolean mIsonInputFinished = false; private Paint mPaintCursor; - private CursorRunnable cursorRunnable; // 光标颜色 private Color mOtpCursorColor; @@ -145,9 +143,6 @@ public class PinView extends TextField implements Component.BindStateChangedList // 光标高度 private int mCursorHeight; - // 光标闪烁时长 - private int mCursorDuration; - // 下划线输入样式下,输入框获取焦点时下划线颜色 private Color mUnderlineFocusColor; @@ -233,9 +228,6 @@ public class PinView extends TextField implements Component.BindStateChangedList } } - // 获取光标画笔的alpha值 - float alpha = mPaintCursor.getAlpha(); - // 设置光标画笔的alpha值 invalidate(); } @@ -253,20 +245,20 @@ public class PinView extends TextField implements Component.BindStateChangedList float itemHeight = itemWidth; if (mItemHeight != 0) { - width = (int) (mItemWidth * mOtpItemCount + mOtpLineWidth * mOtpItemCount * TWO - + (mOtpItemCount - 1) * mOtpItemSpacing); + width = DecimalUtils.addInt(DecimalUtils.add(DecimalUtils.mul(mItemWidth, mOtpItemCount), + DecimalUtils.mul(DecimalUtils.mul(mOtpLineWidth, mOtpItemCount), TWO)), + DecimalUtils.mul(DecimalUtils.div(1, mOtpItemCount), mOtpItemSpacing)); itemHeight = mItemHeight; } - LogUtil.d("onEstimateSize---getHeight()=" + (itemWidth + mOtpLineWidth)); switch (mInputBoxStyle) { case INPUT_BOX_STYLE_UNDERLINE: - setComponentSize(width, (int) (itemHeight + mOtpLineWidth)); + setComponentSize(width, DecimalUtils.add(itemHeight, mOtpLineWidth)); break; case INPUT_BOX_STYLE_SINGLE: case INPUT_BOX_STYLE_CONNECT: default: - setComponentSize(width, (int) (itemHeight + mOtpLineWidth * TWO)); + setComponentSize(width, DecimalUtils.add(itemHeight, DecimalUtils.mul(mOtpLineWidth, TWO))); break; } } @@ -274,15 +266,6 @@ public class PinView extends TextField implements Component.BindStateChangedList } }; - /** - * 构造器 - * - * @param context - */ - public PinView(Context context) { - this(context, null); - } - /** * 构造器 * @@ -290,7 +273,7 @@ public class PinView extends TextField implements Component.BindStateChangedList * @param attrSet attrSet */ public PinView(Context context, AttrSet attrSet) { - this(context, attrSet, null); + this(context, attrSet, ""); } /** @@ -341,7 +324,6 @@ public class PinView extends TextField implements Component.BindStateChangedList setTextColor(Color.TRANSPARENT); mIsInputBoxSquare = AttrValue.get(attrs, "inputBoxSquare", true); mOtpCursorColor = AttrValue.get(attrs, "OtpCursorColor", Color.BLACK); - mCursorDuration = AttrValue.get(attrs, "cursorDuration", FIVE_HUNDRED); mOtpCursorWidth = AttrValue.getDimension(attrs, "OtpCursorWidth", TWO); mCursorHeight = AttrValue.getDimension(attrs, "cursorHeight", ZERO); mUnderlineFullColor = AttrValue.get(attrs, "underlineFullColor", Color.BLACK); @@ -350,10 +332,8 @@ public class PinView extends TextField implements Component.BindStateChangedList mItemBackgroudFocus = AttrValue.get(attrs, "itemBackgroudFocus", Color.TRANSPARENT); mItemBackgroudNoFocus = AttrValue.get(attrs, "itemBackgroudNoFocus", Color.TRANSPARENT); mBackgroudNoFocus = AttrValue.get(attrs, "backgroudNoFocus", Color.TRANSPARENT); - try { + if (attrs.getAttr("itemBackgroudImg").isPresent()) { mItemBackgroudImg = attrs.getAttr("itemBackgroudImg").get().getElement(); - } catch (Exception e) { - LogUtil.d(e.getMessage()); } mHintText = AttrValue.get(attrs, "hintText", ""); mHintColor = AttrValue.get(attrs, "hintColor", Color.GRAY); @@ -460,7 +440,9 @@ public class PinView extends TextField implements Component.BindStateChangedList mPaintContent.setColor(mTextColor); for (int ii = 0; ii < password.length(); ii++) { float startX = getDrawContentStartX(ii); - canvas.drawText(mPaintContent, "*", startX - mPaintContent.measureText("*") / TWO / TWO, + canvas.drawText(mPaintContent, "*", + DecimalUtils.sub(DecimalUtils.div(TWO, DecimalUtils.div(TWO, mPaintContent.measureText("*"))), + startX), getTextBaseline(mPaintContent, cy)); } } else { @@ -482,7 +464,8 @@ public class PinView extends TextField implements Component.BindStateChangedList } // 绘制文字x应该还需要减去文字宽度的一半 - canvas.drawText(mPaintContent, text, startX - textWidth / TWO, baselineText); + canvas.drawText(mPaintContent, text, + DecimalUtils.sub(DecimalUtils.div(TWO, textWidth), startX), baselineText); md = ii + 1; } for (; md < mHintText.length(); md++) { @@ -491,7 +474,8 @@ public class PinView extends TextField implements Component.BindStateChangedList // 计算文字宽度 String text = String.valueOf(mHintText.charAt(md)); float textWidth = mPaintContent.measureText(text); - canvas.drawText(mPaintHint, text, startX - textWidth / TWO, baselineText); + canvas.drawText(mPaintHint, text, + DecimalUtils.sub(DecimalUtils.div(TWO, textWidth), startX), baselineText); } } } @@ -524,8 +508,8 @@ public class PinView extends TextField implements Component.BindStateChangedList int sy = (getHeight() - mCursorHeight) / TWO; String content = getText(); float startX = getDrawContentStartX(content.length()); - float startY = sy + mOtpLineWidth; - float stopY = getHeight() - sy - mOtpLineWidth; + float startY = DecimalUtils.add(sy, mOtpLineWidth); + float stopY = DecimalUtils.sub(mOtpLineWidth, DecimalUtils.sub(sy, getHeight())); canvas.drawLine(new Point(startX, startY), new Point(startX, stopY), mPaintCursor); } @@ -540,11 +524,16 @@ public class PinView extends TextField implements Component.BindStateChangedList case INPUT_BOX_STYLE_CONNECT: case INPUT_BOX_STYLE_SINGLE: case INPUT_BOX_STYLE_UNDERLINE: - return getContentItemWidth() / TWO + index * getContentItemWidth() + index * mOtpItemSpacing - + (TWO * index + 1) * mOtpLineWidth; + return DecimalUtils.addFloat(DecimalUtils.addFloat( + DecimalUtils.addFloat(DecimalUtils.div(TWO, getContentItemWidth()), + DecimalUtils.mul(index, getContentItemWidth())), + DecimalUtils.mul(index, mOtpItemSpacing) + ), DecimalUtils.mul(DecimalUtils.add(1, DecimalUtils.mul(TWO, index)), mOtpLineWidth) + ); default: - return getContentItemWidth() / TWO + index * getContentItemWidth() + index * mDivisionLineSize - + mOtpLineWidth; + return DecimalUtils.addFloat(DecimalUtils.addFloat(DecimalUtils.div(TWO, + getContentItemWidth()), DecimalUtils.mul(index, getContentItemWidth())), + DecimalUtils.mul(index, mDivisionLineSize)); } } @@ -559,13 +548,14 @@ public class PinView extends TextField implements Component.BindStateChangedList String content = getText(); for (int ii = 0; ii < mOtpItemCount; ii++) { // 计算绘制下划线的startX - float startX = ii * getContentItemWidth() + ii * (mOtpItemSpacing + TWO * mOtpLineWidth); + float startX = DecimalUtils.addFloat(DecimalUtils.mul(ii, getContentItemWidth()), + DecimalUtils.mul(ii, DecimalUtils.addFloat(mOtpItemSpacing, DecimalUtils.mul(TWO, mOtpLineWidth)))); // stopX - float stopX = getContentItemWidth() + startX + mOtpLineWidth; + float stopX = DecimalUtils.add(DecimalUtils.add(getContentItemWidth(), startX), mOtpLineWidth); // 对于下划线这种样式,startY = stopY - float startY = getHeight() - mOtpLineWidth / TWO; + float startY = DecimalUtils.sub(DecimalUtils.div(TWO, mOtpLineWidth), getHeight()); // 这里判断是否设置有输入框获取焦点时,下划线的颜色 if (mUnderlineFocusColor != null) { @@ -588,13 +578,19 @@ public class PinView extends TextField implements Component.BindStateChangedList if (mOtpViewType == 1 && getText().length() != SIX) { jj = ii - 1; } - float left = jj * getContentItemWidth() + jj * mOtpItemSpacing + jj - * mOtpLineWidth * TWO + mOtpLineWidth / TWO; - float right = jj * mOtpItemSpacing + (jj + 1) * getContentItemWidth() - + (jj + 1) * TWO * mOtpLineWidth - mOtpLineWidth / TWO; + float left = DecimalUtils.addFloat(DecimalUtils.addFloat(DecimalUtils.addFloat(DecimalUtils.mul(jj, + getContentItemWidth()), DecimalUtils.mul(jj, mOtpItemSpacing)), + DecimalUtils.mul(DecimalUtils.mul(jj, mOtpLineWidth), TWO)), + DecimalUtils.div(TWO, mOtpLineWidth)); + + float right = DecimalUtils.sub(DecimalUtils.div(TWO, mOtpLineWidth), + DecimalUtils.addFloat(DecimalUtils.addFloat(DecimalUtils.mul(jj, mOtpItemSpacing), + DecimalUtils.mul(jj + 1, getContentItemWidth())), + DecimalUtils.mul(DecimalUtils.mul(jj + 1, TWO), mOtpLineWidth))); + LogUtil.d("drawUnderlineStyle---drawRoundRect()"); - mRectFloatSingleBox.modify(left, mOtpLineWidth / TWO, right, - getHeight() - mOtpLineWidth / TWO); + mRectFloatSingleBox.modify(left, DecimalUtils.div(TWO, mOtpLineWidth), right, + DecimalUtils.sub(DecimalUtils.div(TWO, mOtpLineWidth), getHeight())); // 如果没有焦点 if (!isFocused() && !Color.TRANSPARENT.equals(mBorderColorControlNoFocus)) { @@ -607,8 +603,11 @@ public class PinView extends TextField implements Component.BindStateChangedList if (!isFocused() && mBackgroudNoFocus.getValue() != Color.TRANSPARENT.getValue()) { mPaintUnderline.setColor(mBackgroudNoFocus); } - canvas.drawLine(new Point(startX + mOtpLineWidth / TWO, startY), new Point(stopX - + mOtpLineWidth / TWO, startY), mPaintUnderline); + + canvas.drawLine(new Point(DecimalUtils.addFloat(startX, DecimalUtils.div(TWO, mOtpLineWidth)), startY), + new Point(DecimalUtils.addFloat(stopX, + DecimalUtils.div(TWO, mOtpLineWidth)), startY), + mPaintUnderline); } } @@ -624,12 +623,18 @@ public class PinView extends TextField implements Component.BindStateChangedList } else { paint.setColor(mItemBackgroudNoFocus); } - float left = ii * getContentItemWidth() + ii * mOtpItemSpacing + ii * mOtpLineWidth - * TWO + mOtpLineWidth / TWO; - float right = ii * mOtpItemSpacing + (ii + 1) * getContentItemWidth() - + (ii + 1) * TWO * mOtpLineWidth - mOtpLineWidth / TWO; - mRectFloatSingleBox.modify(left, mOtpLineWidth / TWO, right, - getHeight() - mOtpLineWidth / TWO); + float left = DecimalUtils.addFloat(DecimalUtils.div(TWO, mOtpLineWidth), + DecimalUtils.addFloat(DecimalUtils.addFloat(DecimalUtils.mul(ii, getContentItemWidth()), + DecimalUtils.mul(ii, mOtpItemSpacing)), + DecimalUtils.mul(DecimalUtils.mul(ii, mOtpLineWidth), TWO))); + + float right = DecimalUtils.sub(DecimalUtils.div(TWO, mOtpLineWidth), + DecimalUtils.addFloat(DecimalUtils.addFloat(DecimalUtils.mul(ii, mOtpItemSpacing), + DecimalUtils.mul(ii + 1, getContentItemWidth())), + DecimalUtils.mul(DecimalUtils.mul(ii + 1, TWO), mOtpLineWidth))); + + mRectFloatSingleBox.modify(left, DecimalUtils.div(TWO, mOtpLineWidth), right, + DecimalUtils.sub(DecimalUtils.div(TWO, mOtpLineWidth), getHeight())); // 如果没有焦点 if (!isFocused() && mBackgroudNoFocus.getValue() != Color.TRANSPARENT.getValue()) { @@ -650,14 +655,20 @@ public class PinView extends TextField implements Component.BindStateChangedList private void drawSingleStyle(Canvas canvas) { for (int ii = 0; ii < mOtpItemCount; ii++) { mRectFloatSingleBox.clear(); - float left = ii * getContentItemWidth() + ii * mOtpItemSpacing + ii - * mOtpLineWidth * TWO + mOtpLineWidth / TWO; - float right = ii * mOtpItemSpacing + (ii + 1) * getContentItemWidth() - + (ii + 1) * TWO * mOtpLineWidth - mOtpLineWidth / TWO; + float left = DecimalUtils.addFloat(DecimalUtils.addFloat( + DecimalUtils.addFloat(DecimalUtils.mul(ii, getContentItemWidth()), + DecimalUtils.mul(ii, mOtpItemSpacing)), + DecimalUtils.mul(DecimalUtils.mul(ii, mOtpLineWidth), TWO)), + DecimalUtils.div(TWO, mOtpLineWidth)); + + float right = DecimalUtils.sub(DecimalUtils.div(TWO, mOtpLineWidth), + DecimalUtils.addFloat(DecimalUtils.addFloat(DecimalUtils.mul(ii, mOtpItemSpacing), + DecimalUtils.mul(ii + 1, getContentItemWidth())), + DecimalUtils.mul(DecimalUtils.mul(ii + 1, TWO), mOtpLineWidth))); // 为避免在onDraw里面创建RectF对象,这里使用rectF.set()方法 - mRectFloatSingleBox.modify(left, mOtpLineWidth / TWO, right, - getHeight() - mOtpLineWidth / TWO); + mRectFloatSingleBox.modify(left, DecimalUtils.div(TWO, mOtpLineWidth), right, + DecimalUtils.sub(DecimalUtils.div(TWO, mOtpLineWidth), getHeight())); LogUtil.d("drawSingleStyle---i=" + ii); canvas.drawRoundRect(mRectFloatSingleBox, mCornerSize, mCornerSize, mPaintBorder); } @@ -671,10 +682,10 @@ public class PinView extends TextField implements Component.BindStateChangedList // 需要减去边框的一半 mRectFloatConnect.modify( - mOtpLineWidth / TWO, - mOtpLineWidth / TWO, - getWidth() - mOtpLineWidth / TWO, - getHeight() - mOtpLineWidth / TWO + DecimalUtils.div(TWO, mOtpLineWidth), + DecimalUtils.div(TWO, mOtpLineWidth), + DecimalUtils.sub(DecimalUtils.div(TWO, mOtpLineWidth), getWidth()), + DecimalUtils.sub(DecimalUtils.div(TWO, mOtpLineWidth), getHeight()) ); canvas.drawRoundRect(mRectFloatConnect, mCornerSize, mCornerSize, mPaintBorder); @@ -683,11 +694,13 @@ public class PinView extends TextField implements Component.BindStateChangedList } private void drawDivisionLine(Canvas canvas) { - float stopY = getHeight() - mOtpLineWidth; + float stopY = DecimalUtils.sub(mOtpLineWidth, getHeight()); for (int ii = 0; ii < mOtpItemCount - 1; ii++) { // 对于分割线条,startX = stopX - float startX = (ii + 1) * getContentItemWidth() + ii * mDivisionLineSize - + mOtpLineWidth + mDivisionLineSize / TWO; + float startX = DecimalUtils.addFloat(DecimalUtils.addFloat(DecimalUtils.mul(ii + 1, + getContentItemWidth()), DecimalUtils.mul(ii, mDivisionLineSize)), + DecimalUtils.addFloat(mOtpLineWidth, DecimalUtils.div(TWO, mDivisionLineSize))); + canvas.drawLine(new Point(startX, mOtpLineWidth), new Point(startX, stopY), mPaintDivisionLine); } } @@ -706,10 +719,13 @@ public class PinView extends TextField implements Component.BindStateChangedList case INPUT_BOX_STYLE_CONNECT: // 单个输入框样式:宽度-间距宽度(字符数-1) * 每个间距宽度-每个输入框的左右边框宽度 - tempWidth = getWidth() - (mOtpItemCount - 1) * mOtpItemSpacing - TWO * mOtpItemCount * mOtpLineWidth; + tempWidth = DecimalUtils.sub(DecimalUtils.mul(DecimalUtils.mul(TWO, mOtpItemCount), mOtpLineWidth), + DecimalUtils.sub(DecimalUtils.mul(mOtpItemCount - 1, mOtpItemSpacing), getWidth())); break; default: - tempWidth = getWidth() - (mDivisionLineSize * (mOtpItemCount - 1)) - TWO * mOtpLineWidth; + + tempWidth = DecimalUtils.sub(DecimalUtils.mul(TWO, mOtpLineWidth), + DecimalUtils.sub(DecimalUtils.mul(mDivisionLineSize, mOtpItemCount - 1), getWidth())); break; } return tempWidth / mOtpItemCount; @@ -728,18 +744,20 @@ public class PinView extends TextField implements Component.BindStateChangedList case INPUT_BOX_STYLE_SINGLE: // 单个输入框样式:宽度-间距宽度(字符数-1) * 每个间距宽度-每个输入框的左右边框宽度 - tempWidth = measureWidth - (mOtpItemCount - 1) * mOtpItemSpacing - TWO * mOtpItemCount * mOtpLineWidth; + tempWidth = DecimalUtils.sub(DecimalUtils.mul(mOtpLineWidth, DecimalUtils.mul(TWO, mOtpItemCount)), + DecimalUtils.sub(DecimalUtils.mul(mOtpItemCount - 1, mOtpItemSpacing), measureWidth)); break; case INPUT_BOX_STYLE_UNDERLINE: // 下划线样式:宽度-间距宽度(字符数-1) * 每个间距宽度 - tempWidth = measureWidth - (mOtpItemCount - 1) * mOtpItemSpacing; + tempWidth = DecimalUtils.sub(DecimalUtils.mul(mOtpItemCount - 1, mOtpItemSpacing), measureWidth); break; case INPUT_BOX_STYLE_CONNECT: // 矩形输入框样式:宽度-左右两边框宽度-分割线宽度(字符数-1) * 每个分割线宽度 default: - tempWidth = measureWidth - (mDivisionLineSize * (mOtpItemCount - 1)) - TWO * mOtpLineWidth; + tempWidth = DecimalUtils.sub(DecimalUtils.mul(TWO, mOtpLineWidth), + DecimalUtils.sub(DecimalUtils.mul(mDivisionLineSize, mOtpItemCount - 1), measureWidth)); break; } return tempWidth / mOtpItemCount; @@ -748,14 +766,15 @@ public class PinView extends TextField implements Component.BindStateChangedList /** * 计算绘制文本的基线 * - * @param paint 绘制文字的画笔 + * @param paint 绘制文字的画笔 * @param halfHeight 高度的一半 * @return 文本的基线 */ private float getTextBaseline(Paint paint, float halfHeight) { Paint.FontMetrics fontMetrics = paint.getFontMetrics(); - float dy = (fontMetrics.bottom - fontMetrics.top) / TWO - fontMetrics.bottom; - return halfHeight + dy; + float dy = DecimalUtils.sub(fontMetrics.bottom, + DecimalUtils.div(TWO, DecimalUtils.sub(fontMetrics.top, fontMetrics.bottom))); + return DecimalUtils.addFloat(halfHeight, dy); } /** @@ -830,24 +849,6 @@ public class PinView extends TextField implements Component.BindStateChangedList return mInputBoxStyle; } - /** - * 光标Runnable通过Runnable每500ms执行重绘,每次runnable通过改变画笔的alpha值来使光标产生闪烁的效果 - * - * @since 2021-04-26 - */ - private class CursorRunnable implements Runnable { - @Override - public void run() { - // 获取光标画笔的alpha值 - float alpha = mPaintCursor.getAlpha(); - - // 设置光标画笔的alpha值 - // 设置光标画笔的alpha值 - invalidate(); - mContext.getUITaskDispatcher().delayDispatch(this, mCursorDuration); - } - } - /** * 动画 * -- Gitee