From 11b6ba16bd4669a0c7507435a37a47997dc642c8 Mon Sep 17 00:00:00 2001 From: yezhiqiu <983577727@qq.com> Date: Tue, 25 Nov 2025 16:42:42 +0800 Subject: [PATCH] =?UTF-8?q?1.map=E9=A1=B5=E6=94=B9=E7=89=88=E5=89=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../abbidot/tracker/widget/MapBatteryView.kt | 133 ++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 app/src/main/java/com/abbidot/tracker/widget/MapBatteryView.kt diff --git a/app/src/main/java/com/abbidot/tracker/widget/MapBatteryView.kt b/app/src/main/java/com/abbidot/tracker/widget/MapBatteryView.kt new file mode 100644 index 0000000..38fb2ac --- /dev/null +++ b/app/src/main/java/com/abbidot/tracker/widget/MapBatteryView.kt @@ -0,0 +1,133 @@ +package com.abbidot.tracker.widget + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Path +import android.text.TextUtils +import android.util.AttributeSet +import android.view.View +import androidx.core.content.ContextCompat +import com.abbidot.baselibrary.util.AppUtils +import com.abbidot.tracker.R +import com.qmuiteam.qmui.util.QMUIDisplayHelper + +/** + *Created by .yzq on 2024/8/26/026. + * @link + * @description: + */ +class MapBatteryView : View { + + private lateinit var mContext: Context + private var mOffsetX = 0 + private var mOffsetY = 0 + + //文字和边界的距离。三角形的直线长 + private var mPadding = 0 + + private lateinit var mTextPaint: Paint + private lateinit var mPaint: Paint + + //小三角形的path + private lateinit var mTrianglePath: Path + + private var mTimeText = "" + private var mAddressText = "" + + constructor(context: Context) : super(context) { + init(context) + } + + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super( + context, attrs, defStyleAttr + ) { + init(context) + } + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { + init(context) + } + + private fun init(context: Context) { + //禁用硬件加速,防止返回到界面多次执行onDraw + setLayerType(LAYER_TYPE_SOFTWARE, null) + mContext = context + mPaint = Paint().apply { + color = ContextCompat.getColor(mContext, R.color.white) + } + //开启抗锯齿 + mTextPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { + color = ContextCompat.getColor(mContext, R.color.black) + textSize = QMUIDisplayHelper.sp2px(mContext, 12).toFloat() + } + mPadding = AppUtils.dpToPx(6) + + mTrianglePath = Path() + } + + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + canvas.apply { + startDraw(this) + } + } + + private fun startDraw(canvas: Canvas) { + if (TextUtils.isEmpty(mAddressText) && TextUtils.isEmpty(mTimeText)) return + mTrianglePath.apply { + reset() + moveTo((mOffsetX - mPadding).toFloat(), (mOffsetY - mPadding).toFloat()) + lineTo(mOffsetX.toFloat(), mOffsetY.toFloat()) + lineTo((mOffsetX + mPadding).toFloat(), (mOffsetY - mPadding).toFloat()) + close() + } + canvas.apply { + + drawPath(mTrianglePath, mPaint) + + val fontMetrics = mTextPaint.fontMetrics + //文字高度 + val textHeight = fontMetrics.bottom - fontMetrics.top + //时间文字宽度 + val timeTextWith = mTextPaint.measureText(mTimeText) + //地址文字宽度 + val addressTextWith = mTextPaint.measureText(mAddressText) + val maxTextWith = maxOf(timeTextWith, addressTextWith) + + drawRoundRect( + mOffsetX - maxTextWith / 2 - mPadding, + mOffsetY - textHeight * 2 - mPadding * 2, + mOffsetX + maxTextWith / 2 + mPadding, + mOffsetY.toFloat() - mPadding, + AppUtils.dpToPx(6f), + AppUtils.dpToPx(6f), + mPaint + ) + drawText( + mTimeText, + mOffsetX - timeTextWith / 2, + mOffsetY - textHeight / 2 - mPadding, + mTextPaint + ) + drawText( + mAddressText, + mOffsetX - addressTextWith / 2, + mOffsetY - textHeight / 2 - textHeight - mPadding, + mTextPaint + ) + } + } + + fun setShowText(time: String, address: String) { + mTimeText = time + mAddressText = address + invalidate() + } + + fun setOffsetXY(x: Int, y: Int) { + mOffsetX = x + mOffsetY = y + invalidate() + } +} \ No newline at end of file