中建365-优化/bug修复
parent
210a62ee85
commit
609183b1ed
@ -0,0 +1,12 @@
|
||||
package com.xty.common.model
|
||||
|
||||
import com.xty.network.model.ReportBean
|
||||
|
||||
class ReportNewBean {
|
||||
var title=""
|
||||
var count:Float=0f //总数
|
||||
var listNum= mutableListOf<Float>()
|
||||
var listName= mutableListOf<String>()
|
||||
var unit = ""
|
||||
var isShow = true
|
||||
}
|
@ -0,0 +1,219 @@
|
||||
package com.xty.common.weight
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Canvas
|
||||
import android.graphics.Paint
|
||||
import android.graphics.RectF
|
||||
import android.util.AttributeSet
|
||||
import android.view.View
|
||||
import androidx.core.content.ContextCompat
|
||||
import com.xty.common.R
|
||||
import com.xty.common.SizeUtil
|
||||
import com.xty.common.model.ReportNewBean
|
||||
|
||||
class MyProgressCircleViewNew (context: Context, attrs: AttributeSet?) : View(context, attrs) {
|
||||
|
||||
private var bean: ReportNewBean? = null
|
||||
private var progressWidth = 0f
|
||||
private var exampleWidth = 0f
|
||||
private var percentSize = 0f
|
||||
private var exampleLength = 0f
|
||||
private var count = 3
|
||||
private var unit = "次"
|
||||
|
||||
private val paintProgress by lazy {
|
||||
Paint().apply {
|
||||
isDither = true
|
||||
isAntiAlias = true
|
||||
style = Paint.Style.STROKE
|
||||
strokeWidth = progressWidth
|
||||
color = ContextCompat.getColor(context, R.color.col_9BDd)
|
||||
}
|
||||
}
|
||||
|
||||
private val paintFir by lazy {
|
||||
Paint().apply {
|
||||
isDither = true
|
||||
isAntiAlias = true
|
||||
style = Paint.Style.STROKE
|
||||
strokeWidth = progressWidth
|
||||
color = ContextCompat.getColor(context, R.color.col_9BDd)
|
||||
}
|
||||
}
|
||||
|
||||
private val paintExample by lazy {
|
||||
Paint().apply {
|
||||
isDither = true
|
||||
isAntiAlias = true
|
||||
style = Paint.Style.STROKE
|
||||
strokeWidth = exampleWidth
|
||||
strokeCap = Paint.Cap.ROUND
|
||||
color = ContextCompat.getColor(context, R.color.col_FDA481)
|
||||
}
|
||||
}
|
||||
|
||||
private val paintTxt by lazy {
|
||||
Paint().apply {
|
||||
isDither = true
|
||||
isAntiAlias = true
|
||||
style = Paint.Style.FILL
|
||||
color = ContextCompat.getColor(context, R.color.col_313)
|
||||
textSize = percentSize
|
||||
}
|
||||
}
|
||||
|
||||
init {
|
||||
val obtain = context.obtainStyledAttributes(attrs, R.styleable.MyProgressCircleView)
|
||||
progressWidth =
|
||||
obtain.getDimensionPixelSize(R.styleable.MyProgressCircleView_circle_stroke_width, 0)
|
||||
.toFloat()
|
||||
percentSize =
|
||||
obtain.getDimensionPixelSize(R.styleable.MyProgressCircleView_percent_size, 0).toFloat()
|
||||
exampleWidth =
|
||||
obtain.getDimensionPixelSize(R.styleable.MyProgressCircleView_example_size, 0).toFloat()
|
||||
exampleLength =
|
||||
obtain.getDimensionPixelSize(R.styleable.MyProgressCircleView_example_length, 0)
|
||||
.toFloat()
|
||||
count = obtain.getInt(R.styleable.MyProgressCircleView_count, 0)
|
||||
obtain.recycle()
|
||||
}
|
||||
|
||||
override fun onDraw(canvas: Canvas) {
|
||||
super.onDraw(canvas)
|
||||
bean?.let {
|
||||
//绘制基础的圆形
|
||||
drawMyCircle(canvas)
|
||||
//绘制尾部占比数量
|
||||
drawTxt(canvas)
|
||||
//次数
|
||||
drawNumTxt(canvas)
|
||||
//绘制 用例前面的占比名称
|
||||
drawStartTxt(canvas)
|
||||
//绘制用例颜色
|
||||
drawExampleLine(canvas)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 绘制尾部占比数量
|
||||
*/
|
||||
private fun drawTxt(canvas: Canvas) {
|
||||
val fontMetrics = paintTxt.fontMetrics
|
||||
val txtHeight = fontMetrics.descent - fontMetrics.ascent
|
||||
val minHeight = height / count
|
||||
val baseline = minHeight / 2 + txtHeight / 2 - fontMetrics.descent
|
||||
|
||||
for (i in 0 until count) {
|
||||
val startY = minHeight * i + baseline
|
||||
val num = (bean!!.listNum[i]) / (bean!!.count) * 100
|
||||
var doubleNum = String.format("%.1f", num)
|
||||
if (doubleNum.equals("NaN")) {
|
||||
doubleNum = "0"
|
||||
}
|
||||
val measureText = paintTxt.measureText("$doubleNum%")
|
||||
canvas.drawText(
|
||||
"$doubleNum%",
|
||||
width.toFloat() - measureText - paddingRight,
|
||||
startY,
|
||||
paintTxt
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 次数
|
||||
*/
|
||||
private fun drawNumTxt(canvas: Canvas) {
|
||||
val fontMetrics = paintTxt.fontMetrics
|
||||
val txtHeight = fontMetrics.descent - fontMetrics.ascent
|
||||
val minHeight = height / count
|
||||
val baseline = minHeight / 2 + txtHeight / 2 - fontMetrics.descent
|
||||
for (i in 0 until count) {
|
||||
val startY = minHeight * i + baseline
|
||||
val day = bean!!.listNum[i].toString() + unit
|
||||
val measureText = paintTxt.measureText(day)
|
||||
canvas.drawText(
|
||||
day,
|
||||
width.toFloat() - measureText - paddingRight - SizeUtil.dp2px(context, 52f),
|
||||
startY,
|
||||
paintTxt
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 绘制 用例前面的占比名称
|
||||
*/
|
||||
private fun drawStartTxt(canvas: Canvas) {
|
||||
val fontMetrics = paintTxt.fontMetrics
|
||||
val txtHeight = fontMetrics.descent - fontMetrics.ascent
|
||||
val minHeight = height / count
|
||||
val baseLine = minHeight / 2 + txtHeight / 2 - fontMetrics.descent
|
||||
for (i in 0 until count) {
|
||||
val startY = minHeight * i + baseLine
|
||||
canvas.drawText(
|
||||
bean!!.listName[i],
|
||||
width / 2f + exampleLength + 10 + (exampleLength / 3f),
|
||||
startY,
|
||||
paintTxt
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 绘制用例颜色
|
||||
*/
|
||||
private fun drawExampleLine(canvas: Canvas) {
|
||||
var startAngle = 0f
|
||||
val i = width / 2
|
||||
val coerceAtMost = i.coerceAtMost(height)
|
||||
val r = coerceAtMost / 2f - progressWidth / 2 - paddingTop
|
||||
val startX = i / 2f - r
|
||||
val startY = height / 2f - r
|
||||
val endX = i / 2 + r
|
||||
val endY = height / 2f + r
|
||||
|
||||
val rectF = RectF(startX, startY, endX, endY)
|
||||
|
||||
val array = arrayOf(
|
||||
ContextCompat.getColor(context, R.color.col_9BDd),
|
||||
ContextCompat.getColor(context, R.color.col_9BD),
|
||||
ContextCompat.getColor(context, R.color.col_FDA481),
|
||||
ContextCompat.getColor(context, R.color.col_EFF),
|
||||
ContextCompat.getColor(context, R.color.col_BC8),
|
||||
)
|
||||
val x = width / 2f
|
||||
val y = height / count
|
||||
for (i in 0 until count) {
|
||||
val centerY = y * i + (y / 2f)
|
||||
paintExample.color = array[i]
|
||||
canvas.drawLine(x, centerY, x + exampleLength, centerY, paintExample)
|
||||
paintFir.color = array[i]
|
||||
val angle = if (bean!!.count == 0f) {
|
||||
360 / count.toFloat()
|
||||
} else {
|
||||
360 * bean!!.listNum[i] / bean!!.count.toFloat()
|
||||
}
|
||||
|
||||
paintFir.color = array[i]
|
||||
canvas.drawArc(rectF, startAngle, angle, false, paintFir)
|
||||
startAngle += angle
|
||||
}
|
||||
}
|
||||
|
||||
//绘制基础的圆形
|
||||
private fun drawMyCircle(canvas: Canvas) {
|
||||
val i = width / 2
|
||||
val coerceAtMost = i.coerceAtMost(height)
|
||||
val r = coerceAtMost / 2f - progressWidth / 2 - paddingTop
|
||||
canvas.drawCircle(i / 2f, height / 2f, r, paintProgress)
|
||||
}
|
||||
|
||||
fun setData(bean: ReportNewBean) {
|
||||
this.bean = bean
|
||||
count = bean.listName.size
|
||||
unit = bean.unit
|
||||
invalidate()
|
||||
}
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 105 KiB |
Loading…
Reference in New Issue