最近在学习android的画图所以就学习了一下。看了很多资料。特别是爱哥的博客,学习了很多,我也要分享一下:

首先画个圆(简单的很):
自定义的View
设置好paint,canvas.drawCircle()就行,上代码

public Circle02(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);paint = new Paint();//抗锯齿paint.setAntiAlias(true);//Style.FILL就是实心的圆,Style.STROKE只画圆的边,Style.FILL_AND_STROKE有边有实心paint.setStyle(Style.FILL);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);//获得圆心center_x = getMeasuredWidth() / 2 ; center_y = getMeasuredHeight() / 2 ;//取小的为半径r = Math.min(getMeasuredWidth() / 2, getMeasuredHeight() / 2);}@Overrideprotected void onDraw(Canvas canvas) {paint.setARGB(255, 255, 0, 255);canvas.drawCircle(center_x, center_y, r, paint);
getRight(), getBottom(), paint);super.onDraw(canvas);}


画饼图:再画一个扇形呗,改一下onDraw就行了

@Overrideprotected void onDraw(Canvas canvas) {paint.setARGB(255, 255, 0, 255);canvas.drawCircle(center_x, center_y, r, paint);//onDraw尽量不要new,这样很耗内存,这里我偷懒了RectF oval = new RectF(center_x - r, center_y - r, center_x + r, center_y + r);paint.setColor(Color.parseColor("#FFFF00"));//第一个参数数为RectF,第二个参数是起始角度(-90到270),第三个参数扫过多少角度//第四个参数要不要过中心试一试就知道有什么不同,第五个就是画笔canvas.drawArc(oval,0,97,true,paint);super.onDraw(canvas);}


知道画圆,画环就差不多,很多记录步数,就可以用这样的图
代码中我会有注解,应该能明白

@Overrideprotected void onDraw(Canvas canvas) {RectF oval = new RectF(center_x-r, center_y - r, center_x + r, center_y + r);//出现颜色渐变的过程,第一,二两个参数就是渐变开始的X,Y坐标//new int[]{0xFFE9E9E9,0xFFFFFFFF}渐变的颜色mShader = new SweepGradient( center_x , center_y - r ,new int[]{0xFFE9E9E9,0xFFFFFFFF},null );paint.setARGB(255, 255, 222, 226);paint.setStrokeCap(Cap.ROUND);paint.setStrokeWidth(10);paint.setShader(mShader);canvas.drawArc(oval,-70, 320, false, paint);        //第二个环,通过progress控制环扫过多少,是不是可以用来设置步数paint.reset();paint.setStrokeCap(Cap.ROUND);paint.setAntiAlias(true);paint.setStyle(Style.STROKE);paint.setStrokeWidth(circleWidth);paint.setARGB(255, 138, 43, 226);canvas.drawArc(oval, -90, progress, false, paint);//画中间的数字paint.setColor(Color.parseColor("#000000"));paint.setTextSize(30);paint.setStrokeWidth(1);//水平居中paint.setTextAlign(Align.CENTER);FontMetricsInt fontMetricsInt = paint.getFontMetricsInt();canvas.drawText(String.valueOf(progress), center_x, center_y - fontMetricsInt.ascent / 2, paint);super.onDraw(canvas);}


这样的圆用来计步的会更加多一点,是如何做到的呢?其实就多了一个PathEffect,看代码吧

    @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);center_x = getWidth() / 2 ; center_y = getHeight() / 2 ;oval.left = center_x - r;oval.right = center_x + r;oval.top = center_y - r;oval.bottom = center_y + r;//出现断断续续的效果,2表示画实的距离,3表示空的距离effect = new DashPathEffect(new float[]{2,3},0);paint.setPathEffect(effect);/* * 设置描边的粗细,单位:像素px * 注意:当setStrokeWidth(0)的时候描边宽度并不为0而是只占一个像素 */  paint.setStrokeWidth(width);paint.setColor(Color.RED);      canvas.drawArc(oval, -90, 360, false, paint);}

    @Overrideprotected void onDraw(Canvas canvas) {BitmapDrawable drawable = (BitmapDrawable) getDrawable();if (null != drawable) {Bitmap b = drawable.getBitmap();b = getCircleBitmap(b);rectSrc.left = 0;rectSrc.top = 0;rectSrc.right = b.getWidth();rectSrc.bottom = b.getHeight();rectDest.left = 0;rectDest.top = 0;rectDest.right = getWidth();rectDest.bottom = getHeight();paint.reset();canvas.drawBitmap(b, rectSrc, rectDest, paint);} else {super.onDraw(canvas);}}Canvas mCanvas;/*** 通过设置paint的setXfermode,两张图片叠加的不同模式。来达到圆形图片的效果 1.画DST 2.setXfermode 3.画SRC* * @param bitmap*            圆形图片* @return*/private Bitmap getCircleBitmap(Bitmap bitmap) {Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Config.ARGB_8888);mCanvas = new Canvas(output);int color = 0xff424242;Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());paint.setAntiAlias(true);paint.setColor(color);// 准备一张src图,(中间一个圆,四周透明)Bitmap srcBitmap = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Config.ARGB_8888);Canvas mCanvas2 = new Canvas(srcBitmap);// 透明度为0很关键mCanvas2.drawARGB(0, 0, 0, 0);int x = bitmap.getWidth();int y = bitmap.getHeight();paint.setStyle(Style.FILL);paint.setColor(Color.RED);mCanvas2.drawCircle(x / 2, y / 2, Math.min(x / 2, y / 2), paint);// 1.画DST 2.setXfermode 3.画SRCmCanvas.drawBitmap(bitmap, rect, rect, null);paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));mCanvas.drawBitmap(srcBitmap, rect, rect, paint);return output;}

跟据PorterDuffXfermode.Mode可以画出很多图像,也可以用其他模式化圆形图片

Android画各种圆,饼图,环图,圆形图片相关推荐

  1. echarts多个饼图环图中间固定文字,鼠标移入后出现相应的提示

    项目中遇到这种需求,有两种解决方法, 一.在echarts的配置手册中搜graphic属性,并配置,可以在圈内显示固定的文字 graphic: [{ //环形图中间添加文字type: 'text', ...

  2. 【软件工程】McCabe方法,输入三角形三边,判断三角形性状,画出流程图和环图,计算环形复杂度,要求有判断是否能构成三角形的条件。

    话不多说,直接上图解,知识点在最后. 流程图 环图 环形复杂度 整合 知识点 环型复杂度的三种计算方法 V(G) = 流图中的区域数 V(G) = 流图中的判定数 + 1 V(G) = E - N + ...

  3. Android中使用自定义的view实现圆形图片的效果

    今天给大家讲的是怎么在xml文件找中通过引用自定义的view实现ImageView的圆形图片效果.首先在你的项目中新建一个类,我给它命名为:CircleImageView:然后在res目录下的valu ...

  4. Android自定义View实现不断旋转的圆形图片

    自定义View是android开发的一个重要技能,用android提供的2/3D绘制相关类可以实现非常多炫酷的效果,需要实打实的编程基础.(吧). 但是自定义View又是我的弱项,所以最近都在摸索.练 ...

  5. Android 仿百度网页音乐播放器圆形图片转圈播放效果

    百度网页音乐播放器的效果  如下 : http://www.baidu.com/baidu?word=%E4%B8%80%E7%9B%B4%E5%BE%88%E5%AE%89%E9%9D%99& ...

  6. 数据可视化 d3操作汇总(二):圆弧、饼图、环图、玫瑰图绘制

    一.圆环绘制 圆环绘制必须要先有一个弧生成器,必须提供的参数有起始角度和中止角度,例如: var dataset = { startAngle: 0 , endAngle: Math.PI * 0.7 ...

  7. C# 控件Chart的 圆饼图百分比

    开发环境: 基于 VS2019 基于C#语言 解决问题 用C# 控件Chart 画出 圆饼图百分比,很直观 结果展示 4.源代码下载地址: https://download.csdn.net/down ...

  8. opencv 学习第三课 画线段 圆 椭圆 矩形 多边形 插入文字 代码注释版 保证你每一行都能读懂

    import numpy as np import cv2 as cv # 创建一张大小为512×512,通道数为3的黑色的图片 img = np.zeros((512,512,3), np.uint ...

  9. android glide圆形图片,Glide原生方法加载圆形图片

    项目中需要用圆形图片,我们知道,Android原生是没有好用的圆形图片的,何况还要网络加载什么的.今天找了下Glide加载圆形图片的方法,基本都是这种,说得倒是很明白的,但是我自己加载时候没有找到相应 ...

最新文章

  1. 重新编译iptables
  2. 20个精美图表,教你玩转 Pyecharts 可视化
  3. 转:UCI数据集和源代码数据挖掘的数据集资源
  4. 操作api_币安多币种自动化策略API操作指南
  5. Apache Flink 零基础入门(十七)Flink 自定义Sink
  6. 小议传统分层与新式分层,抑或与DDD分层
  7. python协成_Python协程(上)
  8. Ansible批量修改root密码
  9. 毕设题目:Matlab优化调度
  10. python3笔记-文件操作
  11. linux以二进制查看文件内容,Linux下二进制文件的查看和编辑
  12. 差分约束——vijos1589
  13. android 修改系统默认语言
  14. 【LG3244】[HNOI2015]落忆枫音
  15. 概率论基础 —— 8.数学期望、方差、协方差
  16. 多测师肖sir_高级讲师_第2个月第17讲讲解接口面试题
  17. 《大话数据结构》读书笔记-树
  18. 中兴c600olt数据配置_中兴OLT配置脚本
  19. 如何从 Android 手机恢复丢失的联系人
  20. 对于ios7扫描二维码功能的实现

热门文章

  1. 抽象代数----轨道G(x)是等价关系
  2. 11月23日:PHP中tp框架的入门以及mvc模式的了解
  3. JAVA语言实现计算器小项目(与Windows附件自带计算器的标准版功能、界面相仿)
  4. 香港公司开户多少钱选个哪个银行比较好
  5. 0009基于51单片机智能门禁系统设计
  6. 4月4日学习总结及次日计划
  7. IDEA配置SVN同步路径
  8. java中的native方法性能到底怎么样?
  9. 不用傅里叶变换,提取某一频率的幅值和相位
  10. CentOS 代理 proxy设置方法