老规矩,先上运行效果图
这是触发点击事件的运行图
首先给大家介绍一些思路:
首先继承view控件,然后重点是要覆写draw方法实现自定义的绘制,最后实现一个手势监听器,在onTouch事件中进行监听,得到点击坐标后一一与每一个item的左右x坐标比对,看是否落入了该空间中,然后回调监听器即可。
接下来重点介绍一下draw方法:
首先上一张图给大家介绍一下需要知道哪些距离参数
如图所示,这个柱状图有6个item,每个item的宽度就是2所示的宽度,即代码中的mItemBarWidth;1代表了一个item中的柱状图的宽度,即代码中的mBarWidth;0所示的就是单个item中除了柱状图宽度以外到两边的距离,两边的距离是相等的;代码中设定了一个mBeginXCoord变量,表示起始绘制的新坐标,即第一个0的宽度,这是为了累加方便,因为下一个柱状图的起始x坐标就是mBeginXCoord加上一个item的宽度而已;
所以在绘制之前需要把这些参数都计算好,由calculateFontHeight()方法,完成计算,我这里默认设定的是如果用户没有设定柱状图的宽度,则默认为item的一半宽度。
翠花,上代码
package com.example.rangebarchart;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Paint.FontMetrics;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.GestureDetector.OnGestureListener;
public class RangeBarChart extends View{
/* 用户点击到了无效位置 */
public static final int INVALID_POSITION = -1;
/* 画笔 */
private Paint mTextPaint = null;
private Paint mBarPaint = null;
/* 柱状图数据集 */
private RangeBarDataSet mDataSet = null;
/* 绘图颜色值 */
private int mTextColor = Color.WHITE;
private int mBarColor = Color.WHITE;
/* 圆角矩形的弧度 */
private int mRadius = 10;
/* 条形图的宽度和高度 */
private float mBarWidth = 0;
private float mBarHeight = 0;
/* 辅助计算柱宽,表示一个条目的宽度,包括柱子和空余