desc:读取传感器数据很频繁,在后续处理过程中,不能随便new对象,会影响视频

main
xiaowusky 1 year ago
parent 34c87fd55b
commit bbf689fe9f

@ -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))

@ -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)
}
}

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

Loading…
Cancel
Save