报表(折线图,柱形图)

折线图报表

效果图:
这里写图片描述
1.新建ChartView extends View

package com.my.administrator.mychart;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.View;

import java.util.HashMap;

/**
 * Created by Administrator on 2015/10/13.
 */
public class ChartView extends View {
   

    private int width;
    private int height;
    private float maxValue;//传入数据的最大值
    private int dataNum;//数据总数

    private Paint mPaintBg;//报表背景画笔
    private Paint mPaintCoveredBg;//用于画数据覆盖部分
    private Paint mPaintChartLine;//用于画报表的网格
    private Paint mPaintDataLine;//用于画数据连线
    private Paint mPaintTextDate;//用于画日期文本
    private Paint mPaintCircle;//用于画空心圆
    private Paint mPaintFilledCircle;//用于画实心圆
    private Paint mPaintTextValue;//用于画数据访问量值

    private Path path;

    private HashMap<Integer, LinearChartData<Float>> dataTotal;//用于得存储传入的总数据

    //用一个setPaints()方法,设定所有画笔的属性,增加代码灵活性
    public void setPaints(int bgColor, int coveredBgColor, int chartLineColor
            , int dataLineColor, int textDateColor, int filledCircleColor, int circleColor, int textValueColor) {

        mPaintBg.setColor(bgColor);
        mPaintBg.setStyle(Paint.Style.FILL);

        mPaintCoveredBg.setColor(coveredBgColor);
        mPaintCoveredBg.setStyle(Paint.Style.FILL);

        mPaintCircle.setColor(circleColor);
        mPaintCircle.setStyle(Paint.Style.STROKE);
        mPaintCircle.setStrokeWidth(5);
        mPaintCircle.setAntiAlias(true);

        mPaintFilledCircle.setColor(filledCircleColor);
        mPaintFilledCircle.setStyle(Paint.Style.FILL);
        mPaintFilledCircle.setAntiAlias(true);

        mPaintChartLine.setColor(chartLineColor);
        mPaintChartLine.setStyle(Paint.Style.STROKE);
        mPaintChartLine.setAntiAlias(true);

        mPaintDataLine.setColor(dataLineColor);
        mPaintDataLine.setStyle(Paint.Style.STROKE);
        mPaintDataLine.setStrokeWidth(SizeConvert.dip2px(getContext(), 4));
        mPaintDataLine.setAntiAlias(true);

        mPaintTextDate.setColor(textDateColor);
        mPaintTextDate.setTextSize(SizeConvert.dip2px(getContext(), 10));
        mPaintTextDate.setTextAlign(Paint.Align.CENTER);
        mPaintTextDate.setAntiAlias(true);

        mPaintTextValue.setColor(textValueColor);
        mPaintTextValue.setTextSize(SizeConvert.dip2px(getContext(), 12));
        mPaintTextValue.setTextAlign(Paint.Align.CENTER);
        mPaintTextValue.setAntiAlias(true);

        //重绘
        invalidate();
    }


    //用于设定传入的总数据
    public void setDataTotal(HashMap<Integer, LinearChartData<Float>> dataTotal) {
        this.dataTotal = dataTotal;
        invalidate();
    }

    public ChartView(Context context) {
        super(context);
    }

    public ChartView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mPaintBg = new Paint();
        mPaintCoveredBg = new Paint();
        mPaintCircle = new Paint();
        mPaintChartLine = new Paint();
        mPaintDataLine = new Paint();
        mPaintTextDate = new Paint();
        mPaintTextValue = new Paint();
        mPaintFilledCircle = new Paint();
        path = new Path();

        dataTotal = new HashMap<>();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //当总数据已经传入,即不为空时,根据总数据中数据个数设定view的总宽
        if (dataTotal != null) {
            width = (dataTotal.size() - 1) * xAddedNum + chartMarginHorizontal * 2;
            getMaxValue(dataTotal);
        }
        height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
        setMeasuredDimension(width, height);
    }

    /**
     * 用于得到总数据中最大数据
     *
     * @param dataTotal 总数据
     */
    private void getMaxValue(HashMap<Integer, LinearChartData<Float>> dataTotal) {
        maxValue = 0f;
        dataNum = 0;
        for (int key : dataTotal.keySet()) {
            if (dataTotal.get(key).getValue()>maxValue) {
                maxValue = dataTotal.get(key).getValue();
            }
            dataNum++;
        }
    }

    private int mChartHeight;//折线图的高
    private int mChartWidth;//折线图的宽
    private int startX = SizeConvert.dip2px(getContext(), 10);//开始绘制的x坐标
    private int startY = SizeConvert.dip2px(getContext(), 5
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值