【android】绘制圆环的三种方式

在android中要绘制圆环,暂时知道有三种方式。分别是:

一、设置画笔的style为stoke,绘制圆

这里是先绘制内圆,然后绘制圆环(圆环的宽度就是paint设置的paint.setStrokeWidth的宽度),最后绘制外圆。

请看核心源码:

[java] view
plain
copyprint?

  1. <span xmlns="http://www.w3.org/1999/xhtml" style="">package yan.guoqi.rectphoto;
  2. import android.content.Context;
  3. import android.graphics.Canvas;
  4. import android.graphics.Color;
  5. import android.graphics.Paint;
  6. import android.graphics.Paint.Style;
  7. import android.graphics.RectF;
  8. import android.util.AttributeSet;
  9. import android.widget.ImageView;
  10. public class DrawImageView extends ImageView {
  11. private final Paint paint;
  12. private final Context context;
  13. public DrawImageView(Context context, AttributeSet attrs) {
  14. super(context, attrs);
  15. // TODO Auto-generated constructor stub
  16. this.context = context;
  17. this.paint = new Paint();
  18. this.paint.setAntiAlias(true); //消除锯齿
  19. this.paint.setStyle(Style.STROKE);  //绘制空心圆或 空心矩形
  20. }
  21. @Override
  22. protected void onDraw(Canvas canvas) {
  23. // TODO Auto-generated method stub
  24. int center = getWidth()/2;
  25. int innerCircle = dip2px(context, 83); //内圆半径
  26. int ringWidth = dip2px(context, 10);   //圆环宽度
  27. // 第一种方法绘制圆环
  28. //绘制内圆
  29. this.paint.setARGB(255, 138, 43, 226);
  30. this.paint.setStrokeWidth(2);
  31. canvas.drawCircle(center, center, innerCircle, this.paint);
  32. //绘制圆环
  33. this.paint.setARGB(255, 138, 43, 226);
  34. this.paint.setStrokeWidth(ringWidth);
  35. canvas.drawCircle(center, center, innerCircle + 1 +ringWidth/2, this.paint);
  36. //绘制外圆
  37. this.paint.setARGB(255, 138, 43, 226);
  38. this.paint.setStrokeWidth(2);
  39. canvas.drawCircle(center, center, innerCircle + ringWidth, this.paint);
  40. super.onDraw(canvas);
  41. }
  42. /* 根据手机的分辨率从 dp 的单位 转成为 px(像素) */
  43. public static int dip2px(Context context, float dpValue) {
  44. final float scale = context.getResources().getDisplayMetrics().density;
  45. return (int) (dpValue * scale + 0.5f);
  46. }
  47. }
  48. </span>

总结:

1,这种分三次来绘制的方法,可以将圆环的内圆 圆环 和外圆的颜色设成不一样的,对paint进行三次设置。还可以将绘制圆环的paint透明度设成10左右就会有圆环透明的效果。

2,三次绘制时的canvas.drawCircle圆心都是(center,center),但三次半径确实不一样的。尤其是第二次绘制圆环的时候,半径是innerCircle + 1 +ringWidth/2。这里的加1是第一次外圆paint.setStrokeWidth(2);宽度设成2,也就是说单条线的宽度1。后面的ringWidth/2也是同理。

示例如下(底色是预览摄像头的视频):

二、利用canvas.drawArc实现

上文已经绘制了圆环,但仔细分析就知,如果只需要圆环的话,那么只绘制圆环就可以,不用画内圆和外圆了。事实证明也是如此。

但是要做成和下面的圆环透明度不一的效果上面的方法还是达不中:

用drawCircle不中了,经查android提供了绘制圆弧的函数drawArc,参考http://zhidao.baidu.com/question/469977150.html,也可以看这里http://blog.chinaunix.net/uid-23392298-id-3345789.html

canvas.drawArc(new RectF(0, 0, 128, 128), 0, 360, true, new Paint(
Paint.ANTI_ALIAS_FLAG));
参数1:圆的范围大小
参数2:起始角度
参数3:圆心角角度,360为圆,180为半圆
参数4:中心
参数5:画笔Paint,可以设置画线or填充,设置颜色,设置线的粗细等等第四个参数

最关键的是第一个参数RectF,在什么地方绘制圆弧就是由这个矩形的位置确定的。根据上文,这个RectF应该是内切圆弧的外圆(尽管没画,但还是有)。所以其左上点及右下点坐标为:

RectF rect2 = new RectF(center-(innerCircle + 1 +ringWidth/2),center-(innerCircle + 1 +ringWidth/2), center+(innerCircle + 1 +ringWidth/2), center+(innerCircle + 1 +ringWidth/2));

为了绘制出透明度不同的圆环分两部来绘制:

this.paint.setARGB(200, 127, 255, 212);

this.paint.setStrokeWidth(ringWidth);

//绘制不透明部分

canvas.drawArc(rect2, 180+startAngle, 90, false, paint);

canvas.drawArc(rect2, 0+startAngle, 90, false, paint);

//绘制透明部分

this.paint.setARGB(30, 127, 255, 212);

canvas.drawArc(rect2, 90+startAngle, 90, false, paint);

canvas.drawArc(rect2, 270+startAngle, 90, false, paint);

上面的代码当startAngle = 0时,绘制的是一个静态的透明度交替的圆弧。接着要让它转起来。增加代码:

startAngle+=10;

if(startAngle == 180)

startAngle = 0;

事实上后两句也可以不增加,仿照前文SurfaceView绘制旋转动画的例子用这种求余的思想,(rotate += 48) % 360,把上面角度也弄个%360,也是可以的。

剩下的事就是让这个东西循环执行了。在super.onDraw(canvas);这句代码后面加 invalidate();就可以了!透明圆环就转起来了。

三、先绘制外圆,再把外圆中内圆所占的区域擦除

					canvas.drawCircle(mCirX, mCirY, mRadius, paint);
					paint.setAlpha(0);
					paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
					canvas.drawCircle(mCirX, mCirY, mRadius-mRingWidth, paint);

参考:http://blog.csdn.net/yanzi1225627/article/details/8581840

http://blog.csdn.net/yanzi1225627/article/details/8581897

时间: 2024-10-09 18:23:51

【android】绘制圆环的三种方式的相关文章

详解android解析Xml的三种方式——DOM、SAX以及XMLpull

今天学习了android解析Xml的三种方式——DOM.SAX以及XMLpull,这里对它们进行总结. 如果理解有误,欢迎指正   ^_* 一.DOM方式解析: xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据.这个写起来很简单,但是很消耗内存.要是数据过大,手机不够牛逼,可能手机直接死机. 常用的DoM接口和类: Document:该接口定义分析并创建DOM文档的一系列方法,它是文档树的根,是操作DOM的基础.Element:该接口继承Node接口,提供了获

【Android进度条】三种方式实现自定义圆形进度条ProgressBar

一.通过动画实现 定义res/anim/loading.xml如下: [html] view plaincopyprint? <?xml version="1.0" encoding="UTF-8"?> <animation-list android:oneshot="false" xmlns:android="http://schemas.android.com/apk/res/android"> &

Android处理XML的三种方式

http://www.cnblogs.com/zhangdongzi/archive/2011/04/14/2016434.html http://blog.csdn.net/zzp16/article/details/7795410 http://www.ibm.com/developerworks/cn/xml/x-android/ http://www.cnblogs.com/devinzhang/archive/2012/01/16/2323668.html http://mobile.

Android合并文件的三种方式代码

amr格式的文件头是6字节,在进行文件合并的时候要减去除第一个文件以外的其他文件的文件头.下面介绍合并文件的几种方式,并通过合并amr文件来举例介绍合并文件的具体流程. 注意:不同文件的文件头是不一样的,所以在合并的时候根据不同文件相应的减去合并文件的文件头.具体你可以学习Android开发教程. 步骤一:获取要合并的文件及创建合并后保存的文件 /**用于存放要合并的文件的集合**/List<File>tempFiles=new ArrayList<File>();/**合并之后的

Android数据存储的三种方式-SharedPrefrences,File,SQLite

1,使用SharedPrefrences 用于简单少量的数据,数据的格式简单:都是普通的字符串,标量类型的值等,比如各种配置信息等等 SharedPrefrences与Editor简介: 创建SharedPreferences实例,通过Context.getSharedPreferences(String name,int mode);方法来获取SharedPreferences的实例 mode的值: *Context.MODE_PRIVATE;该SharedPreferences数据只能被本应

Android Studio三种方式导入外部资源 以及 报错处理

android studio提供了三种方式导入外部资源: 1. Library dependency – 在线添加.需联网下载 2. File dependency – 从本地添加一些jar包(要先将jar包拷贝到项目的libs文件夹下) 3. Module dependency – 从本地添加带有源码的库工程(要先 import Moudle 将库工程导入项目中) 其中第三种方式导入会报一些错误,这里以github上的开源框架android-async-http 为例,给出一种导入的步骤并尝试

Android自定义View的三种实现方式

在毕设项目中多处用到自定义控件,一直打算总结一下自定义控件的实现方式,今天就来总结一下吧.在此之前学习了郭霖大神博客上面关于自定义View的几篇博文,感觉受益良多,本文中就参考了其中的一些内容. 总结来说,自定义控件的实现有三种方式,分别是:组合控件.自绘控件和继承控件.下面将分别对这三种方式进行介绍. (一)组合控件 组合控件,顾名思义就是将一些小的控件组合起来形成一个新的控件,这些小的控件多是系统自带的控件.比如很多应用中普遍使用的标题栏控件,其实用的就是组合控件,那么下面将通过实现一个简单

android解析XML总结-SAX、Pull、Dom三种方式

在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX.Pull.Dom解析方式.最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一次总结. xml示例(channels.xml)如下: <?xml version="1.0" encoding="utf-8"?> <channel> <item id="0&q

OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰)

前文曾具体探讨了关于OpenCV的使用,原本以为天下已太平.但不断有人反应依旧配不好OpenCV4Android,不能得心应手的在Android上使用OpenCV.大量的精力都浪费在摸索配置上.尤其是OpenCVManager诞生之后.更让人无语.大家第一个反应就是怎样才干不安装OpenCVManager.由于要多安装这个东西对客户来说体验太不好了. 咱家昨夜研究至两点,今早七点起床.最终把头绪理清了. 以下咱家以之前做过的一个基于OpenCV2.3.1.android通过jni调用opencv