diff --git a/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt b/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt index 85cb963..b49c20f 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt @@ -46,4 +46,19 @@ this[3].toInt() } return (x * 65536 + y * 256 + z).toLong() +} + +fun ByteArray.handleCpuTemperature(): Float { + //[1, -128, 24] + val x = if (this[0] < 0) { + this[0].toInt() and 0xFF + } else { + this[0].toInt() + } + val y = if (this[1] < 0) { + this[1].toInt() and 0xFF + } else { + this[1].toInt() + } + return (x * 256 + y) / 10f } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt b/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt index 85cb963..b49c20f 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt @@ -46,4 +46,19 @@ this[3].toInt() } return (x * 65536 + y * 256 + z).toLong() +} + +fun ByteArray.handleCpuTemperature(): Float { + //[1, -128, 24] + val x = if (this[0] < 0) { + this[0].toInt() and 0xFF + } else { + this[0].toInt() + } + val y = if (this[1] < 0) { + this[1].toInt() and 0xFF + } else { + this[1].toInt() + } + return (x * 256 + y) / 10f } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt index 039a116..aa1d4d7 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt @@ -6,6 +6,7 @@ import android.os.IBinder import android.os.Message import android.util.Log +import com.casic.app.safetreecontroller.extensions.handleCpuTemperature import com.casic.app.safetreecontroller.extensions.handleGasConcentration import com.casic.app.safetreecontroller.extensions.toAsciiCode import com.casic.app.safetreecontroller.extensions.toHex @@ -324,12 +325,11 @@ "CC" -> { //激光温度 val dataArray = bytes.copyOfRange(10, bytes.size) - val temperature = (dataArray[0] * 256 + dataArray[1]) / 10f val weakReferenceHandler = MethaneMonitorFragment.weakReferenceHandler ?: return val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.QUERY_CPU_TEMPERATURE_RESPONSE_CODE - message.obj = temperature + message.obj = dataArray.handleCpuTemperature() weakReferenceHandler.sendMessage(message) } } diff --git a/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt b/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt index 85cb963..b49c20f 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt @@ -46,4 +46,19 @@ this[3].toInt() } return (x * 65536 + y * 256 + z).toLong() +} + +fun ByteArray.handleCpuTemperature(): Float { + //[1, -128, 24] + val x = if (this[0] < 0) { + this[0].toInt() and 0xFF + } else { + this[0].toInt() + } + val y = if (this[1] < 0) { + this[1].toInt() and 0xFF + } else { + this[1].toInt() + } + return (x * 256 + y) / 10f } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt index 039a116..aa1d4d7 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt @@ -6,6 +6,7 @@ import android.os.IBinder import android.os.Message import android.util.Log +import com.casic.app.safetreecontroller.extensions.handleCpuTemperature import com.casic.app.safetreecontroller.extensions.handleGasConcentration import com.casic.app.safetreecontroller.extensions.toAsciiCode import com.casic.app.safetreecontroller.extensions.toHex @@ -324,12 +325,11 @@ "CC" -> { //激光温度 val dataArray = bytes.copyOfRange(10, bytes.size) - val temperature = (dataArray[0] * 256 + dataArray[1]) / 10f val weakReferenceHandler = MethaneMonitorFragment.weakReferenceHandler ?: return val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.QUERY_CPU_TEMPERATURE_RESPONSE_CODE - message.obj = temperature + message.obj = dataArray.handleCpuTemperature() weakReferenceHandler.sendMessage(message) } } diff --git a/app/src/main/java/com/casic/app/safetreecontroller/widgets/LineChartMarkerView.kt b/app/src/main/java/com/casic/app/safetreecontroller/widgets/LineChartMarkerView.kt index 6ac70d6..50d1040 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/widgets/LineChartMarkerView.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/widgets/LineChartMarkerView.kt @@ -2,6 +2,8 @@ import android.content.Context import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Path import android.widget.TextView import androidx.core.graphics.drawable.toBitmap import com.casic.app.safetreecontroller.R @@ -9,7 +11,10 @@ import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.highlight.Highlight import com.github.mikephil.charting.utils.MPPointF +import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.convertDrawable +import com.pengxh.kt.lite.extensions.dp2px + class LineChartMarkerView(context: Context) : MarkerView(context, R.layout.popu_line_chart_marker) { @@ -17,6 +22,16 @@ private val valueView: TextView = findViewById(R.id.valueView) private var xAxisDate = ArrayList() private val dotBitmap = R.drawable.ic_chart_dot.convertDrawable(context)!!.toBitmap() + private var arrowPaint = Paint() + private val arrowHeight = 10.dp2px(context) // 箭头的高度 + private val arrowWidth = 15.dp2px(context) // 箭头的宽度 + private val arrowOffset = 2f.dp2px(context) //箭头偏移量 + + init { + arrowPaint.style = Paint.Style.FILL + arrowPaint.isAntiAlias = true + arrowPaint.color = R.color.mainThemeColor.convertColor(context) + } fun setXAxisDate(date: ArrayList) { this.xAxisDate = date @@ -34,7 +49,7 @@ } override fun getOffset(): MPPointF { - return MPPointF((-(width shr 1)).toFloat(), (-height).toFloat()) + return MPPointF((-(width shr 1)).toFloat(), -height.toFloat()) } /** @@ -51,7 +66,92 @@ canvas.drawBitmap(dotBitmap, -dotBitmap.width / 2f, -dotBitmap.height / 2f, null) + drawArrow(canvas, posX, posY) + draw(canvas) canvas.restoreToCount(saveId) } + + private fun drawArrow(canvas: Canvas, posX: Float, posY: Float) { + val path = Path() + if (posY < height + arrowHeight + dotBitmap.height / 2f) { + //处理超过上边界 + canvas.translate(0f, height + arrowHeight + dotBitmap.height / 2f) + if (posX > chartView.width - (width / 2f)) { + //超过右边界 + canvas.translate(-(width / 2 - (chartView.width - posX)), 0f) + path.moveTo( + width / 2 - (chartView.width - posX) - arrowOffset, + -(height + arrowHeight + arrowOffset) + ) + path.lineTo(arrowWidth / 2f, -height.toFloat()) + path.lineTo(-arrowWidth / 2f, -height.toFloat()) + path.moveTo( + width / 2 - (chartView.width - posX) - arrowOffset, + -(height + arrowHeight + arrowOffset) + ) + } else { + if (posX > width / 2f) { + //在图表中间 + path.moveTo(0f, -(height + arrowHeight).toFloat()) + path.lineTo(arrowWidth / 2f, -height.toFloat()) + path.lineTo(-arrowWidth / 2f, -height.toFloat()) + path.lineTo(0f, -(height + arrowHeight).toFloat()) + } else { + //超过左边界 + canvas.translate(width / 2f - posX, 0f) + path.moveTo( + -(width / 2f - posX) - arrowOffset, + -(height + arrowHeight + arrowOffset) + ) + path.lineTo(arrowWidth / 2f, -height.toFloat()) + path.lineTo(-arrowWidth / 2f, -height.toFloat()) + path.moveTo( + -(width / 2f - posX) - arrowOffset, + -(height + arrowHeight + arrowOffset) + ) + } + } + canvas.drawPath(path, arrowPaint) + canvas.translate(-width / 2f, -height.toFloat()) + } else { + canvas.translate(0f, -height - arrowHeight - dotBitmap.height / 2f) + if (posX < width / 2f) { + //超过左边界 + canvas.translate(width / 2f - posX, 0f) + path.moveTo( + -(width / 2f - posX) + arrowOffset, + height + arrowHeight + arrowOffset + ) + path.lineTo(arrowWidth / 2f, height.toFloat()) + path.lineTo(-arrowWidth / 2f, height.toFloat()) + path.moveTo( + -(width / 2f - posX) + arrowOffset, + height + arrowHeight + arrowOffset + ) + } else { + if (posX > chartView.width - (width / 2f)) { + //超过右边界 + canvas.translate(-(width / 2 - (chartView.width - posX)), 0f) + path.moveTo( + width / 2 - (chartView.width - posX) + arrowOffset, + height + arrowHeight + arrowOffset + ) + path.lineTo(arrowWidth / 2f, height.toFloat()) + path.lineTo(-arrowWidth / 2f, height.toFloat()) + path.moveTo( + width / 2 - (chartView.width - posX) + arrowOffset, + height + arrowHeight + arrowOffset + ) + } else { + path.moveTo(0f, (height + arrowHeight).toFloat()) + path.lineTo(arrowWidth / 2f, height.toFloat()) + path.lineTo(-arrowWidth / 2f, height.toFloat()) + path.moveTo(0f, (height + arrowHeight).toFloat()) + } + } + canvas.drawPath(path, arrowPaint) + canvas.translate(-width / 2f, 0f) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt b/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt index 85cb963..b49c20f 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt @@ -46,4 +46,19 @@ this[3].toInt() } return (x * 65536 + y * 256 + z).toLong() +} + +fun ByteArray.handleCpuTemperature(): Float { + //[1, -128, 24] + val x = if (this[0] < 0) { + this[0].toInt() and 0xFF + } else { + this[0].toInt() + } + val y = if (this[1] < 0) { + this[1].toInt() and 0xFF + } else { + this[1].toInt() + } + return (x * 256 + y) / 10f } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt index 039a116..aa1d4d7 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt @@ -6,6 +6,7 @@ import android.os.IBinder import android.os.Message import android.util.Log +import com.casic.app.safetreecontroller.extensions.handleCpuTemperature import com.casic.app.safetreecontroller.extensions.handleGasConcentration import com.casic.app.safetreecontroller.extensions.toAsciiCode import com.casic.app.safetreecontroller.extensions.toHex @@ -324,12 +325,11 @@ "CC" -> { //激光温度 val dataArray = bytes.copyOfRange(10, bytes.size) - val temperature = (dataArray[0] * 256 + dataArray[1]) / 10f val weakReferenceHandler = MethaneMonitorFragment.weakReferenceHandler ?: return val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.QUERY_CPU_TEMPERATURE_RESPONSE_CODE - message.obj = temperature + message.obj = dataArray.handleCpuTemperature() weakReferenceHandler.sendMessage(message) } } diff --git a/app/src/main/java/com/casic/app/safetreecontroller/widgets/LineChartMarkerView.kt b/app/src/main/java/com/casic/app/safetreecontroller/widgets/LineChartMarkerView.kt index 6ac70d6..50d1040 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/widgets/LineChartMarkerView.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/widgets/LineChartMarkerView.kt @@ -2,6 +2,8 @@ import android.content.Context import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Path import android.widget.TextView import androidx.core.graphics.drawable.toBitmap import com.casic.app.safetreecontroller.R @@ -9,7 +11,10 @@ import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.highlight.Highlight import com.github.mikephil.charting.utils.MPPointF +import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.convertDrawable +import com.pengxh.kt.lite.extensions.dp2px + class LineChartMarkerView(context: Context) : MarkerView(context, R.layout.popu_line_chart_marker) { @@ -17,6 +22,16 @@ private val valueView: TextView = findViewById(R.id.valueView) private var xAxisDate = ArrayList() private val dotBitmap = R.drawable.ic_chart_dot.convertDrawable(context)!!.toBitmap() + private var arrowPaint = Paint() + private val arrowHeight = 10.dp2px(context) // 箭头的高度 + private val arrowWidth = 15.dp2px(context) // 箭头的宽度 + private val arrowOffset = 2f.dp2px(context) //箭头偏移量 + + init { + arrowPaint.style = Paint.Style.FILL + arrowPaint.isAntiAlias = true + arrowPaint.color = R.color.mainThemeColor.convertColor(context) + } fun setXAxisDate(date: ArrayList) { this.xAxisDate = date @@ -34,7 +49,7 @@ } override fun getOffset(): MPPointF { - return MPPointF((-(width shr 1)).toFloat(), (-height).toFloat()) + return MPPointF((-(width shr 1)).toFloat(), -height.toFloat()) } /** @@ -51,7 +66,92 @@ canvas.drawBitmap(dotBitmap, -dotBitmap.width / 2f, -dotBitmap.height / 2f, null) + drawArrow(canvas, posX, posY) + draw(canvas) canvas.restoreToCount(saveId) } + + private fun drawArrow(canvas: Canvas, posX: Float, posY: Float) { + val path = Path() + if (posY < height + arrowHeight + dotBitmap.height / 2f) { + //处理超过上边界 + canvas.translate(0f, height + arrowHeight + dotBitmap.height / 2f) + if (posX > chartView.width - (width / 2f)) { + //超过右边界 + canvas.translate(-(width / 2 - (chartView.width - posX)), 0f) + path.moveTo( + width / 2 - (chartView.width - posX) - arrowOffset, + -(height + arrowHeight + arrowOffset) + ) + path.lineTo(arrowWidth / 2f, -height.toFloat()) + path.lineTo(-arrowWidth / 2f, -height.toFloat()) + path.moveTo( + width / 2 - (chartView.width - posX) - arrowOffset, + -(height + arrowHeight + arrowOffset) + ) + } else { + if (posX > width / 2f) { + //在图表中间 + path.moveTo(0f, -(height + arrowHeight).toFloat()) + path.lineTo(arrowWidth / 2f, -height.toFloat()) + path.lineTo(-arrowWidth / 2f, -height.toFloat()) + path.lineTo(0f, -(height + arrowHeight).toFloat()) + } else { + //超过左边界 + canvas.translate(width / 2f - posX, 0f) + path.moveTo( + -(width / 2f - posX) - arrowOffset, + -(height + arrowHeight + arrowOffset) + ) + path.lineTo(arrowWidth / 2f, -height.toFloat()) + path.lineTo(-arrowWidth / 2f, -height.toFloat()) + path.moveTo( + -(width / 2f - posX) - arrowOffset, + -(height + arrowHeight + arrowOffset) + ) + } + } + canvas.drawPath(path, arrowPaint) + canvas.translate(-width / 2f, -height.toFloat()) + } else { + canvas.translate(0f, -height - arrowHeight - dotBitmap.height / 2f) + if (posX < width / 2f) { + //超过左边界 + canvas.translate(width / 2f - posX, 0f) + path.moveTo( + -(width / 2f - posX) + arrowOffset, + height + arrowHeight + arrowOffset + ) + path.lineTo(arrowWidth / 2f, height.toFloat()) + path.lineTo(-arrowWidth / 2f, height.toFloat()) + path.moveTo( + -(width / 2f - posX) + arrowOffset, + height + arrowHeight + arrowOffset + ) + } else { + if (posX > chartView.width - (width / 2f)) { + //超过右边界 + canvas.translate(-(width / 2 - (chartView.width - posX)), 0f) + path.moveTo( + width / 2 - (chartView.width - posX) + arrowOffset, + height + arrowHeight + arrowOffset + ) + path.lineTo(arrowWidth / 2f, height.toFloat()) + path.lineTo(-arrowWidth / 2f, height.toFloat()) + path.moveTo( + width / 2 - (chartView.width - posX) + arrowOffset, + height + arrowHeight + arrowOffset + ) + } else { + path.moveTo(0f, (height + arrowHeight).toFloat()) + path.lineTo(arrowWidth / 2f, height.toFloat()) + path.lineTo(-arrowWidth / 2f, height.toFloat()) + path.moveTo(0f, (height + arrowHeight).toFloat()) + } + } + canvas.drawPath(path, arrowPaint) + canvas.translate(-width / 2f, 0f) + } + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_blue_3.xml b/app/src/main/res/drawable/bg_solid_layout_blue_3.xml new file mode 100644 index 0000000..3b277e8 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_blue_3.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt b/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt index 85cb963..b49c20f 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt @@ -46,4 +46,19 @@ this[3].toInt() } return (x * 65536 + y * 256 + z).toLong() +} + +fun ByteArray.handleCpuTemperature(): Float { + //[1, -128, 24] + val x = if (this[0] < 0) { + this[0].toInt() and 0xFF + } else { + this[0].toInt() + } + val y = if (this[1] < 0) { + this[1].toInt() and 0xFF + } else { + this[1].toInt() + } + return (x * 256 + y) / 10f } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt index 039a116..aa1d4d7 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt @@ -6,6 +6,7 @@ import android.os.IBinder import android.os.Message import android.util.Log +import com.casic.app.safetreecontroller.extensions.handleCpuTemperature import com.casic.app.safetreecontroller.extensions.handleGasConcentration import com.casic.app.safetreecontroller.extensions.toAsciiCode import com.casic.app.safetreecontroller.extensions.toHex @@ -324,12 +325,11 @@ "CC" -> { //激光温度 val dataArray = bytes.copyOfRange(10, bytes.size) - val temperature = (dataArray[0] * 256 + dataArray[1]) / 10f val weakReferenceHandler = MethaneMonitorFragment.weakReferenceHandler ?: return val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.QUERY_CPU_TEMPERATURE_RESPONSE_CODE - message.obj = temperature + message.obj = dataArray.handleCpuTemperature() weakReferenceHandler.sendMessage(message) } } diff --git a/app/src/main/java/com/casic/app/safetreecontroller/widgets/LineChartMarkerView.kt b/app/src/main/java/com/casic/app/safetreecontroller/widgets/LineChartMarkerView.kt index 6ac70d6..50d1040 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/widgets/LineChartMarkerView.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/widgets/LineChartMarkerView.kt @@ -2,6 +2,8 @@ import android.content.Context import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Path import android.widget.TextView import androidx.core.graphics.drawable.toBitmap import com.casic.app.safetreecontroller.R @@ -9,7 +11,10 @@ import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.highlight.Highlight import com.github.mikephil.charting.utils.MPPointF +import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.convertDrawable +import com.pengxh.kt.lite.extensions.dp2px + class LineChartMarkerView(context: Context) : MarkerView(context, R.layout.popu_line_chart_marker) { @@ -17,6 +22,16 @@ private val valueView: TextView = findViewById(R.id.valueView) private var xAxisDate = ArrayList() private val dotBitmap = R.drawable.ic_chart_dot.convertDrawable(context)!!.toBitmap() + private var arrowPaint = Paint() + private val arrowHeight = 10.dp2px(context) // 箭头的高度 + private val arrowWidth = 15.dp2px(context) // 箭头的宽度 + private val arrowOffset = 2f.dp2px(context) //箭头偏移量 + + init { + arrowPaint.style = Paint.Style.FILL + arrowPaint.isAntiAlias = true + arrowPaint.color = R.color.mainThemeColor.convertColor(context) + } fun setXAxisDate(date: ArrayList) { this.xAxisDate = date @@ -34,7 +49,7 @@ } override fun getOffset(): MPPointF { - return MPPointF((-(width shr 1)).toFloat(), (-height).toFloat()) + return MPPointF((-(width shr 1)).toFloat(), -height.toFloat()) } /** @@ -51,7 +66,92 @@ canvas.drawBitmap(dotBitmap, -dotBitmap.width / 2f, -dotBitmap.height / 2f, null) + drawArrow(canvas, posX, posY) + draw(canvas) canvas.restoreToCount(saveId) } + + private fun drawArrow(canvas: Canvas, posX: Float, posY: Float) { + val path = Path() + if (posY < height + arrowHeight + dotBitmap.height / 2f) { + //处理超过上边界 + canvas.translate(0f, height + arrowHeight + dotBitmap.height / 2f) + if (posX > chartView.width - (width / 2f)) { + //超过右边界 + canvas.translate(-(width / 2 - (chartView.width - posX)), 0f) + path.moveTo( + width / 2 - (chartView.width - posX) - arrowOffset, + -(height + arrowHeight + arrowOffset) + ) + path.lineTo(arrowWidth / 2f, -height.toFloat()) + path.lineTo(-arrowWidth / 2f, -height.toFloat()) + path.moveTo( + width / 2 - (chartView.width - posX) - arrowOffset, + -(height + arrowHeight + arrowOffset) + ) + } else { + if (posX > width / 2f) { + //在图表中间 + path.moveTo(0f, -(height + arrowHeight).toFloat()) + path.lineTo(arrowWidth / 2f, -height.toFloat()) + path.lineTo(-arrowWidth / 2f, -height.toFloat()) + path.lineTo(0f, -(height + arrowHeight).toFloat()) + } else { + //超过左边界 + canvas.translate(width / 2f - posX, 0f) + path.moveTo( + -(width / 2f - posX) - arrowOffset, + -(height + arrowHeight + arrowOffset) + ) + path.lineTo(arrowWidth / 2f, -height.toFloat()) + path.lineTo(-arrowWidth / 2f, -height.toFloat()) + path.moveTo( + -(width / 2f - posX) - arrowOffset, + -(height + arrowHeight + arrowOffset) + ) + } + } + canvas.drawPath(path, arrowPaint) + canvas.translate(-width / 2f, -height.toFloat()) + } else { + canvas.translate(0f, -height - arrowHeight - dotBitmap.height / 2f) + if (posX < width / 2f) { + //超过左边界 + canvas.translate(width / 2f - posX, 0f) + path.moveTo( + -(width / 2f - posX) + arrowOffset, + height + arrowHeight + arrowOffset + ) + path.lineTo(arrowWidth / 2f, height.toFloat()) + path.lineTo(-arrowWidth / 2f, height.toFloat()) + path.moveTo( + -(width / 2f - posX) + arrowOffset, + height + arrowHeight + arrowOffset + ) + } else { + if (posX > chartView.width - (width / 2f)) { + //超过右边界 + canvas.translate(-(width / 2 - (chartView.width - posX)), 0f) + path.moveTo( + width / 2 - (chartView.width - posX) + arrowOffset, + height + arrowHeight + arrowOffset + ) + path.lineTo(arrowWidth / 2f, height.toFloat()) + path.lineTo(-arrowWidth / 2f, height.toFloat()) + path.moveTo( + width / 2 - (chartView.width - posX) + arrowOffset, + height + arrowHeight + arrowOffset + ) + } else { + path.moveTo(0f, (height + arrowHeight).toFloat()) + path.lineTo(arrowWidth / 2f, height.toFloat()) + path.lineTo(-arrowWidth / 2f, height.toFloat()) + path.moveTo(0f, (height + arrowHeight).toFloat()) + } + } + canvas.drawPath(path, arrowPaint) + canvas.translate(-width / 2f, 0f) + } + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_blue_3.xml b/app/src/main/res/drawable/bg_solid_layout_blue_3.xml new file mode 100644 index 0000000..3b277e8 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_blue_3.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_layout_blue_5.xml b/app/src/main/res/drawable/bg_stroke_layout_blue_5.xml deleted file mode 100644 index 5efd97f..0000000 --- a/app/src/main/res/drawable/bg_stroke_layout_blue_5.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt b/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt index 85cb963..b49c20f 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt @@ -46,4 +46,19 @@ this[3].toInt() } return (x * 65536 + y * 256 + z).toLong() +} + +fun ByteArray.handleCpuTemperature(): Float { + //[1, -128, 24] + val x = if (this[0] < 0) { + this[0].toInt() and 0xFF + } else { + this[0].toInt() + } + val y = if (this[1] < 0) { + this[1].toInt() and 0xFF + } else { + this[1].toInt() + } + return (x * 256 + y) / 10f } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt index 039a116..aa1d4d7 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt @@ -6,6 +6,7 @@ import android.os.IBinder import android.os.Message import android.util.Log +import com.casic.app.safetreecontroller.extensions.handleCpuTemperature import com.casic.app.safetreecontroller.extensions.handleGasConcentration import com.casic.app.safetreecontroller.extensions.toAsciiCode import com.casic.app.safetreecontroller.extensions.toHex @@ -324,12 +325,11 @@ "CC" -> { //激光温度 val dataArray = bytes.copyOfRange(10, bytes.size) - val temperature = (dataArray[0] * 256 + dataArray[1]) / 10f val weakReferenceHandler = MethaneMonitorFragment.weakReferenceHandler ?: return val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.QUERY_CPU_TEMPERATURE_RESPONSE_CODE - message.obj = temperature + message.obj = dataArray.handleCpuTemperature() weakReferenceHandler.sendMessage(message) } } diff --git a/app/src/main/java/com/casic/app/safetreecontroller/widgets/LineChartMarkerView.kt b/app/src/main/java/com/casic/app/safetreecontroller/widgets/LineChartMarkerView.kt index 6ac70d6..50d1040 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/widgets/LineChartMarkerView.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/widgets/LineChartMarkerView.kt @@ -2,6 +2,8 @@ import android.content.Context import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Path import android.widget.TextView import androidx.core.graphics.drawable.toBitmap import com.casic.app.safetreecontroller.R @@ -9,7 +11,10 @@ import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.highlight.Highlight import com.github.mikephil.charting.utils.MPPointF +import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.convertDrawable +import com.pengxh.kt.lite.extensions.dp2px + class LineChartMarkerView(context: Context) : MarkerView(context, R.layout.popu_line_chart_marker) { @@ -17,6 +22,16 @@ private val valueView: TextView = findViewById(R.id.valueView) private var xAxisDate = ArrayList() private val dotBitmap = R.drawable.ic_chart_dot.convertDrawable(context)!!.toBitmap() + private var arrowPaint = Paint() + private val arrowHeight = 10.dp2px(context) // 箭头的高度 + private val arrowWidth = 15.dp2px(context) // 箭头的宽度 + private val arrowOffset = 2f.dp2px(context) //箭头偏移量 + + init { + arrowPaint.style = Paint.Style.FILL + arrowPaint.isAntiAlias = true + arrowPaint.color = R.color.mainThemeColor.convertColor(context) + } fun setXAxisDate(date: ArrayList) { this.xAxisDate = date @@ -34,7 +49,7 @@ } override fun getOffset(): MPPointF { - return MPPointF((-(width shr 1)).toFloat(), (-height).toFloat()) + return MPPointF((-(width shr 1)).toFloat(), -height.toFloat()) } /** @@ -51,7 +66,92 @@ canvas.drawBitmap(dotBitmap, -dotBitmap.width / 2f, -dotBitmap.height / 2f, null) + drawArrow(canvas, posX, posY) + draw(canvas) canvas.restoreToCount(saveId) } + + private fun drawArrow(canvas: Canvas, posX: Float, posY: Float) { + val path = Path() + if (posY < height + arrowHeight + dotBitmap.height / 2f) { + //处理超过上边界 + canvas.translate(0f, height + arrowHeight + dotBitmap.height / 2f) + if (posX > chartView.width - (width / 2f)) { + //超过右边界 + canvas.translate(-(width / 2 - (chartView.width - posX)), 0f) + path.moveTo( + width / 2 - (chartView.width - posX) - arrowOffset, + -(height + arrowHeight + arrowOffset) + ) + path.lineTo(arrowWidth / 2f, -height.toFloat()) + path.lineTo(-arrowWidth / 2f, -height.toFloat()) + path.moveTo( + width / 2 - (chartView.width - posX) - arrowOffset, + -(height + arrowHeight + arrowOffset) + ) + } else { + if (posX > width / 2f) { + //在图表中间 + path.moveTo(0f, -(height + arrowHeight).toFloat()) + path.lineTo(arrowWidth / 2f, -height.toFloat()) + path.lineTo(-arrowWidth / 2f, -height.toFloat()) + path.lineTo(0f, -(height + arrowHeight).toFloat()) + } else { + //超过左边界 + canvas.translate(width / 2f - posX, 0f) + path.moveTo( + -(width / 2f - posX) - arrowOffset, + -(height + arrowHeight + arrowOffset) + ) + path.lineTo(arrowWidth / 2f, -height.toFloat()) + path.lineTo(-arrowWidth / 2f, -height.toFloat()) + path.moveTo( + -(width / 2f - posX) - arrowOffset, + -(height + arrowHeight + arrowOffset) + ) + } + } + canvas.drawPath(path, arrowPaint) + canvas.translate(-width / 2f, -height.toFloat()) + } else { + canvas.translate(0f, -height - arrowHeight - dotBitmap.height / 2f) + if (posX < width / 2f) { + //超过左边界 + canvas.translate(width / 2f - posX, 0f) + path.moveTo( + -(width / 2f - posX) + arrowOffset, + height + arrowHeight + arrowOffset + ) + path.lineTo(arrowWidth / 2f, height.toFloat()) + path.lineTo(-arrowWidth / 2f, height.toFloat()) + path.moveTo( + -(width / 2f - posX) + arrowOffset, + height + arrowHeight + arrowOffset + ) + } else { + if (posX > chartView.width - (width / 2f)) { + //超过右边界 + canvas.translate(-(width / 2 - (chartView.width - posX)), 0f) + path.moveTo( + width / 2 - (chartView.width - posX) + arrowOffset, + height + arrowHeight + arrowOffset + ) + path.lineTo(arrowWidth / 2f, height.toFloat()) + path.lineTo(-arrowWidth / 2f, height.toFloat()) + path.moveTo( + width / 2 - (chartView.width - posX) + arrowOffset, + height + arrowHeight + arrowOffset + ) + } else { + path.moveTo(0f, (height + arrowHeight).toFloat()) + path.lineTo(arrowWidth / 2f, height.toFloat()) + path.lineTo(-arrowWidth / 2f, height.toFloat()) + path.moveTo(0f, (height + arrowHeight).toFloat()) + } + } + canvas.drawPath(path, arrowPaint) + canvas.translate(-width / 2f, 0f) + } + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_blue_3.xml b/app/src/main/res/drawable/bg_solid_layout_blue_3.xml new file mode 100644 index 0000000..3b277e8 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_blue_3.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_layout_blue_5.xml b/app/src/main/res/drawable/bg_stroke_layout_blue_5.xml deleted file mode 100644 index 5efd97f..0000000 --- a/app/src/main/res/drawable/bg_stroke_layout_blue_5.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_text_tag_blue.xml b/app/src/main/res/drawable/bg_text_tag_blue.xml deleted file mode 100644 index bb29dcb..0000000 --- a/app/src/main/res/drawable/bg_text_tag_blue.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt b/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt index 85cb963..b49c20f 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/extensions/ByteArray.kt @@ -46,4 +46,19 @@ this[3].toInt() } return (x * 65536 + y * 256 + z).toLong() +} + +fun ByteArray.handleCpuTemperature(): Float { + //[1, -128, 24] + val x = if (this[0] < 0) { + this[0].toInt() and 0xFF + } else { + this[0].toInt() + } + val y = if (this[1] < 0) { + this[1].toInt() and 0xFF + } else { + this[1].toInt() + } + return (x * 256 + y) / 10f } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt index 039a116..aa1d4d7 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt @@ -6,6 +6,7 @@ import android.os.IBinder import android.os.Message import android.util.Log +import com.casic.app.safetreecontroller.extensions.handleCpuTemperature import com.casic.app.safetreecontroller.extensions.handleGasConcentration import com.casic.app.safetreecontroller.extensions.toAsciiCode import com.casic.app.safetreecontroller.extensions.toHex @@ -324,12 +325,11 @@ "CC" -> { //激光温度 val dataArray = bytes.copyOfRange(10, bytes.size) - val temperature = (dataArray[0] * 256 + dataArray[1]) / 10f val weakReferenceHandler = MethaneMonitorFragment.weakReferenceHandler ?: return val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.QUERY_CPU_TEMPERATURE_RESPONSE_CODE - message.obj = temperature + message.obj = dataArray.handleCpuTemperature() weakReferenceHandler.sendMessage(message) } } diff --git a/app/src/main/java/com/casic/app/safetreecontroller/widgets/LineChartMarkerView.kt b/app/src/main/java/com/casic/app/safetreecontroller/widgets/LineChartMarkerView.kt index 6ac70d6..50d1040 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/widgets/LineChartMarkerView.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/widgets/LineChartMarkerView.kt @@ -2,6 +2,8 @@ import android.content.Context import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Path import android.widget.TextView import androidx.core.graphics.drawable.toBitmap import com.casic.app.safetreecontroller.R @@ -9,7 +11,10 @@ import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.highlight.Highlight import com.github.mikephil.charting.utils.MPPointF +import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.convertDrawable +import com.pengxh.kt.lite.extensions.dp2px + class LineChartMarkerView(context: Context) : MarkerView(context, R.layout.popu_line_chart_marker) { @@ -17,6 +22,16 @@ private val valueView: TextView = findViewById(R.id.valueView) private var xAxisDate = ArrayList() private val dotBitmap = R.drawable.ic_chart_dot.convertDrawable(context)!!.toBitmap() + private var arrowPaint = Paint() + private val arrowHeight = 10.dp2px(context) // 箭头的高度 + private val arrowWidth = 15.dp2px(context) // 箭头的宽度 + private val arrowOffset = 2f.dp2px(context) //箭头偏移量 + + init { + arrowPaint.style = Paint.Style.FILL + arrowPaint.isAntiAlias = true + arrowPaint.color = R.color.mainThemeColor.convertColor(context) + } fun setXAxisDate(date: ArrayList) { this.xAxisDate = date @@ -34,7 +49,7 @@ } override fun getOffset(): MPPointF { - return MPPointF((-(width shr 1)).toFloat(), (-height).toFloat()) + return MPPointF((-(width shr 1)).toFloat(), -height.toFloat()) } /** @@ -51,7 +66,92 @@ canvas.drawBitmap(dotBitmap, -dotBitmap.width / 2f, -dotBitmap.height / 2f, null) + drawArrow(canvas, posX, posY) + draw(canvas) canvas.restoreToCount(saveId) } + + private fun drawArrow(canvas: Canvas, posX: Float, posY: Float) { + val path = Path() + if (posY < height + arrowHeight + dotBitmap.height / 2f) { + //处理超过上边界 + canvas.translate(0f, height + arrowHeight + dotBitmap.height / 2f) + if (posX > chartView.width - (width / 2f)) { + //超过右边界 + canvas.translate(-(width / 2 - (chartView.width - posX)), 0f) + path.moveTo( + width / 2 - (chartView.width - posX) - arrowOffset, + -(height + arrowHeight + arrowOffset) + ) + path.lineTo(arrowWidth / 2f, -height.toFloat()) + path.lineTo(-arrowWidth / 2f, -height.toFloat()) + path.moveTo( + width / 2 - (chartView.width - posX) - arrowOffset, + -(height + arrowHeight + arrowOffset) + ) + } else { + if (posX > width / 2f) { + //在图表中间 + path.moveTo(0f, -(height + arrowHeight).toFloat()) + path.lineTo(arrowWidth / 2f, -height.toFloat()) + path.lineTo(-arrowWidth / 2f, -height.toFloat()) + path.lineTo(0f, -(height + arrowHeight).toFloat()) + } else { + //超过左边界 + canvas.translate(width / 2f - posX, 0f) + path.moveTo( + -(width / 2f - posX) - arrowOffset, + -(height + arrowHeight + arrowOffset) + ) + path.lineTo(arrowWidth / 2f, -height.toFloat()) + path.lineTo(-arrowWidth / 2f, -height.toFloat()) + path.moveTo( + -(width / 2f - posX) - arrowOffset, + -(height + arrowHeight + arrowOffset) + ) + } + } + canvas.drawPath(path, arrowPaint) + canvas.translate(-width / 2f, -height.toFloat()) + } else { + canvas.translate(0f, -height - arrowHeight - dotBitmap.height / 2f) + if (posX < width / 2f) { + //超过左边界 + canvas.translate(width / 2f - posX, 0f) + path.moveTo( + -(width / 2f - posX) + arrowOffset, + height + arrowHeight + arrowOffset + ) + path.lineTo(arrowWidth / 2f, height.toFloat()) + path.lineTo(-arrowWidth / 2f, height.toFloat()) + path.moveTo( + -(width / 2f - posX) + arrowOffset, + height + arrowHeight + arrowOffset + ) + } else { + if (posX > chartView.width - (width / 2f)) { + //超过右边界 + canvas.translate(-(width / 2 - (chartView.width - posX)), 0f) + path.moveTo( + width / 2 - (chartView.width - posX) + arrowOffset, + height + arrowHeight + arrowOffset + ) + path.lineTo(arrowWidth / 2f, height.toFloat()) + path.lineTo(-arrowWidth / 2f, height.toFloat()) + path.moveTo( + width / 2 - (chartView.width - posX) + arrowOffset, + height + arrowHeight + arrowOffset + ) + } else { + path.moveTo(0f, (height + arrowHeight).toFloat()) + path.lineTo(arrowWidth / 2f, height.toFloat()) + path.lineTo(-arrowWidth / 2f, height.toFloat()) + path.moveTo(0f, (height + arrowHeight).toFloat()) + } + } + canvas.drawPath(path, arrowPaint) + canvas.translate(-width / 2f, 0f) + } + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_blue_3.xml b/app/src/main/res/drawable/bg_solid_layout_blue_3.xml new file mode 100644 index 0000000..3b277e8 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_blue_3.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_stroke_layout_blue_5.xml b/app/src/main/res/drawable/bg_stroke_layout_blue_5.xml deleted file mode 100644 index 5efd97f..0000000 --- a/app/src/main/res/drawable/bg_stroke_layout_blue_5.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_text_tag_blue.xml b/app/src/main/res/drawable/bg_text_tag_blue.xml deleted file mode 100644 index bb29dcb..0000000 --- a/app/src/main/res/drawable/bg_text_tag_blue.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/popu_line_chart_marker.xml b/app/src/main/res/layout/popu_line_chart_marker.xml index df796b0..e4f2cd6 100644 --- a/app/src/main/res/layout/popu_line_chart_marker.xml +++ b/app/src/main/res/layout/popu_line_chart_marker.xml @@ -3,7 +3,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:background="@drawable/bg_stroke_layout_blue_5" + android:background="@drawable/bg_solid_layout_blue_3" android:gravity="center" android:orientation="vertical"> @@ -11,10 +11,9 @@ android:id="@+id/timeView" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@drawable/bg_text_tag_blue" - android:gravity="center" + android:gravity="center_vertical" android:padding="@dimen/dp_3" - android:text="04月01日" + android:text="16点46分" android:textColor="@color/white" android:textSize="11sp" /> @@ -22,9 +21,9 @@ android:id="@+id/valueView" android:layout_width="match_parent" android:layout_height="wrap_content" - android:gravity="center_horizontal" + android:gravity="center_vertical" android:padding="@dimen/dp_3" android:text="@string/app_name" - android:textColor="@color/mainThemeColor" + android:textColor="@color/white" android:textSize="11sp" /> \ No newline at end of file