Android 绘制圆环
使用画圆弧的方式绘制圆环和进度条,使用sweepGradient进行渐变。
参考链接
http://blog.csdn.net/u011494050/article/details/39251239
http://www.jianshu.com/p/6c5e4dce11aa
代码
package com.example.tony.ring;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.SweepGradient;
import android.util.Log;
import android.view.View;
/**
* Created by Tony on 2016/7/6.
*/
public class DrawRing extends View {
private int ballX = 300;
private int ballY = 300;
private int radius = 100;
private int width = 30;
private int startAngle = 360;
private int angleSpeed = 1;
public DrawRing(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
CircleRing cRing = new CircleRing(ballX, ballY, radius, width, Color.RED);
cRing.drawCircleRing(canvas, startAngle);
ProgressRing pRing = new ProgressRing(ballX , ballY + 300, radius, width, Color.RED);
pRing.drawProgressRing(canvas, startAngle);
/*
if (startAngle <= 0) {
angleSpeed = 1;
} else if (startAngle >= 90) {
angleSpeed = -1;
}
*/
startAngle += angleSpeed;
if (startAngle == 360)
startAngle = 0;
// startAngle %= 360;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
invalidate();
}
}
class CircleRing {
int ringX;
int ringY;
int ringRadius;
int ringWidth;
Paint paint;
// public CircleRing(int ringX, int ringY, int ringRadius, int ringWidth, int ringColor, int startAngle) {
public CircleRing(int ringX, int ringY, int ringRadius, int ringWidth, int ringColor) {
this.ringX = ringX;
this.ringY = ringY;
this.ringRadius = ringRadius;
this.ringWidth= ringWidth;
paint = new Paint();
paint.reset();
paint.setColor(ringColor);
paint.setAntiAlias(true); //消除锯齿
paint.setStrokeWidth(ringWidth);
paint.setStyle(Paint.Style.STROKE); //绘制空心圆或 空心矩形,只显示边缘的线,不显示内部
}
public void drawCircleRing(Canvas canvas, int startAngle) {
RectF rect = new RectF(ringX - ringRadius, ringY - ringRadius, ringX + ringRadius, ringY + ringRadius);
//false 不画圆心
paint.setAlpha(255);
canvas.drawArc(rect, startAngle + 0, 90, false, paint);
canvas.drawArc(rect, startAngle + 180, 90, false, paint);
paint.setAlpha(100);
canvas.drawArc(rect, startAngle + 90, 90, false, paint);
canvas.drawArc(rect, startAngle + 270, 90, false, paint);
}
}
class ProgressRing {
int ringX;
int ringY;
int ringRadius;
int ringWidth;
int headBallX;
int headBallY;
Paint paint;
Shader sweepGradient;
//private static final int RED = 230, GREEN = 85, BLUE = 35; //基础颜色,这里是橙红色
private static final int RED = 230, GREEN = 0, BLUE = 0; //基础颜色,这里是橙红色
private static final int MIN_ALPHA = 30; //最小不透明度
private static final int MAX_ALPHA = 255; //最大不透明度
/*
//圆环颜色
//渐变顺序不同,显示的方向不同
private static int[] changeColors = new int[]{
Color.argb(MAX_ALPHA, RED, GREEN, BLUE),
Color.argb(MIN_ALPHA, RED, GREEN, BLUE),
Color.argb(MIN_ALPHA, RED, GREEN, BLUE),
// Color.TRANSPARENT,
};
*/
private static int[] changeColors = new int[]{
Color.argb(MIN_ALPHA, RED, GREEN, BLUE),
Color.argb(MIN_ALPHA, RED, GREEN, BLUE),
Color.argb(MAX_ALPHA, RED, GREEN, BLUE),
// Color.TRANSPARENT,
};
public ProgressRing(int ringX, int ringY, int ringRadius, int ringWidth, int ringColor) {
this.ringX = ringX;
this.ringY = ringY;
this.ringRadius = ringRadius;
this.ringWidth= ringWidth;
paint = new Paint();
paint.reset();
paint.setColor(ringColor);
paint.setAntiAlias(true); //消除锯齿
paint.setStrokeWidth(ringWidth);
paint.setStyle(Paint.Style.STROKE); //绘制空心圆或 空心矩形,只显示边缘的线,不显示内部
}
public void drawProgressRing(Canvas canvas, int rotateDegree) {
paint.reset();
RectF rect = new RectF(ringX - ringRadius, ringY - ringRadius, ringX + ringRadius, ringY + ringRadius);
paint.setAntiAlias(true);
paint.setStrokeWidth(ringWidth);
paint.setStyle(Paint.Style.STROKE);
//设置渐变
sweepGradient = new SweepGradient(ringX, ringY, changeColors, null);
//按照圆心旋转
Matrix matrix = new Matrix();
matrix.setRotate(rotateDegree, ringX, ringY);
sweepGradient.setLocalMatrix(matrix);
paint.setShader(sweepGradient);
canvas.drawArc(rect, 0, 360, false, paint);
//绘制进度环开头的小圆点
paint.reset();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.argb(MAX_ALPHA, RED, GREEN, BLUE));
//使用三角函数时,需要把角度转为弧度
headBallX = ringX + (int)(ringRadius * Math.cos((double)rotateDegree/180 * Math.PI));
Log.e("degree", "degree: " + rotateDegree + "cos: " + Math.cos((double)rotateDegree/180 * Math.PI));
headBallY = ringY + (int)(ringRadius * Math.sin((double)rotateDegree/180 * Math.PI));
canvas.drawCircle(headBallX, headBallY, ringWidth/ 2, paint);
}
}
显示效果

Author
Tony Liu
2016-7-6, Shenzhen
Android 绘制圆环的更多相关文章
- 自己定义View之绘制圆环
一.RingView 自己定义的view,构造器必须重写,至于重写哪个方法,參考例如以下: ①假设须要改变View绘制的图像,那么须要重写OnDraw方法.(这也是最经常使用的重写方式.) ②假设须要 ...
- android绘制view的过程
1 android绘制view的过程简单描述 简单描述可以解释为:计算大小(measure),布局坐标计算(layout),绘制到屏幕(draw): 下面看看每一步的动作到底是 ...
- 【转】Android绘制View的过程研究——计算View的大小
Android绘制View的过程研究——计算View的大小 转自:http://liujianqiao398.blog.163.com/blog/static/18182725720121023218 ...
- Android绘制流程
一.前言 1.1.C++界面库 MFC.WTL.DuiLib.QT.Skia.OpenGL.Android里面的画图分为2D和3D两种: 2D是由Skia 来实现的,3D部分是由OpenGL实现的. ...
- Android绘制优化(二)布局优化
前言 我们知道一个界面的测量和绘制是通过递归来完成的,减少布局的层数就会减少测量和绘制的时间,从而性能就会得到提升.当然这只是布局优化的一方面,那么如何来进行布局的分析和优化呢?本篇文章会给你一个满意 ...
- Android绘制优化(一)绘制性能分析
前言 一个优秀的应用不仅仅是要有吸引人的功能和交互,同时在性能上也有很高的要求.运行Android系统的手机,虽然配置在不断的提升,但仍旧无法和PC相比,无法做到PC那样拥有超大的内存以及高性能的CP ...
- Swift - EasingAnimation绘制圆环动画
Swift - EasingAnimation绘制圆环动画 效果 源码 https://github.com/YouXianMing/Swift-Animations // // CircleView ...
- 第165天:canvas绘制圆环旋转动画
canvas绘制圆环旋转动画——面向对象版 1.HTML 注意引入Konva.js库 <!DOCTYPE html> <html lang="en"> &l ...
- 理解Android绘制视图的方式
在创建自定义ViewGroup前,读者首先需要理解Android绘制视图的方式.我不会涉及过多细节,但是需要读者理解Android开发文档(见3.5节)中的一段话,这段话解释如何绘制一个布局.内容如下 ...
随机推荐
- iPhone真机调试流程
大致流程:绑定设置ID--绑定电脑---绑定appbundle ID mac----钥匙串----证书助理-----从证书机构请求颁发证书-----填写邮件----生成证书到桌面 数据线连接设备--- ...
- 使用hasOwnProperty监测对象是否含有某个属性
1.示例代码 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UT ...
- [Done]com.aerospike.client.AerospikeException: Error Code 12: Bin type error
今天遇到了一个问题:com.aerospike.client.AerospikeException: Error Code 12: Bin type error 异常栈: 网上找了一些资料:https ...
- Python中的迭代器漫谈
转自:http://www.jb51.net/article/60706.htm 熟悉Python的都知道,它没有类似其它语言中的for循环, 只能通过for in的方式进行循环遍历.最典型的应用就是 ...
- Android 打造完美的侧滑菜单/侧滑View控件
概述 Android 打造完美的侧滑菜单/侧滑View控件,完全自定义实现,支持左右两个方向弹出,代码高度简洁流畅,兼容性高,控件实用方便. 详细 代码下载:http://www.demodashi. ...
- 【TP3.2.3】微信网页授权--基类
非常好用的微信授权 基类:其他的微信权限类都可以继承至该类: <?php namespace Wechat\Controller; use Think\Controller; //微信接口基础类 ...
- SQL数据库异地备份
服务器:windows sever 2008(简称为A) 数据库:SQL server 2008 R2(安装在A上) 普通台式机:windows 7(简称为B) 目的:将A中的数据定时自动备份到B中 ...
- CDH quick start VM 中运行wordcount例子
需要注意的事情: 1. 对于wordcount1.0 ,按照http://www.cloudera.com/content/cloudera/en/documentation/HadoopTutori ...
- hive partition 分区使用
一.背景 1.在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念. 2.分区表指的是在创建表 ...
- 阿里云 部署并开启nodejs应用
1.下载资源 $ wget https://nodejs.org/dist/v8.11.2/node-v8.11.2-linux-x64.tar.xz 2.xz解压 $ xz -d node-v8. ...