使用画圆弧的方式绘制圆环和进度条,使用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 绘制圆环的更多相关文章

  1. 自己定义View之绘制圆环

    一.RingView 自己定义的view,构造器必须重写,至于重写哪个方法,參考例如以下: ①假设须要改变View绘制的图像,那么须要重写OnDraw方法.(这也是最经常使用的重写方式.) ②假设须要 ...

  2. android绘制view的过程

    1 android绘制view的过程简单描述  简单描述可以解释为:计算大小(measure),布局坐标计算(layout),绘制到屏幕(draw):            下面看看每一步的动作到底是 ...

  3. 【转】Android绘制View的过程研究——计算View的大小

    Android绘制View的过程研究——计算View的大小 转自:http://liujianqiao398.blog.163.com/blog/static/18182725720121023218 ...

  4. Android绘制流程

    一.前言 1.1.C++界面库 MFC.WTL.DuiLib.QT.Skia.OpenGL.Android里面的画图分为2D和3D两种: 2D是由Skia 来实现的,3D部分是由OpenGL实现的. ...

  5. Android绘制优化(二)布局优化

    前言 我们知道一个界面的测量和绘制是通过递归来完成的,减少布局的层数就会减少测量和绘制的时间,从而性能就会得到提升.当然这只是布局优化的一方面,那么如何来进行布局的分析和优化呢?本篇文章会给你一个满意 ...

  6. Android绘制优化(一)绘制性能分析

    前言 一个优秀的应用不仅仅是要有吸引人的功能和交互,同时在性能上也有很高的要求.运行Android系统的手机,虽然配置在不断的提升,但仍旧无法和PC相比,无法做到PC那样拥有超大的内存以及高性能的CP ...

  7. Swift - EasingAnimation绘制圆环动画

    Swift - EasingAnimation绘制圆环动画 效果 源码 https://github.com/YouXianMing/Swift-Animations // // CircleView ...

  8. 第165天:canvas绘制圆环旋转动画

    canvas绘制圆环旋转动画——面向对象版 1.HTML 注意引入Konva.js库 <!DOCTYPE html> <html lang="en"> &l ...

  9. 理解Android绘制视图的方式

    在创建自定义ViewGroup前,读者首先需要理解Android绘制视图的方式.我不会涉及过多细节,但是需要读者理解Android开发文档(见3.5节)中的一段话,这段话解释如何绘制一个布局.内容如下 ...

随机推荐

  1. 算法笔记_039:杨辉三角形(Java)

    目录 1 问题描述 2 解决方案 1 问题描述 问题描述 杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数. 它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加. ...

  2. python------@staticmethod和@classmethod的作用与区别

    一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用. 这有利于组织代码,把某些应 ...

  3. 〖Android〗/system/etc/fallback_fonts.xml

    <?xml version="1.0" encoding="utf-8"?> <!-- Fallback Fonts This file sp ...

  4. 从缓存行出发理解volatile变量、伪共享False sharing、disruptor

    volatilekeyword 当变量被某个线程A改动值之后.其他线程比方B若读取此变量的话,立马能够看到原来线程A改动后的值 注:普通变量与volatile变量的差别是volatile的特殊规则保证 ...

  5. Android酷炫加载进度动画

    概述 本自定义动画进度酷炫View,是加载进度动画的自定义View,继承于ImageView来实现,主要实现蒙层加载进度的加载进度效果. 支持水平左右加载和垂直上下加载四个方向,同时也支持自定义蒙层进 ...

  6. Android 图片压缩器

    概述 Android 图片压缩器:一款高效的图片压缩器库,支持批量压缩,异步压缩.多线程多任务压缩,压缩比设置等特性. 详细 代码下载:http://www.demodashi.com/demo/12 ...

  7. sms_queue 短信队列

    git地址:https://github.com/Filix/sms_queue 简介 通过队列的方式发送短信,暂时实现了redis作为队列. 以实现的第三方短信服务: 百悟.漫道. 发送短信方,只需 ...

  8. screen常用命令

    1. 背景 由于经常使用ssh登录实验室的服务器训练神经网络, 而一些复杂的神经网络模型需要长时间训练,在此期间,如果出现网络等原因出现链接中断的话,服务器的进程也会被杀死,之前的一切半途而废.利用s ...

  9. ui-router详解(二)ngRoute工具区别

    我们了解 angular.js 是一种富客户端单页面应用,所以要在一个页面呈现不同的视图,路由起到了至关重要的作用. angular.js 为我们封装好了一个路由工具 ngRoute ,它是一种靠ur ...

  10. Facebook Oauth2.0 API调用方法

    这些天搞了下Facebook API的东东,在官方网站下弄了一些接口,下面简单的把facebook的调用流程以及常用接口书序一下 :-)  当然在使用facebook api之前要有facebook账 ...