Android 自定义仪表盘

最近需要写一个用到各种图表的项目,比较过后决定用hellocharts框架,感觉足够简洁,后来发现这框架里没有仪表盘这个控件,但又不想换其他框架,于是在网上搜索一番,找到一个仪表盘学习demo,尝试后初步改成了所需样式。界面如下:

这里写图片描述

因为为demo,界面比较丑陋,需要再美化。另代码设计也有很大改进精简空间,待正式项目中再进行修改,此为学习所用。

所参考文章:http://blog.csdn.net/qq_26411333/article/details/52399831
原文是可以触摸改变指针指向,因需求不同,将此功能删除了。

改动后的view不同的是可以设置初始值和终点值,可以设置需要的刻度段数,可以通过设置改变指针指向,当然所有可变量都可抽出设置方法,可跟需求改动。
代码改动过程中,有若干点需要注意:
1、在分多种颜色绘制时,总是出现最后一个颜色覆盖掉之前不同的颜色,查询才知道
canvas.drawPath(linePath, linePaint)中path是包含从绘制起所有路径,所以在最后改变时,也会将之前所有路径改为同一风格,换成其他draw方法即可。
2、绘制过程中,会用到一些三角函数公式,此坐标是以指针起点固定点为原点,水平向右为x轴正方向,竖直向下为y轴正方向,所以第一二三四象限是顺时针定义的。因为外圆内院半径固定,可由任何角度根据三角函数公式获取所需值。PathMeasure等类也有所封装。

全部代码:

package xr.hellochartsdemo.ui.activity.dashboard;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathMeasure;
import android.graphics.RectF;
import android.renderscript.Sampler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

import java.math.BigDecimal;

import static android.R.attr.x;
import static android.R.attr.y;

/**
 * Created by wxy .
 * 仪表盘
 */
public class DashboardView extends View {
   

    private int width;
    private int height;

    private Paint outerCirclePaint;//外层圆的画笔
    private Paint outerCirclePaint2;//外层圆的画笔2
    private Paint outerCirclePaint3;//外层圆的画笔3
    private Paint innerCirclePaint;//内层圆的画笔
    private Paint linePaint;//线段画笔
    private Paint arrowPaint;//指针画笔
    private Paint textPaint;//标注文字
    private Paint textPaint2;//目标指针文字

    private Path outerCirclePath;//外层圆的Path
    private Path innerCirclePath;//内层圆的Path
    private Path linePath;//线段的Path
    private Path arrowPath;//指针的Path
    private Path measureArrowPath;//arrowPath借助该Path来保持一定的长度

    private RectF outRectF;//用于绘制外层圆   通过四个坐标参数来确定一个矩形的区域。
    private RectF innerRectF;//用于绘制内层圆

    private int count = 10;//画count根线
    private static int outerR = 100;//外部圆环的半径
    private static int innerR = (int) (outerR * 0.9f);//内部圆环的半径
    private int shortageAngle = 60;//缺失的部分的角度
    private int startAngle;//开始的角度
    private int sweepAngle;//扫过的角度
    private int endAngle;

    private float[] leftEndPoint;//左侧边界的坐标
    private float[] rightEndPoint;//右侧边界的坐标
    private
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值