设计思路

通过自定义控件实现。将整个圆环拆分成一个个的小圆弧,每个小圆弧画笔的色值不一样,每个圆弧画笔的色值都是起始色值和终止色值的中间过渡色,由起始色值逐渐向终止色值靠拢,最后形成渐变颜色的圆环。

知识点

1、自定义控件

自定义控件分为三种:继承控件,即在现有控件直接简单修改;组合控件,即GroupView;自定义View。具体自定义控件的细节,这里不再细说,可以参阅网上资料。

2、画笔

画笔类型(setStyle)分为三种:STROKE只绘制图形轮廓,FILL只绘制图形内容,FILL_AND_STROKE既绘制轮廓也绘制内容;我们采用的是STROKE,也就是描边。

笔刷样式(setStrokeCap)分为三种:Round圆形冒;SQUARE方形冒;BUTT无冒。这里需要注意,冒的意思就是多出一部分,所以我们采用的是BUTT,下面会详细说明。

画笔宽度(setStrokeWidth)

3、画图

RectF:RectF有四个参数(float left, float top, float right, float bottom)

1.jpg

drawArc:画弧,主要关注startAngle、sweepAngle两个参数

2.jpg

实现

(1)onMeasure设定画大小

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

mMeasureWidth = getMeasuredWidth()

mMeasureHeight = getMeasuredHeight();

if (pRectF == null) {

float halfProgressWidth = progressWidth / 2;

pRectF = new RectF(halfProgressWidth + getPaddingLeft(),

halfProgressWidth + getPaddingTop(),

mMeasureWidth - halfProgressWidth - getPaddingRight(),

mMeasureHeight - halfProgressWidth - getPaddingBottom());

}

}

(2)onDraw确定怎么画,这里主要看一下drawProgress,整个圆弧由多个小圆弧组成,通过获取过渡色设置笔刷颜色,笔刷颜色从起始色值开始,每增加一度都向终止色值渐变

private void drawProgress(Canvas canvas) {

for (int i = 0, end = (int) (curProgress * unitAngle); i < end; i++) {

progressPaint.setColor(getGradient(i / (float) end, progressStartColor, progressEndColor));

canvas.drawArc(pRectF,

startAngle + i,

2,

false,

progressPaint);

}

}

(3)获取过渡色的方法

public int getGradient(float fraction, int startColor, int endColor) {

if (fraction > 1) fraction = 1;

int alphaStart = Color.alpha(startColor);

int redStart = Color.red(startColor);

int blueStart = Color.blue(startColor);

int greenStart = Color.green(startColor);

int alphaEnd = Color.alpha(endColor);

int redEnd = Color.red(endColor);

int blueEnd = Color.blue(endColor);

int greenEnd = Color.green(endColor);

int alphaDifference = alphaEnd - alphaStart;

int redDifference = redEnd - redStart;

int blueDifference = blueEnd - blueStart;

int greenDifference = greenEnd - greenStart;

int alphaCurrent = (int) (alphaStart + fraction * alphaDifference);

int redCurrent = (int) (redStart + fraction * redDifference);

int blueCurrent = (int) (blueStart + fraction * blueDifference);

int greenCurrent = (int) (greenStart + fraction * greenDifference);

return Color.argb(alphaCurrent, redCurrent, greenCurrent, blueCurrent);

}

(4)问题解决

画圆环的过程中会遇到一个问题,上面提到的笔刷样式的选择,下面是三种笔刷的示意图:

Paint.Cap.ROUND 头尾多出了一块圆形笔帽

3.png

Paint.Cap.SQUARE 头尾多出了一块方形笔帽

4.png

Paint.Cap.BUTT 头尾不多出笔帽,但是每个小圆环中间有空隙

5.png

解决方案: sweepAngle比下一次的startAngle多一点。

6.png

(5)后续拓展 通过showAnim来控制圆环动效

使用

1、在layout中设置width、height、画笔宽度

android:id="@+id/circle_shape"

android:layout_width="320dp"

android:layout_height="320dp"

android:layout_gravity="center"

a:pr_progress_width="30dp" />

2、在类中设置progress、背景色、进度起始色、进度终止色

CircleShape mPR = findViewById(R.id.circle_shape);

mPR.setProgress(60);

mPR.setColor(R.color.bgColor,R.color.progressStartColor, R.color.progressEndColor);

android自定义渐变色圆环,CircleShape渐变颜色圆环相关推荐

  1. android自定义渐变色圆环,Android实现光点模糊渐变的自旋转圆环特效

    本文实例为大家分享了Android实现光点模糊渐变的自旋转圆环效果,供大家参考,具体内容如下 项目中需要实现的效果图如下: 可以这个表盘看到中间部分都是没有什么难点的,主要是周围圆环的三种效果: 1. ...

  2. android自定义渐变色圆环,Android实现渐变圆环、圆形进度条效果

    最近做了一个功能,里面涉及到了渐变圆形的需求.就是一个颜色可以渐变的圆环,最后实现的效果如下图: 左图是带渐变效果,右图是不带渐变效果.原理还是绘图,Canvas可以绘制的对象有:弧线(arcs).填 ...

  3. Android 自定义彩色圆环,Android自定义View之酷炫数字圆环

    先看下最终的效果 一.开始实现 新建一个doughnutview继承view 先重写onmeasure方法. 下面就是最重要的重写ondraw方法,大致流程如下 1.画白色圆环(背景),记得改下act ...

  4. Android 自定义View实现环形带刻度颜色渐变的进度条

    上次写了一篇Android 自定义View实现环形带刻度的进度条,这篇文章就简单了,只是在原来的基础上加一个颜色渐变. 按照惯例,我们先来看看效果图 一.概述 1.相比于上篇文章,这里我们的颜色渐变主 ...

  5. android自定义渐变色,Android设置背景渐变色

    效果如图,本章只谈背景渐变色,仪表盘下一篇文章 实现步骤,只需两步: 1.在res/drawable中新建一个gradual_color_bg.xml 内容如下: android:startColor ...

  6. android自定义渐变色,Android如何设置渐变色背景 | 夕辞

    Android开发过程中,会用到android:backgroud属性来设置背景的颜色,一般情况下我们直接设置一个类似#FFFF0000的值代表是背景颜色,如果想设置渐变背景颜色,就需要用到gradi ...

  7. Android 自定义View取色盘、颜色选择器、可根据颜色值反向定位坐标

    前言: 前段时间项目中需要用到色盘取色的功能,百度了许多相关的颜色选择器,发现这方面自定义View例子比较少,有用图片代替色盘的通过bitmap取色,但是只能取色,无法通过颜色值去定位在色盘上的坐标, ...

  8. Android 自定义 spinner (背景、字体颜色)

    转自:http://blog.sina.com.cn/s/blog_3e333c4a010151cj.html 1.准备两张图片,并做好9.png 2.在drawable中定义spinner_sele ...

  9. python 渐变色_python – 用渐变颜色的散景散点图

    我正在尝试用散景制作一个散点图.例如: from bokeh.plotting import figure, show, output_notebook TOOLS='pan,wheel_zoom,b ...

最新文章

  1. Lion的发送E-mail的类
  2. R-大数据分析挖掘(5-R基础回顾)
  3. MongoDb 大数据查询优化、 MongoDB 索引、复合索引、唯一索引、 explain 分 析查询速度
  4. 9款WordPress视频插件
  5. cleanlab(解决图像标记错误)
  6. 树莓派4B之雨滴雨水传感器模块(python3)
  7. 专访方志朋:2018年仍然是微服务飞速发展的一年
  8. 语法长难句【刘晓艳】英语
  9. linux视频播放器软件下载,360万能播放器Linux版
  10. 仓储物流系统初级架构
  11. AJAX聊天室实现原理 JQuery+PHP 【转】
  12. 宇宙被超级计算机控制,宇宙被超级计算机控制, 欧空局发现一无法解释痕迹, 根本没有...
  13. RocketMQ——顺序消费(代码)
  14. 关于handler子线程通知主线程的几种写法
  15. BERT cased和uncased的区别
  16. 离婚率离婚率离婚率离婚率
  17. ZOJ ——3629 Treasure Hunt IV
  18. 进阶版通讯录(动态版)
  19. license.lic
  20. SaaS鉴证实录:网络营销企业的自我营销之道

热门文章

  1. input输入框提示从数据库查出来的一堆数据
  2. 圣诞节的整理前两周的内容4
  3. 手机页面图片显示高低不一致
  4. webots自学笔记(七)通过定义顶点构件3D形状(IndexedFaceSet节点)
  5. Java八种基本数据类型的大小,以及封装类,自动装箱/拆箱的用法?
  6. Atitit..jdk java 各版本新特性 1.0 1.1 1.2 1.3 1.4 1.5(5.0) 1.6(6.0) 7.0 8.0 9.0 attilax 大总结...
  7. 如何用C#对Gridview的项目进行汇总统计?
  8. 2012-2-24 《数据结构》读书笔记2 线性表
  9. MATLAB库函数radarvcd介绍
  10. LeetCode-336 Palindrome Pairs