千家信息网

Android怎么自定义View实现渐变色折线图

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章主要介绍"Android怎么自定义View实现渐变色折线图",在日常操作中,相信很多人在Android怎么自定义View实现渐变色折线图问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作
千家信息网最后更新 2025年01月19日Android怎么自定义View实现渐变色折线图

这篇文章主要介绍"Android怎么自定义View实现渐变色折线图",在日常操作中,相信很多人在Android怎么自定义View实现渐变色折线图问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Android怎么自定义View实现渐变色折线图"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

如何实现

通过创建LinearGradient来实现颜色渐变,并将之设置到画笔Paint的着色器Shader,绘制想要的路径即可实现该效果。

实现代码如下:

class GradientLineChart : View {    private var viewWidth: Int = 0    private var viewHeight: Int = 0    private var chartWidth: Int = 0    private var chartHeight: Int = 0    /**     * 折线宽度     */    private var lineWidth: Float = 0f    /**     * 网格线宽度     */    private var gridLineWidth: Float = 0f    /**     * 网格线颜色     */    private var gridLineColor: Int = 0    /**     * 背景颜色     */    private var backgroundColorRes: Int = 0    private var linePaint: Paint? = null    private var gridLinePaint: Paint? = null    private var gradientColor: IntArray? = null    privateval rectF = RectF()    privateval linePath = Path()    privateval lineValueList = ArrayList()    constructor(context: Context?) : this(context, null)    constructor(context: Context?, attrs: AttributeSet?) : this(context, attrs, 0)    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {        lineValueList.add(LineEntity(3f, 28f))        lineValueList.add(LineEntity(7f, 2f))        lineValueList.add(LineEntity(14f, 18f))        lineValueList.add(LineEntity(17f, 12f))        lineValueList.add(LineEntity(22f, 21f))        context?.let {            gradientColor = intArrayOf(                ContextCompat.getColor(it, R.color.color_FFD200),                ContextCompat.getColor(it, R.color.color_FF2600),                ContextCompat.getColor(it, R.color.color_49E284),                ContextCompat.getColor(it, R.color.color_00A5FF)            )        }        initAttr(attrs, defStyleAttr)        initPaint()    }    private fun initAttr(attrs: AttributeSet?, defStyleAttr: Int) {        val typeArray =            context.theme.obtainStyledAttributes(attrs, R.styleable.GradientLineChart, defStyleAttr, 0)        lineWidth = typeArray.getDimension(            R.styleable.GradientLineChart_tc_lineWidth,            DensityUtil.dp2Px(2).toFloat()        )        gridLineWidth = typeArray.getDimension(            R.styleable.GradientLineChart_tc_grid_line_width,            DensityUtil.dp2Px(1).toFloat()        )        gridLineColor = typeArray.getColor(            R.styleable.GradientLineChart_tc_grid_line_color,            ContextCompat.getColor(context, R.color.color_1Affffff)        )        backgroundColorRes = typeArray.getColor(            R.styleable.GradientLineChart_tc_background_color,            ContextCompat.getColor(context, R.color.color_23242a)        )        typeArray.recycle()    }    private fun initPaint() {        linePaint = Paint()        linePaint?.isAntiAlias = true        linePaint?.style = Paint.Style.STROKE        linePaint?.strokeWidth = lineWidth        gridLinePaint = Paint()        gridLinePaint?.isAntiAlias = true        gridLinePaint?.style = Paint.Style.FILL        gridLinePaint?.color = gridLineColor    }    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {        viewWidth = MeasureSpec.getSize(widthMeasureSpec)        viewHeight = MeasureSpec.getSize(heightMeasureSpec)        //MUST CALL THIS        setMeasuredDimension(viewWidth, viewHeight)        chartWidth = viewWidth - paddingStart - paddingEnd        chartHeight = viewHeight - paddingTop - paddingBottom    }    override fun onDraw(canvas: Canvas?) {        super.onDraw(canvas)        //设置画布背景色        canvas?.drawColor(backgroundColorRes)        //绘制网格线        drawGradLine(canvas)        //绘制折线        drawLine(canvas)    }    /**     * 绘制网格线     */    private fun drawGradLine(canvas: Canvas?) {        gridLinePaint?.let {            val yGridValues = 7            val xGridValues = 6            //Y轴网格线间距            val yGridDistance = (chartHeight - yGridValues * gridLineWidth) / (yGridValues - 1)            for (index in 0 until yGridValues) {                val left = paddingStart.toFloat()                val top = paddingTop.toFloat() + index * yGridDistance + index * gridLineWidth                val right = left + chartWidth                val bottom = top + gridLineWidth                rectF.set(left, top, right, bottom)                canvas?.drawRect(rectF, it)            }            //X轴网格线间距            val xGridDistance = (chartWidth - xGridValues * gridLineWidth) / (xGridValues - 1)            for (index in 0 until xGridValues) {                val left = paddingStart + xGridDistance * index + gridLineWidth * index                val top = paddingTop.toFloat()                val right = left + gridLineWidth                val bottom = top + chartHeight                rectF.set(left, top, right, bottom)                canvas?.drawRect(rectF, gridLinePaint!!)            }        }    }    /**     * 绘制折线     */    private fun drawLine(canvas: Canvas?) {        val yGridValues = 7        val xGridValues = 6        val yGridDistance = (chartHeight - yGridValues * gridLineWidth) / (yGridValues - 1)        val xGridDistance = (chartWidth - xGridValues * gridLineWidth) / (xGridValues - 1)        for ((index, linePoint) in lineValueList.withIndex()) {            val pointX =                ((linePoint.xValue - 5 * index) / 5) * xGridDistance + (xGridDistance * index)            val pointY =                chartHeight - (linePoint.yValue / 30 * (yGridDistance * 6))            if (index == 0) {                linePath.moveTo(pointX, pointY)            } else {                linePath.lineTo(pointX, pointY)            }        }        linePaint?.shader = createLineGradient(gradientColor!!)        canvas?.drawPath(linePath, linePaint!!)    }    private fun createLineGradient(gradientColor: IntArray): LinearGradient {        return LinearGradient(            0f,            0f,            0f,            viewHeight.toFloat(),            gradientColor,            null,            Shader.TileMode.CLAMP        )    }}                                                                                        

效果如下图:

到此,关于"Android怎么自定义View实现渐变色折线图"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

网格 线图 变色 学习 折线 颜色 宽度 效果 更多 背景 间距 帮助 实用 接下来 代码 文章 方法 理论 画布 画笔 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库时间字段设置自动填充 房地一体数据库建设软件 数据库穿透 ejb直连数据库 阿里云oracle数据库导出 网络安全大赛在哪里玩 汇丰银行软件开发总部在 有关网络安全主题儿童画 莱山区平台软件开发哪家好 北京连三角网络技术开发 数据库直接递归触发器 深化网络安全协同创新 计算机三级网络技术考试成绩 数据库使用别名表示学生分数 数据库系统技术架构 FLAG软件开发 上海网络安全等级保护网首页 为什么使用车载网络技术 上海无纸化会议系统软件开发 软件开发工作评价及期望意见 政府软件开发的服务怎么样 邹平染色软件开发服务 郑州帮帮网络技术公司 莱山区平台软件开发哪家好 软件开发网络工具有哪些 广州辉聚捷软件开发有限公司 什么云服务器可以显示密码 sqlyog导入数据库 怎样理解软件开发生命周期 论文选题计算机与网络技术
0