学习扔物线大大的教程 http://hencoder.com/ui-1-1/ https://github.com/hencoder/PracticeDraw1

饼图的指示文字还需要重新计算一下还有防止小扇区文字可能重叠的情况

    String[] strings = {"Froyo", "GB", "ICS", "JB", "Kitkat", "L", "M"};{
//初始化画笔等
//...paintW.setColor(Color.WHITE);paintW.setStyle(Paint.Style.FILL);paintW.setTextSize(30);paintW.setTextAlign(Paint.Align.CENTER);paintG.setColor(Color.parseColor("#72B916"));
}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//        drawGrid(canvas);Point point = new Point(150, 650);canvas.drawLine(point.x, 100, point.x, point.y, paintW);canvas.drawLine(point.x, point.y, 1050, point.y, paintW);int gapWidth = 20;int girdWidth = 80;for (int i = 0; i < 7; i++) {int gridHeight = (i + 1) * 80;int left = point.x + i * 100 + gapWidth;int top = point.y - gridHeight;int right = left + girdWidth;int bottom = point.y;canvas.drawRect(left, top, right, bottom, paintG);}for (int i = 0; i < 7; i++) {int x = point.x + gapWidth * (i + 1) + (girdWidth) * i + girdWidth / 2;int y = point.y + 30;canvas.drawText(strings[i], x, y, paintW);}}复制代码
public class Practice11PieChartView extends View {private static final String TAG = "Practice11PieChartView";Paint paintArc = new Paint();//扇形画笔Paint mPaint = new Paint();//指示线画笔Paint textPaint = new Paint();//文字画笔RectF rectF = new RectF();int textSize = 30;int height = 0;Point centerPoint = new Point();//圆心float r;//半径public Practice11PieChartView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);height = getHeight() - 300;int left = 200;int top = 50;int right = left + height;int bottom = top + height;rectF = new RectF(left, top, right, bottom);results.add(new Result(180, 120, "#F44336", "Lollipop").setNeedMove(true));results.add(new Result(300, 60, "#FFC107", "Marshmallow"));results.add(new Result(3, 7, "#9C27B0", "Gingerbread"));results.add(new Result(13, 20, "#9E9E9E", "Ice Cream Sandwich"));results.add(new Result(36, 40, "#009688", "Jelly Bean"));results.add(new Result(80, 98, "#2196F3", "KitKat"));centerPoint.x = (right - left) / 2 + left;centerPoint.y = (bottom - top) / 2 + top;r = (right - left) / 2;mPaint.setColor(Color.WHITE);mPaint.setStrokeWidth(1);mPaint.setStyle(Paint.Style.STROKE);textPaint.setColor(Color.WHITE);textPaint.setTextSize(textSize);}ArrayList<Result> results = new ArrayList<>();@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);for (Result result : results) {//画扇形drawArc(canvas, result);//画指示线drawPath(canvas, result);//是否需要离开圆心一些距离drawGap(canvas, result);}}private void drawGap(Canvas canvas, Result result) {if (result.needMove) {canvas.translate(10, 20);}}private void drawPath(Canvas canvas, Result result) {int x = (int) (centerPoint.x + r * Math.cos(result.getHalfAngle() * Math.PI / 180));int y = (int) (centerPoint.y + r * Math.sin(result.getHalfAngle() * Math.PI / 180));//判断指示线方向int[] type = getDirectionArray(x, y);Path path = new Path();path.moveTo(x, y);path.rLineTo(type[2], type[3]);path.rLineTo(type[4], type[5]);switch (type[0]) {case LEFT_TOP:case LEFT_BOTTOM:textPaint.setTextAlign(Paint.Align.RIGHT);break;case RIGHT_TOP:case RIGHT_BOTTOM:textPaint.setTextAlign(Paint.Align.LEFT);break;}canvas.drawPath(path, mPaint);int textX = type[2] + type[4] + x + type[1];int textY = type[3] + type[5] + y + textSize / 3;canvas.drawText(result.name, textX, textY, textPaint);}private int[] getDirectionArray(int x, int y) {int[] arr = new int[6];if (x < centerPoint.x) {arr[1] = arr[2] = -20;arr[4] = -100;arr[5] = 0;if (y < centerPoint.y) {//左上arr[0] = LEFT_TOP;arr[3] = -20;} else {//左下arr[0] = LEFT_BOTTOM;arr[3] = 20;}} else {arr[1] = arr[2] = 20;arr[4] = 100;arr[5] = 0;if (y < centerPoint.y) {//右上arr[0] = RIGHT_TOP;arr[3] = -20;} else {//右下arr[0] = RIGHT_BOTTOM;arr[3] = 20;}}return arr;}// TODO: 2017/7/13  防止重叠final int LEFT_TOP = 0;final int LEFT_BOTTOM = 1;final int RIGHT_TOP = 2;final int RIGHT_BOTTOM = 3;private void drawArc(Canvas canvas, Result result) {paintArc.setColor(result.color);canvas.drawArc(rectF, result.startAngle, result.sweepAngle, true, paintArc);}private static class Result {int startAngle;int sweepAngle;int color;boolean needMove;String name;Result(int startAngle, int sweepAngle, String color, String name) {this.startAngle = startAngle;this.sweepAngle = sweepAngle;this.color = Color.parseColor(color);this.name = name;}float getHalfAngle() {return sweepAngle / 2 + startAngle;}Result setNeedMove(boolean needMove) {this.needMove = needMove;return this;}}
}复制代码

转载于:https://juejin.im/post/5a31ee516fb9a0450c496bca

canvas画柱状图 和饼图相关推荐

  1. canvas 画柱状图

    目录 canvas 画柱状图 画一个简单的柱状图 随机的柱状图 canvas 画柱状图 画一个简单的柱状图 注意点: 画柱状图 矩形图 的时候 需要先填充 后描边 再使用 fillRect 等! ct ...

  2. python画柱状图-python 使用 matplotlib.pyplot来画柱状图和饼图

    导入包 import matplotlib.pyplot as plt 柱状图 最简柱状图 # 显示高度 def autolabel(rects): for rect in rects: height ...

  3. python中matplotlib库饼图_python 使用 matplotlib.pyplot来画柱状图和饼图

    导入包 import matplotlib.pyplot as plt 柱状图 最简柱状图 # 显示高度 def autolabel(rects): for rect in rects: height ...

  4. 如何用h5标签canvas画柱状图【立体】

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8 ...

  5. 关于星空的java小程序_[Java教程]小程序使用Canvas画饼图_星空网

    小程序使用Canvas画饼图 2018-10-24 0 先上效果图 -------------------------------------------------------------w --- ...

  6. matplotlib 柱状图、饼图;直方图、盒图

    matplotlib 柱状图.饼图:直方图.盒图 #-*- coding: utf-8 -*-import matplotlib.pyplot as plt import numpy as np im ...

  7. php画圆 锯齿,优雅的解决canvas画圆锯齿问题

    canvas 解决canvas画圆锯齿问题 之前做一各项目需要画一个饼图,于是使用HTML5的canvas元素画出来的.一看在移动端手机上测试都发现画图有一点锯齿明显问题, 1 效果如下 代码如下 v ...

  8. html绘制直角坐标系,canvas画直角坐标系

    canvas画直角坐标系 2017年3月17日 利用canvas画直角坐标系其实挺简单的,只要确定了原点(0,0)点,也可以是其他的点,只要自己知道那是原点就行!知道了原点再分别向X轴方向和Y轴方向画 ...

  9. python(matplotlib)画柱状图(1)

    写在前面的话 当当当,又要总结画图了,现在写博客都有一种美妆博主在写美妆心得的介绍.biubiu- 今天要记录的内容就是我们的python 画柱状图. 画柱状图一般我觉得就是数据可以被枚举的有限的,并 ...

最新文章

  1. Linux shell 学习笔记(12)— linux 信号、后台运行脚本、作业控制、定时运行任务
  2. 百度王海峰:多模态深度语义理解将让AI更深地理解真实世界
  3. Linux - MiniFtp实现
  4. 十分经典的批处理教程
  5. 重磅!PyTorch 中文手册已开源!理论、实践、应用都有了!
  6. nginx log_format 中的变量
  7. 【强烈推荐】程序猿们,九度Online Judge开始举办月赛啦!!会编程才是王道!!!!!
  8. Rundll32使用技巧
  9. redis 源码 ziplist.c 压缩list的实现
  10. 怎样安装两个tomcat,怎样配置
  11. Effective Java 在工作中的应用总结
  12. 一次性掌握机器学习基础知识脉络
  13. Nuxt.Js爬坑小记
  14. 软件工程需求分析文档模板
  15. python金融衍生品有哪些_什么是金融衍生品,金融衍生品有哪些?
  16. 2022-7 一套鼠标键盘控制两台及以上电脑
  17. Qt自定义控件--QQ表情
  18. NOIP2018备战笔记
  19. 2019年英语四级作文
  20. 如何正确对用户密码进行加密?转自https://blog.csdn.net/zhouyan8603/article/details/80473083...

热门文章

  1. 迪士尼研究院等将人造“神经纤维”用于软体机器人,赋予其“本体感知能力”!...
  2. 【周末阅读】工业互联网的发展历程及实现路径
  3. 李彦宏/王坚/王传福等上榜“中国工程院2019院士增选候选人”引争议,实至名归吗?...
  4. AI与基因科学的对话:从“人工智能”到“动物智能”
  5. 00后的简历有多野?!!
  6. 打王者、调小酒、搭乐高,大厂女程序员的别样人生
  7. CSDN 插件限时内测,新用户抢永久免费去广告特权!
  8. HDU-2044-一只小蜜蜂
  9. Mysql binlog日志及binlog恢复数据库操作
  10. iOS NSString中实用的方法