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; } }