我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android自定义View之酷炫数字圆环

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android自定义View之酷炫数字圆环

先看下最终的效果

一、开始实现
新建一个DoughnutView继承View


  public class DoughnutView extends View {
  }

先重写onMeasure方法。  


 
  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(measure(widthMeasureSpec), measure(heightMeasureSpec));
  }
  private int measure(int origin) {
    int result = DEFAULT_MIN_WIDTH;
    int specMode = MeasureSpec.getMode(origin);
    int specSize = MeasureSpec.getSize(origin);
    if (specMode == MeasureSpec.EXACTLY) {
      result = specSize;
    } else {
      if (specMode == MeasureSpec.AT_MOST) {
        result = Math.min(result, specSize);
      }
    }
    return result;
  }

下面就是最重要的重写onDraw方法,大致流程如下
1、画白色圆环(背景),记得改下Activity背景色不然白色圆环看不出来。


 //画背景白色圆环
 initPaint();
 float doughnutWidth = Math.min(width, height) / 2 * 0.15f;
 paint.setStrokeWidth(doughnutWidth);
 paint.setStyle(Paint.Style.STROKE);
 paint.setColor(Color.WHITE);
 paint.setAntiAlias(true);
 RectF rectF = new RectF((width > height ? Math.abs(width - height) / 2 : 0) + doughnutWidth / 2, (height > width ? Math.abs(height - width) / 2 : 0) + doughnutWidth / 2, width - (width > height ? Math.abs(width - height) / 2 : 0) - doughnutWidth / 2, height - (height > width ? Math.abs(height - width) / 2 : 0) - doughnutWidth / 2);
 canvas.drawArc(rectF, 0, 360, false, paint);

2、画彩色圆环

使用SweepGradient来实现圆环渐变的效果,这里有个判断当设置的颜色数组只有一个颜色的时候,直接'setColor',有多个颜色才使用SweepGradient实现渐变色。这样就能既支持渐变色又支持单色。

这里还有一点要注意,SweepGradient默认是从3点钟位置开始渐变的,为了能让它从12点钟位置开始渐变所以将画布旋转了-90°。


 //画彩色圆环
 initPaint();
 canvas.rotate(-90, width / 2, height / 2);
 paint.setStrokeWidth(doughnutWidth);
 paint.setStyle(Paint.Style.STROKE);
 if (doughnutColors.length > 1) {
   paint.setShader(new SweepGradient(width / 2, height / 2, doughnutColors, null));
 } else {
   paint.setColor(doughnutColors[0]);
 }
 canvas.drawArc(rectF, 0, currentValue, false, paint);

3、画中间数值的白色背景(只是为了让数值显示更明显一些)


 //画中间数值的背景
 int fontSize = 50;
 initPaint();
 paint.setStyle(Paint.Style.FILL);
 paint.setColor(Color.WHITE);
 canvas.drawCircle(width / 2, height / 2, fontSize * 2, paint);}

4、画中间数值


 //画中间数值
 canvas.rotate(90, width / 2, height / 2);
 initPaint();
 paint.setColor(ColorUtils.getCurrentColor(currentValue / 360f, doughnutColors));
 paint.setTextSize(fontSize);
 paint.setTextAlign(Paint.Align.CENTER);
 float baseLine = height / 2 - (paint.getFontMetrics().descent + paint.getFontMetrics().ascent) / 2;
 canvas.drawText((int) (currentValue / 360f * 100) + "%", width / 2, baseLine, paint);

这里有两点比较坑:

1、数值的颜色

要实现的效果是让数值的颜色是跟彩色圆环终点的颜色是一样的。寻寻觅觅很久也没有找到获取SweepGradient渲染到某一个角度时颜色的方法=_=

最终花了差不多半天时间写了个颜色渐变算法,代码如下:


 
 public static int getCurrentColor(float percent, int[] colors) {
   float[][] f = new float[colors.length][3];
   for (int i = 0; i < colors.length; i++) {
     f[i][0] = (colors[i] & 0xff0000) >> 16;
     f[i][1] = (colors[i] & 0x00ff00) >> 8;
     f[i][2] = (colors[i] & 0x0000ff);
   }
   float[] result = new float[3];
   for (int i = 0; i < 3; i++) {
     for (int j = 0; j < f.length; j++) {
       if (f.length == 1 || percent == j / (f.length - 1f)) {
         result = f[j];
       } else {
         if (percent > j / (f.length - 1f) && percent < (j + 1f) / (f.length - 1)) {
           result[i] = f[j][i] - (f[j][i] - f[j + 1][i]) * (percent - j / (f.length - 1f)) * (f.length - 1f);
         }
       }
     }
   }
   return Color.rgb((int) result[0], (int) result[1], (int) result[2]);
 }

2、数值居中对齐问题

drawText是根据baseLine来定位的。具体可以看下下面两篇文章的分析:文章一、文章二。数字跟文字字母的居中方式可能还略有不同。

二、动画效果的实现
先上代码:


public void setValue(float value) {
ValueAnimator valueAnimator = ValueAnimator.ofFloat(currentValue, value);
valueAnimator.setDuration(300);
valueAnimator.setInterpolator(new Interpolator() {
  @Override
  public float getInterpolation(float v) {
    return 1-(1-v)*(1-v)*(1-v);
  }
});
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
  @Override
  public void onAnimationUpdate(ValueAnimator valueAnimator) {
    currentValue = (float) valueAnimator.getAnimatedValue();
    invalidate();
  }
});
valueAnimator.start();
}

使用ValueAnimator来实现动画效果。还可以设置不同的插值器来实现不同的动画效果:


 valueAnimator.setInterpolator(new AccelerateInterpolator());//加速
  valueAnimator.setInterpolator(new DecelerateInterpolator());//减速
  valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator());//加速减速
  valueAnimator.setInterpolator(new LinearInterpolator());//云速

常用插值器介绍可以看这篇文章。

当然也可以自己实现一个简单的插值器:


valueAnimator.setInterpolator(new Interpolator() {
  @Override
  public float getInterpolation(float v) {
    return 1-(1-v)*(1-v)*(1-v);
  }
});
您可能感兴趣的文章:Android 自定义View的使用介绍Android自定义View实现广告信息上下滚动效果Android自定义View实现折线图效果Android自定义View制作仪表盘界面Android自定义view绘制圆环占比动画Android自定义View实现竖直跑马灯效果案例解析Android自定义view实现阻尼效果的加载动画Android自定义View实现黑客帝国数字雨效果


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android自定义View之酷炫数字圆环

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android自定义View之酷炫数字圆环

先看下最终的效果一、开始实现 新建一个DoughnutView继承Viewpublic class DoughnutView extends View {}先重写onMeasure方法。 /*** 当布局为wrap_content时设置默
2022-06-06

Android自定义View之酷炫圆环(二)

先看下最终的效果 静态:动态:一、开始实现 新建一个DoughnutProgress继承Viewpublic class DoughnutProgress extends View {}先给出一些常量、变量以及公共方法的代码,方便理解后面的
2022-06-06

如何利用Android实现比较炫酷的自定义View

本篇内容主要讲解“如何利用Android实现比较炫酷的自定义View”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何利用Android实现比较炫酷的自定义View”吧!目录一、背景1.1、控件
2023-06-20

Android自定义View制作动态炫酷按钮实例解析

普通按钮也就那么几种样式,看着都审美疲劳,先放效果图: 你会不会以为这个按钮是集结了很多动画的产物,我告诉你,并没有。所有的实现都是基于自定义View,采用最底层的onDraw一点一点的画出来的。没有采用一丁点的动画。虽然演示时间很短,
2022-06-06

Android自定义View实现圆环交替效果

下面请先看效果图:看上去是不很炫的样子,它的实现上也不是很复杂,重点在与onDraw()方法的绘制。 首先是我们的attrs文件:
2022-06-06

Android自定义view绘制圆环占比动画

一、实现效果图二、核心代码 1.自定义MyProgressView.javapackage com.czhappy.effectdemo.view; import android.content.Context; import androi
2022-06-06

Android如何自定义view实现半圆环效果

小编给大家分享一下Android如何自定义view实现半圆环效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下1.自定义属性
2023-06-29

Android自定义View之圆形进度条式按钮

介绍 今天上班的时候有个哥们问我怎么去实现一个按钮式的进度条,先来看看他需要实现的效果图。和普通的圆形进度条类似,只是中间的地方有两个状态表示,未开始,暂停状态。而且他说圆形进度的功能已经实现了。那么我们只需要对中间的两个状态做处理就行了。
2022-06-06

Android中怎么自定义view实现圆环进度条效果

这篇文章主要讲解了“Android中怎么自定义view实现圆环进度条效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android中怎么自定义view实现圆环进度条效果”吧!核心代码自定义
2023-06-29

Android之自定义View实现带4圆角或者2圆角的效果

1 问题 实现任意view经过自定义带4圆角或者2圆角的效果 2 原理 1) 实现view 4圆角我们只需要把左边的图嵌入到右边里面去,最终显示左边的图就行。 2) 实现view上2圆角我们只需要把左边的图嵌入到右边里面去,最终显示左边的图
2022-06-06

Android自定义View实现支付宝支付成功-极速get花式Path炫酷动画

本文手把手教你图片->SVG->Path的姿势.。 从此酷炫Path动画,如此简单。 效果先随便上几个图,以后你找到的图有多精彩,gif就有多精彩: 随便搜了一个铅笔画的图,丢进去随手复制的二维码icon来自大佬wing的铁塔前文回顾 这里
2022-06-06

Android自定义View之边框文字、闪烁发光文字

对现有控件进行扩展 1、绘制如下所示的两层背景的TextView创建BorderTextView继承TextView在构造函数中初始化一些基本数据//外边框mPaint1 = new Paint();mPaint1.setColor(get
2022-06-06

Android如何自定义View实现数字雨效果

今天小编给大家分享一下Android如何自定义View实现数字雨效果的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。效果图在安
2023-06-29

Android中自定义View实现圆环等待及相关的音量调节效果

圆环交替、等待效果效果就这样,分析了一下,大概有这几个属性,两个颜色,一个速度,一个圆环的宽度。 自定View的几个步骤: 1、自定义View的属性 2、在View的构造方法中获得我们自定义的属性 3、重写onMesure 4、重写on
2022-06-06

Android带圆形数字进度的自定义进度条示例

开发 设计搞了一个带圆形进度的进度条,在GitHub上逛了一圈,发现没有,自己撸吧。 先看界面效果:主要思路是写一个继承ProgressBar的自定义View,不废话,直接上代码:package com.fun.progressbarwit
2022-06-06

Android实现带数字的圆形进度条(自定义进度条)

开发 设计搞了一个带圆形进度的进度条,在GitHub上逛了一圈,发现没有,自己撸吧。 先看界面效果:主要思路是写一个继承ProgressBar的自定义View,不废话,直接上代码:package com.fun.progressbarwit
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录