最近需要写一个用到各种图表的项目,比较过后决定用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