Android自定义华为睡眠,Android运动健康睡眠自定义控件的实现

这是一个实现自定义华为睡眠视图的Android类,包括绘制日图表、柱状图、渐变线、底部区域等。通过触摸事件监听,实现了滑块的拖动功能,并根据数据绘制不同状态的睡眠柱状图,颜色表示不同睡眠阶段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**

*

* 日图表

* zrj 2020/8/25

*/

class SleepDayChart(context: Context, attrs: AttributeSet?) : View(context, attrs) {

//屏幕宽高

private var scrWidth = 0f

private var scrHeight = 0f

private var xData: Array = arrayOf("20:00", "02:00", "08:00", "14:00", "20:00")

private var sleepsData: Sleep? = null

private lateinit var paintLine: Paint

private lateinit var paintGradientLine: Paint

private lateinit var paintXText: Paint

private lateinit var paintSleep: Paint

private lateinit var paintPillar: Paint

private lateinit var paintRound: Paint

private lateinit var paintBessel: Paint

private var xSlider = 0f //滑块的x轴位置

private var mPath: Path

private val curveCircleRadius = 12f.dp

// the coordinates of the first curve

private val mFirstCurveStartPoint = Point()

private val mFirstCurveEndPoint = Point()

private val mFirstCurveControlPoint1 = Point()

private val mFirstCurveControlPoint2 = Point()

//the coordinates of the second curve

private var mSecondCurveStartPoint = Point()

private val mSecondCurveEndPoint = Point()

private val mSecondCurveControlPoint1 = Point()

private val mSecondCurveControlPoint2 = Point()

init {

setLayerType(LAYER_TYPE_SOFTWARE, null)

mPath = Path()

initPaint()

}

/**

* 初始化画笔

*/

private fun initPaint() {

paintLine = Paint()

paintLine.style = Paint.Style.STROKE

paintLine.strokeWidth = 1f

paintLine.color = context.colorCompat(R.color.e6e6e6_2e2e2e)

paintGradientLine = Paint()

paintGradientLine.style = Paint.Style.STROKE

paintGradientLine.strokeWidth = 1f

paintXText = Paint()

paintXText.isAntiAlias = true

paintXText.strokeWidth = 1f

paintXText.textSize = 12f.sp

paintXText.textAlign = Paint.Align.CENTER

paintXText.color = context.colorCompat(R.color.color_on_surface)

paintSleep = Paint()

paintSleep.style = Paint.Style.FILL

paintSleep.isAntiAlias = true

paintSleep.color = context.colorCompat(R.color.blue_7fbeff)

paintPillar = Paint()

paintPillar.style = Paint.Style.FILL

paintPillar.isAntiAlias = true

paintPillar.color = context.colorCompat(R.color.blue_7fbeff)

paintRound = Paint()

paintRound.style = Paint.Style.FILL

paintRound.isAntiAlias = true

paintRound.color = context.colorCompat(R.color.ffffff_6e6e6e)

paintBessel = Paint()

paintBessel.style = Paint.Style.FILL

paintBessel.isAntiAlias = true

paintBessel.color = context.colorCompat(R.color.f2f2f2_1d1d1d)

}

override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {

super.onSizeChanged(w, h, oldw, oldh)

scrWidth = width.toFloat()

scrHeight = height.toFloat()

ySpacing = scrHeight / 8f //y轴分8份

//底部圆滑块可以滑动的范围

xWithStart = margin * 3

xWithEnd = scrWidth - margin * 3

xSlider = scrWidth / 2

xSpacing = (xWithEnd - xWithStart) / (xData

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值