美文网首页
一个线性统计图Demo

一个线性统计图Demo

作者: 我有一口小白牙 | 来源:发表于2017-05-24 15:29 被阅读44次
image.png

贴代码:
/**

  • 一个线性统计图Demo
  • Created by baiya on 2017/5/23.
    */

public class LineView extends View {

private Context mContext;
private AttributeSet mAttrs;

private Paint mXPaint;
private TextPaint mTextPaint;
private SparseArray<Integer> datas;
private Paint mCyclePaint;
private Paint mPathPaint;


public LineView(Context context) {
    this(context, null);
}

public LineView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public LineView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(context, attrs);
}


/**
 * 初始化
 *
 * @param context
 * @param attrs
 */
private void init(Context context, AttributeSet attrs) {
    this.mContext = context;
    this.mAttrs = attrs;

    mXPaint = new Paint();
    mXPaint.setStrokeWidth(5);
    mXPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
    mXPaint.setColor(Color.RED);

    mTextPaint = new TextPaint();
    mTextPaint.setColor(Color.BLACK);
    mTextPaint.setTextAlign(Paint.Align.CENTER);
    mTextPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
    mTextPaint.setTextSize(50);

    mCyclePaint = new Paint();
    mCyclePaint.setFlags(Paint.ANTI_ALIAS_FLAG);
    mCyclePaint.setColor(Color.BLUE);


    datas = new SparseArray<>();
    datas.append(1, 1);
    datas.append(2, 2);
    datas.append(3, 3);
    datas.append(4, 1);
    datas.append(5, 2);
    datas.append(6, 3);
    datas.append(7, 5);
    datas.append(8, 5);
    datas.append(9, 5);

    mPathPaint = new Paint();
    mPathPaint.setStrokeWidth(3);
    mPathPaint.setColor(Color.BLACK);
    mPathPaint.setStyle(Paint.Style.STROKE);



}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    //x轴
    canvas.drawLine(70, 700, 900, 700, mXPaint);
    //y轴
    canvas.drawLine(70, 700, 70, 50, mXPaint);
    //x轴上文字
    for (int i = 1; i < 10; i++) {
        canvas.drawText(i + "", 70 + i * 80, 750, mTextPaint);
    }
    //x轴标签上的小标签
    for (int i = 1; i < 10; i++) {
        canvas.drawLine(70 + i * 80, 700, 70 + i * 80, 680, mXPaint);
    }
    //y轴上文字
    for (int i = 1; i < 10; i++) {
        canvas.drawText(i + "", 40, 700 - i * 80 + 18, mTextPaint);
    }

    //y轴标签上的小标签
    for (int i = 1; i < 10; i++) {
        canvas.drawLine(70, 700 - i * 80, 90, 700 - i * 80, mXPaint);
    }


    ArrayList<Dot> dots = new ArrayList<>();

    for (int i = 1; i <= datas.size(); i++) {
        int number = datas.get(i);
        float cx = 70+i*80;
        float cy = 700-number*80;
        Dot dot = new Dot(cx, cy);
        dots.add(dot);
    }

    Path path = new Path();
    path.reset();
    for (int i = 0; i < dots.size()-1; i++) {
        if (i == 0) {
            path.moveTo(dots.get(i).getCx(), dots.get(i).getCy());//起点
            //控制点,
            float vx = dots.get(i).getCx() + (dots.get(i + 1).getCx() - dots.get(i).getCx())/2;
            float vy = dots.get(i + 1).getCy();

            path.quadTo(vx, vy, dots.get(i+1).getCx(), dots.get(i+1).getCy());//第一条线

        }
        else if (i != 0 && i!= dots.size()-2) {
            //第一个控制点
            float vx1 = dots.get(i).cx+(dots.get(i + 1).getCx() - dots.get(i).getCx())/2;
            float vy1 = dots.get(i).getCy();

            //第二个控制点
            float vx2 = dots.get(i).cx+(dots.get(i + 1).getCx() - dots.get(i).getCx())/2;
            float vy2 = dots.get(i+1).getCy();

            path.cubicTo(vx1, vy1, vx2, vy2,
                    dots.get(i+1).getCx(), dots.get(i+1).getCy());

        } else if (i == dots.size() - 2) {
            path.moveTo(dots.get(i).getCx(),dots.get(i).getCy());

            float vx3 = dots.get(i).cx+(dots.get(i + 1).getCx() - dots.get(i).getCx())/2;
            float vy3 = dots.get(i).getCy();

            path.quadTo(vx3, vy3, dots.get(i+1).getCx(), dots.get(i+1).getCy());
        }
    }

    canvas.drawPath(path, mPathPaint);


    for (int i = 1; i <= datas.size(); i++) {
        int number = datas.get(i);
        float cx = 70+i*80;
        float cy = 700-number*80;
        canvas.drawCircle(cx, cy, 5, mCyclePaint);
    }


}

class Dot {
    private float cx;
    private float cy;

    public Dot(float cx, float cy) {
        this.cx = cx;
        this.cy = cy;
    }

    public float getCx() {
        return cx;
    }

    public void setCx(float cx) {
        this.cx = cx;
    }

    public float getCy() {
        return cy;
    }

    public void setCy(float cy) {
        this.cy = cy;
    }
}

}

相关文章

网友评论

      本文标题:一个线性统计图Demo

      本文链接:https://www.haomeiwen.com/subject/wdkoxxtx.html