From bbf689fe9f644e1d8a15c8a3ae4cf1caa126921b Mon Sep 17 00:00:00 2001 From: xiaowusky Date: Thu, 23 Nov 2023 16:21:25 +0800 Subject: [PATCH] =?UTF-8?q?desc:=E8=AF=BB=E5=8F=96=E4=BC=A0=E6=84=9F?= =?UTF-8?q?=E5=99=A8=E6=95=B0=E6=8D=AE=E5=BE=88=E9=A2=91=E7=B9=81=EF=BC=8C?= =?UTF-8?q?=E5=9C=A8=E5=90=8E=E7=BB=AD=E5=A4=84=E7=90=86=E8=BF=87=E7=A8=8B?= =?UTF-8?q?=E4=B8=AD=EF=BC=8C=E4=B8=8D=E8=83=BD=E9=9A=8F=E4=BE=BFnew?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=EF=BC=8C=E4=BC=9A=E5=BD=B1=E5=93=8D=E8=A7=86?= =?UTF-8?q?=E9=A2=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../safetywatcher/watcher/port/ParseHelper.kt | 33 +++++---------- .../main/java/org/easydarwin/TxtOverlay.kt | 18 +++++---- .../java/org/easydarwin/util/YUVUtils.java | 40 ++++++++----------- 3 files changed, 38 insertions(+), 53 deletions(-) diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/port/ParseHelper.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/port/ParseHelper.kt index 11c36d6..be7b98a 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/port/ParseHelper.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/port/ParseHelper.kt @@ -122,40 +122,29 @@ object ParseHelper { insertGasData(type, value, localGasUnit, overRange) } + private val overlayBuilder: StringBuilder = java.lang.StringBuilder() private fun setOverlayData() { - val builder: StringBuilder = java.lang.StringBuilder() + overlayBuilder.clear() gasMap.forEach { item -> val gas = item.value val time = gas.time // 3S内的数据我们认为有效 if (System.currentTimeMillis() - time <= 3000) { - builder.append("${gas.gasName}: ${gas.gasValue} ${gas.unit}").append("@") + overlayBuilder.append("${gas.gasName}: ${gas.gasValue} ${gas.unit}").append("@") } } -// val valueCo = gasMap[CO] -// val valueCH4 = gasMap[CH4] -// val valueO2 = gasMap[O2] -// val valueH2S = gasMap[H2S] -// -// valueCo?.let { -// builder.append(CO).append(valueCo).append("@") -// } -// valueCH4?.let { -// builder.append(CH4).append(valueCH4).append("@") -// } -// valueO2?.let { -// builder.append(O2).append(valueO2).append("@") -// } -// valueH2S?.let { -// builder.append(H2S).append(valueH2S) -// } - TxtOverlay.setShowTip(builder.toString()) + TxtOverlay.setShowTip(overlayBuilder.toString()) } /** * 插入气体数据 */ - private fun insertGasData(typeEnum: GasTypeEnum, value: Float, unit: String, overRange: Boolean) { + private fun insertGasData( + typeEnum: GasTypeEnum, + value: Float, + unit: String, + overRange: Boolean + ) { GlobalScope.launch(Dispatchers.IO) { // 阈值范围 val min = getGasLowThreshold(typeEnum.desc, unit) @@ -264,7 +253,7 @@ object ParseHelper { */ @OptIn(DelicateCoroutinesApi::class) private fun updateGasTypeDb(type: GasTypeEnum, sensorIndex: Int, status: Int) { - GlobalScope.launch { + GlobalScope.launch(Dispatchers.IO) { val typeDao = DBUtils.gasTypeDao() val gasType = typeDao.getByName(type.desc) GasCache.setStatus(type.desc, getShowStatus(CommonApplication.getContext(), status)) diff --git a/library-push/src/main/java/org/easydarwin/TxtOverlay.kt b/library-push/src/main/java/org/easydarwin/TxtOverlay.kt index c25d42c..fcca82c 100644 --- a/library-push/src/main/java/org/easydarwin/TxtOverlay.kt +++ b/library-push/src/main/java/org/easydarwin/TxtOverlay.kt @@ -29,10 +29,13 @@ object TxtOverlay { // 上一次展示的时间 private var lastTipUpdateTime: Long = 0 + private const val bmpWidth: Int = 500 + private const val bmpHeight: Int = 300 + // 文字生成的bitmap - private var bmp: Bitmap? = null + private var bmp: Bitmap? = Bitmap.createBitmap(bmpWidth, bmpHeight, Bitmap.Config.ARGB_8888); - private var yuv : ByteArray?= null + private var yuv: ByteArray? = null // 时间格式化字符串 private val dateFormat = SimpleDateFormat("yy-MM-dd HH:mm:ss") @@ -47,14 +50,13 @@ object TxtOverlay { // 记录更新时间和上一次的文字 lastTipUpdateTime = currentTimeMillis mLastShowTip = mToDoShowTip -// // 回收内存 -// bmp?.recycle() // 文字转bitmap - bmp = YUVUtils.generateBitmap( - dateFormat.format(lastTipUpdateTime) + "@" + mToDoShowTip, 40, Color.WHITE + YUVUtils.generateBitmap( + bmp, + dateFormat.format(lastTipUpdateTime) + "@" + mToDoShowTip, + 40, + Color.WHITE ) - // 缩放旋转bitmap -// bmp = YUVUtils.rotateImage(bmp, 0); yuv = YUVUtils.getYUVByBitmap(bmp) } } diff --git a/library-push/src/main/java/org/easydarwin/util/YUVUtils.java b/library-push/src/main/java/org/easydarwin/util/YUVUtils.java index c61cd16..14e62fd 100644 --- a/library-push/src/main/java/org/easydarwin/util/YUVUtils.java +++ b/library-push/src/main/java/org/easydarwin/util/YUVUtils.java @@ -2,8 +2,10 @@ package org.easydarwin.util; import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; +import android.graphics.PorterDuff; import android.text.TextPaint; public class YUVUtils { @@ -45,6 +47,8 @@ public class YUVUtils { return newbm; } + private static int[] pixels = null; + //图片转YUV public static byte[] getYUVByBitmap(Bitmap bitmap) { if (bitmap == null) { @@ -55,18 +59,23 @@ public class YUVUtils { int height = bitmap.getHeight() / 2 * 2; int size = width * height; - - int pixels[] = new int[size]; + if (pixels == null) { + pixels = new int[size]; + } bitmap.getPixels(pixels, 0, width, 0, 0, width, height); byte[] data = rgb2YCbCr420(pixels, width, height); return data; } + private static byte[] yuv = null; + public static byte[] rgb2YCbCr420(int[] pixels, int width, int height) { int len = width * height; //yuv格式数组大小,y亮度占len长度,u,v各占len/4长度。 - byte[] yuv = new byte[len * 3 / 2]; + if (yuv == null) { + yuv = new byte[len * 3 / 2]; + } int y, u, v; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { @@ -93,38 +102,23 @@ public class YUVUtils { return yuv; } - public static Bitmap generateBitmap(String text, int textSizePx, int textColor) { + public static void generateBitmap(Bitmap bmp, String text, int textSizePx, int textColor) { TextPaint textPaint = new TextPaint(); textPaint.setTextSize(textSizePx); textPaint.setColor(textColor); Paint.FontMetrics fontMetrics = textPaint.getFontMetrics(); int lineHeight = (int) Math.ceil(Math.abs(fontMetrics.bottom) + Math.abs(fontMetrics.top)); - Bitmap bitmap = null; if (text.contains("@")) { String[] split = text.split("@"); - int width = 0; - for (int i = 0; i < split.length; i++) { - width = Math.max(width, (int) Math.ceil(textPaint.measureText(split[i]))); - } - int height = lineHeight * split.length; - // 宽高向上取偶数 - width = (width + 1) / 2 * 2; - height = (height + 1) / 2 * 2; - bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(bitmap); + Canvas canvas = new Canvas(bmp); + canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); for (int i = 0; i < split.length; i++) { canvas.drawText(split[i], 0, Math.abs(fontMetrics.ascent) + lineHeight * i, textPaint); } } else { - int width = (int) Math.ceil(textPaint.measureText(text)); - int height = lineHeight; - // 宽高向上取偶数 - width = (width + 1) / 2 * 2; - height = (height + 1) / 2 * 2; - bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(bitmap); + Canvas canvas = new Canvas(bmp); + canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); canvas.drawText(text, 0, Math.abs(fontMetrics.ascent), textPaint); } - return bitmap; } }