zoukankan      html  css  js  c++  java
  • Android 饼图绘制

    private BlurMaskFilter PaintBGBlur;
    private int ScrHeight;
    private int ScrWidth;
    private Paint[] arrPaintArc;
    private Paint PaintText = null;
    private Path pathArc = null;
    private RectF arcRF0 = null;
    private int[] colors = new int[] { Color.RED, Color.BLUE, };
    // 演示用的比例,实际使用中,即为外部传入的比例参数
    private int arrPer[] = new int[] { 100, 0 };

    private String typeText[] = new String[] {"已读","未读"};

    private int total = 0;

    public ChartContentView(Context context, int[] colors, int[] per, String[] typeText) {
    super(context);

    // 初始化数据
    initData(colors, per, typeText);

    initView();
    }

    /**
    * 初始化页面
    */
    private void initView() {
    // 解决4.1版本以下canvas.drawTextOnPath()不显示问题
    this.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    // 屏幕信息
    DisplayMetrics dm = getResources().getDisplayMetrics();
    ScrHeight = dm.heightPixels;
    ScrWidth = dm.widthPixels;
    // 设置边缘特殊效果
    PaintBGBlur = new BlurMaskFilter(1, BlurMaskFilter.Blur.INNER);

    arrPaintArc = new Paint[colors.length];
    for (int i = 0; i < colors.length; i++) {
    arrPaintArc[i] = new Paint();
    arrPaintArc[i].setColor(colors[i]);
    arrPaintArc[i].setStyle(Paint.Style.FILL);
    arrPaintArc[i].setStrokeWidth(4);
    arrPaintArc[i].setMaskFilter(PaintBGBlur);
    }

    PaintText = new Paint();
    PaintText.setColor(Color.BLACK);
    PaintText.setTextSize(25);
    PaintText.setTypeface(Typeface.DEFAULT_BOLD);

    pathArc = new Path();
    arcRF0 = new RectF();
    }

    public void onDraw(Canvas canvas) {
    // 画布背景
    canvas.drawColor(Color.TRANSPARENT);

    if (arrPer.length > arrPaintArc.length || arrPer.length > colors.length || arrPer.length > typeText.length || arrPer.length <= 0) {
    return;
    }

    float cirX = ScrWidth / 2;
    float cirY = ScrHeight / 3;
    float radius = ScrHeight / 5;

    float arcLeft = cirX - radius;
    float arcTop = cirY - radius;
    float arcRight = cirX + radius;
    float arcBottom = cirY + radius;
    arcRF0.set(arcLeft, arcTop, arcRight, arcBottom);
    // x,y,半径,CW为顺时针绘制
    pathArc.addCircle(cirX, cirY, radius, Direction.CW);
    // 绘出饼图大轮廓
    canvas.drawPath(pathArc, arrPaintArc[0]);
    float CurrPer = 0f; // 偏移角度
    float Percentage = 0f; // 当前所占比例
    int scrOffsetW = ScrWidth - 200;
    int scrOffsetH = ScrHeight - 300;
    int scrOffsetT = 40;

    for (int i = 0; i < arrPer.length; i++) {
    if (i != 0) {
    // 将百分比转换为饼图显示角度
    Percentage = 360 * ((float) arrPer[i] / (float) total);
    Percentage = (float) (Math.round(Percentage * 100)) / 100;
    // 在饼图中显示所占比例
    canvas.drawArc(arcRF0, CurrPer, Percentage, true,
    arrPaintArc[i]);
    }

    // 当前颜色
    canvas.drawRect(scrOffsetW - 60, scrOffsetH + i * scrOffsetT,
    scrOffsetW, scrOffsetH - 30 + i * scrOffsetT,
    arrPaintArc[i]);
    // 当前比例
    canvas.drawText(typeText[i] + String.valueOf(arrPer[i]) + "条",
    scrOffsetW, scrOffsetH + i * scrOffsetT, PaintText);

    // 下次的起始角度
    CurrPer += Percentage;
    }

    }

    /**
    * 改变数据,刷新画面
    *
    * @param colors
    * @param per
    * @param typeText
    */
    public void changeData(int[] colors, int[] per, String[] typeText) {
    initData(colors, per, typeText);

    invalidate();
    }

    /**
    * 初始化数据
    *
    * @param colors
    * @param per
    * @param typeText
    */
    private void initData(int[] colors, int[] per, String[] typeText) {
    if (colors != null && colors.length > 0) {
    this.colors = colors;
    }
    else {
    this.colors = new int[] {};
    }
    total = 0;
    if (per != null && per.length > 0) {
    this.arrPer = per;
    for (int i = 0; i < per.length; i++) {
    total += per[i];
    }
    }
    else {
    this.arrPer = new int[] {};
    }
    if (typeText != null && typeText.length > 0) {
    this.typeText = typeText;
    }
    else {
    this.typeText = new String[] {};
    }
    }

  • 相关阅读:
    解决 EDAS:Upload failed: The right margin is 0.535 in on page 1 问题
    解决 ImportError: No module named _internal
    静态页面如何实现 include 引入公用代码
    一个用 js 实现点阵图的编辑器演示
    从 art-template 模版维护到动态加载的思考
    Atom 备份神器 —— Sync Settings
    clicaptcha中文点击验证码开发经验总结
    通过 imagick 让 PHP 生成 PSD 文件缩略图
    让视频压制更简单
    Medoo个人修改版
  • 原文地址:https://www.cnblogs.com/chenlong-50954265/p/3924629.html
Copyright © 2011-2022 走看看