现在很多APP的会员进度条、等级、积分进度条都是按分段显示的,由于最近自己的项目也用到类似的控件,如下图所示,于是就自己撸了一个!

package progressandanimation.wtt.com.myapplication;

import android.animation.ValueAnimator;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.util.AttributeSet;

import android.util.Log;

import android.view.View;

/**

* Date:2018/11/27

* Author:WangTingting

* 说明:自定义信用等级

*/

public class MyProgressView extends View {

private Paint mCircleOutPaint;

private Paint mCircleInPaint;

private Paint mLinePaint;

private Paint mDefaltCircleOutPaint;

private Paint mDefaltCircleInPaint;

private Paint mDefaltLinePaint;

private Paint mTvPaint;

private int circleOutRadius = 16;

private int circleInRadius = 8;

private int margin = 60; //左右margin

private float mProgress;

private ValueAnimator animation;

public MyProgressView(Context context) {

super(context);

initView();

}

public MyProgressView(Context context, AttributeSet attrs) {

super(context, attrs);

initView();

}

public MyProgressView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

initView();

}

public void initView() {

mCircleOutPaint = new Paint();

mCircleOutPaint.setStyle(Paint.Style.FILL);

mCircleOutPaint.setColor(Color.parseColor("#40A5FF"));

mCircleOutPaint.setAntiAlias(true);

mCircleInPaint = new Paint();

mCircleInPaint.setStyle(Paint.Style.FILL);

mCircleInPaint.setColor(Color.WHITE);

mCircleInPaint.setAntiAlias(true);

mLinePaint = new Paint();

mLinePaint.setColor(Color.parseColor("#40A5FF"));

mLinePaint.setStrokeWidth(8);

mDefaltCircleOutPaint = new Paint();

mDefaltCircleOutPaint.setStyle(Paint.Style.FILL);

mDefaltCircleOutPaint.setColor(Color.parseColor("#858585"));

mDefaltCircleOutPaint.setAntiAlias(true);

mDefaltCircleInPaint = new Paint();

mDefaltCircleInPaint.setStyle(Paint.Style.FILL);

mDefaltCircleInPaint.setColor(Color.WHITE);

mDefaltCircleInPaint.setAntiAlias(true);

mDefaltLinePaint = new Paint();

mDefaltLinePaint.setColor(Color.parseColor("#858585"));

mDefaltLinePaint.setStrokeWidth(8);

mTvPaint = new Paint();

mTvPaint.setColor(Color.parseColor("#858585"));

mTvPaint.setTextSize(sp2px(getContext(), 12));

}

public void setProgress(float progress) {

if (animation == null) {

animation = ValueAnimator.ofFloat(0f, Float.valueOf(progress));

}

if (progress > 0 && progress <= 400) {

mLinePaint.setColor(getResources().getColor(R.color.ring1));

mCircleOutPaint.setColor(getResources().getColor(R.color.ring1));

} else if (progress > 400 && progress <= 700) {

mLinePaint.setColor(getResources().getColor(R.color.ring2));

mCircleOutPaint.setColor(getResources().getColor(R.color.ring2));

} else if (progress > 700 && progress <= 900) {

mLinePaint.setColor(getResources().getColor(R.color.ring3));

mCircleOutPaint.setColor(getResources().getColor(R.color.ring3));

} else if (progress > 900) {

mLinePaint.setColor(getResources().getColor(R.color.ring4));

mCircleOutPaint.setColor(getResources().getColor(R.color.ring4));

}

animation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation) {

mProgress = (float) animation.getAnimatedValue();

invalidate();

}

});

animation.setDuration(3000);

animation.start();

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

getSuggestedMinimumWidth();

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

int height = getHeight();

int width = getWidth();

int realWidth = (width - 2 * margin - 8 * circleOutRadius) / 3;

canvas.drawLine(margin + circleOutRadius * 2, height / 2, width - margin - circleOutRadius * 2, height / 2, mDefaltLinePaint);

for (int i = 0; i < 4; i++) {

canvas.drawCircle(margin + circleOutRadius * (i * 2 + 1) + realWidth * i, height / 2, circleOutRadius, mDefaltCircleOutPaint);

canvas.drawCircle(margin + circleOutRadius * (i * 2 + 1) + realWidth * i, height / 2, circleInRadius, mDefaltCircleInPaint);

}

canvas.drawText("0", margin + circleOutRadius - getTextWidth("0"), height / 2 - 30, mTvPaint);

canvas.drawText("400", margin + circleOutRadius * 3 + realWidth - getTextWidth("400"), height / 2 - 30, mTvPaint);

canvas.drawText("700", margin + circleOutRadius * 5 + realWidth * 2 - getTextWidth("700"), height / 2 - 30, mTvPaint);

canvas.drawText("900+", margin + circleOutRadius * 7 + realWidth * 3 - getTextWidth("900+"), height / 2 - 30, mTvPaint);

canvas.drawText("低信用", margin + circleOutRadius - getTextWidth("低信用"), height / 2 + 50, mTvPaint);

canvas.drawText("中信用", margin + circleOutRadius * 3 + realWidth - getTextWidth("中信用"), height / 2 + 50, mTvPaint);

canvas.drawText("高信用", margin + circleOutRadius * 5 + realWidth * 2 - getTextWidth("高信用"), height / 2 + 50, mTvPaint);

canvas.drawText("极高信用", margin + circleOutRadius * 7 + realWidth * 3 - getTextWidth("极高信用"), height / 2 + 50, mTvPaint);

float ratio;

float result = 0;

if (mProgress > 0 && mProgress <= 400) {

ratio = mProgress / 400;

result = margin + circleOutRadius * 2 + (ratio * realWidth);

} else if (mProgress > 400 && mProgress <= 700) {

ratio = (mProgress - 400) / 300;

result = margin + circleOutRadius * 4 + (ratio * realWidth) + realWidth;

} else if (mProgress > 700 && mProgress <= 900) {

ratio = (mProgress - 700) / 200;

result = margin + circleOutRadius * 6 + realWidth * 2 + (ratio * realWidth);

} else if (mProgress > 900) {

result = margin + circleOutRadius * 8 + 3 * realWidth;

}

canvas.drawLine(margin + circleOutRadius, height / 2, result, height / 2, mLinePaint);

if (mProgress <= 0) {

return;

}

canvas.drawCircle(margin + circleOutRadius, height / 2, circleOutRadius, mCircleOutPaint);

canvas.drawCircle(margin + circleOutRadius, height / 2, circleInRadius, mCircleInPaint);

if (mProgress <= 400) {

return;

}

canvas.drawCircle(margin + circleOutRadius * 3 + realWidth, height / 2, circleOutRadius, mCircleOutPaint);

canvas.drawCircle(margin + circleOutRadius * 3 + realWidth, height / 2, circleInRadius, mCircleInPaint);

if (mProgress <= 700) {

return;

}

canvas.drawCircle(margin + circleOutRadius * 5 + realWidth * 2, height / 2, circleOutRadius, mCircleOutPaint);

canvas.drawCircle(margin + circleOutRadius * 5 + realWidth * 2, height / 2, circleInRadius, mCircleInPaint);

if (mProgress <= 900) {

return;

}

canvas.drawCircle(margin + circleOutRadius * 7 + realWidth * 3, height / 2, circleOutRadius, mCircleOutPaint);

canvas.drawCircle(margin + circleOutRadius * 7 + realWidth * 3, height / 2, circleInRadius, mCircleInPaint);

}

public float getTextWidth(String text) {

return mTvPaint.measureText(text) / 2;

}

public static int sp2px(Context context, float spValue) {

final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;

return (int) (spValue * fontScale + 0.5f);

}

}

然后在Activity中这样写就实现了

android 积分增加动画,Android自定义成长值、等级、积分进度条(带属性动画)相关推荐

  1. android 环形时间显示_Android自定义波浪加载圆形进度条——(自定义控件 一)...

    自定义控件-- 波浪形状圆形进度加载 时间管理的基础是精力管理,精力的高低.正负分影响到我们的效率 而时间是无法管理的,能够管理的只有自己,透过管理自己的习惯,管理自己的事件来达成对时间的管理. 而在 ...

  2. css实现成长值类似的进度条效果

    效果: 代码: <view><view class="levelGrow"><view class="progress">& ...

  3. Android下添加新的自定义键值和按键处理流程【转】

    本文转载自: Android下添加新的自定义键值和按键处理流程 说出来不怕大家笑话,我写这篇博客的原因在于前几天去一个小公司面试Android系统工程师,然后在面试的时候对方的技术总监问了我一个问题, ...

  4. Android自定义滑动进度条,Android自定义View实现圆形水波进度条

    每次听到某大牛谈论自定义View,顿时敬佩之心,如滔滔江水连绵不绝,心想我什么时候能有如此境界,好了,心动不如行动,于是我开始了自定义View之路,虽然过程有坎坷,但是结果我还是挺满意的.我知道大牛还 ...

  5. Android中ProgressBar的使用-通过Handler与Message实现进度条显示

    场景 进度条效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改为 ...

  6. 自定义View实现圆形水波进度条

    每次听到某大牛谈论自定义View,顿时敬佩之心,如滔滔江水连绵不绝,心想我什么时候能有如此境界,好了,心动不如行动,于是我开始了自定义View之路,虽然过程有坎坷,但是结果我还是挺满意的.我知道大牛还 ...

  7. 超酷jQuery进度条加载动画集合

    在丰富多彩的网页世界中,进度条加载动画的形式非常多样,有利用gif图片实现的loading动画,也有利用jQuery和CSS3实现的进度加载动画,本文主要向大家介绍很多jQuery和CSS3实现的进度 ...

  8. vue.js 利用canvas绘制仪表盘圆环进度条-带动画

    vue.js 利用canvas绘制简易仪表盘进度条 html代码 因为动画效果比较消耗性能,所以进度条单独canvas绘制 <template><div class="ci ...

  9. Android自定义成长值、等级、积分进度条(带属性动画)

    现在很多APP的会员进度条.等级.积分进度条都是按分段显示的,由于最近自己的项目也用到类似的控件,如下图所示,于是就自己撸了一个! package progressandanimation.wtt.c ...

最新文章

  1. java精确除法计算,四舍五入 Java问题通用解决代码
  2. 一个多线程和队列的实例演示
  3. 计算机组装维修期末考试题,2014计算机组装维修期末考试题(1)
  4. 统一代码格式 in UltraEdit
  5. iOS 算法的前世今生:算法原理、常用算法(二)加密算法
  6. 30G 上亿数据的超大文件,如何快速导入生产环境?
  7. asp.net 读取导入的project(mpp)文件
  8. Swift开发笔记-Mac OS X 天气预报应用开发(Xcode7.2)
  9. PSPNet运行及训练
  10. 数据库实验一实验报告
  11. 做人做事要有上进心2
  12. Minimum supported Gradle version is 4.6. Current version is 4.4.
  13. 帆软FineBI试用
  14. 在线高音测试软件,《在线测音高》使用说明
  15. 【历史上的今天】6 月 17 日:术语“超文本”的创造者出生;Novell 首席科学家诞生;探索频道开播
  16. 环境变量配置文件的作用-L63
  17. 解读大内老A的《.NET Core框架本质》
  18. PLC数据采集有何难点?有什么解决方法?
  19. AVX | 关于RC电路耦合、相移、滤波、微分、积分的那些事儿~
  20. linux 压缩保持属性不变,linux文件压缩

热门文章

  1. 【计算机科学】【2019.03】双边匹配市场的深度学习
  2. 消息推送服务器推pc,PC浏览器消息实时推送的解决方案 ——EPush推送平台
  3. String HDU - 6572
  4. abortonerror_java-更新Gradle依赖项后生成错误.嫌疑犯#1是...
  5. 《自拍教程72》Python批量重命名视频文件,AV专家必备!
  6. 机器人迷城手机版_机械迷城手机版
  7. vista和win7操作系统关闭用户账户控制
  8. 夏普服务器安装系统,夏普云服务器
  9. 我的世界怎么注册像素时光服务器,我的世界全新rpg地图像素时光一览_像素时光内容一览_3DM网游...
  10. 计算机三维制图论文,对三维动画技术与三维虚拟技术探析论文