仿支付宝的芝麻信用仪表盘

实现的效果

实现的功能:

  • 指针和数字动态改变

  • 背景动态变化

  • 没了...

代码如下
MyCustomView.java

package com.example.testcustomview;

import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View; public class MyCustomView extends View { private Paint paint;
private ValueAnimator valueAnimator;
private int backgroundColor;
private int fontColor = Color.WHITE;
private int score;
private int value; public MyCustomView(Context context, AttributeSet attrs) {
super(context, attrs); } public void setSocre(int score) {
init(score);
} private void init(int score) {
// ValueAnimator用来计算过度值,过度值用来更改背景颜色以及指针的轨迹
valueAnimator = ValueAnimator.ofInt(0, score);
valueAnimator.setDuration(3000);
valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int i = (int) animation.getAnimatedValue();
value = i;
if (i < 10) {
backgroundColor = Color.RED;
invalidate();
} else if (i >= 10 && i < 20) {
backgroundColor = Color.BLUE;
invalidate();
} else if (i >= 20 && i < 30) {
backgroundColor = Color.RED;
invalidate();
} else if (i >= 30 && i < 40) {
backgroundColor = Color.BLUE;
invalidate();
} else if (i >= 40 && i < 50) {
backgroundColor = Color.RED;
invalidate();
} else if (i >= 50 && i < 60) {
backgroundColor = Color.BLUE;
invalidate();
} else if (i >= 60 && i < 70) {
backgroundColor = Color.RED;
invalidate();
} else if (i >= 70 && i < 80) {
backgroundColor = Color.BLUE;
invalidate();
} else if (i >= 80 && i < 90) {
backgroundColor = Color.RED;
invalidate();
} else if (i >= 90 && i < 100) {
backgroundColor = Color.BLUE;
invalidate();
} else if (i == 100) {
backgroundColor = Color.RED;
invalidate();
}
}
});
valueAnimator.start(); } public MyCustomView(Context context) {
this(context, null);
} @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int width = canvas.getWidth();
int height = canvas.getHeight(); canvas.drawColor(backgroundColor);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.WHITE); canvas.drawLine(0, height / 2, width, height / 2, paint);
canvas.drawLine(width / 2, 0, width / 2, height, paint); // 将圆点移动到屏幕中央
canvas.translate(width / 2, height / 2); // 开始画圆,最外层,第一个圆
canvas.drawArc(new RectF((0 - width / 4), (0 - width / 4), width / 4, width / 4), 180, 180, true, paint);
// 第二个圆
Paint p2 = new Paint(Paint.ANTI_ALIAS_FLAG);
p2.setColor(backgroundColor);
canvas.drawArc(new RectF((0 - width / 4 + 5), (0 - width / 4 + 5), width / 4 - 5, width / 4 - 5), 180, 180,
true, p2);
// 第三个圆
Paint p3 = new Paint(Paint.ANTI_ALIAS_FLAG);
p3.setColor(Color.argb(255, 255, 240, 255));
canvas.drawArc(new RectF((0 - width / 4 + 30), (0 - width / 4 + 30), width / 4 - 30, width / 4 - 30), 180, 180,
true, p3);
// 第四个圆
Paint p4 = new Paint(Paint.ANTI_ALIAS_FLAG);
p4.setColor(backgroundColor);
canvas.drawArc(new RectF((0 - width / 4 + 55), (0 - width / 4 + 55), width / 4 - 55, width / 4 - 55), 180, 180,
true, p4); // 开始画刻度
Paint p5 = new Paint(Paint.ANTI_ALIAS_FLAG);
p5.setColor(Color.RED);
Paint p6 = new Paint(Paint.ANTI_ALIAS_FLAG);
p6.setColor(Color.BLUE);
p6.setTextSize(15); int count = 11;// 总刻度数目
for (int i = 0; i < count; i++) {
if (i % 5 == 0) {
canvas.drawLine((0 - width / 4 + 5), 0, (0 - width / 4 + 30), 0, p5);
canvas.drawText(String.valueOf(i * 10), (0 - width / 4 + 30), 0, p6);
} else {
canvas.drawLine((0 - width / 4 + 15), 0, (0 - width / 4 + 30), 0, p5);
canvas.drawText(String.valueOf(i * 10), (0 - width / 4 + 30), 0, p6);
}
canvas.rotate(18);
} canvas.rotate(-198); // 画最外层的指针
Paint pp = new Paint(Paint.ANTI_ALIAS_FLAG);
pp.setColor(Color.WHITE);
pp.setStrokeWidth(5);
for (int i = 0; i < value; i++) {
canvas.drawPoint((0 - width / 4), 0, pp);
canvas.rotate(1.8f);
}
canvas.rotate(0 - (value * 1.8f));
// 画数字
Paint ppp = new Paint(Paint.ANTI_ALIAS_FLAG);
ppp.setTextSize(width / 10); FontMetrics fontMetrics = ppp.getFontMetrics();
if (value < 10) {
canvas.drawText(value + "", fontMetrics.top / 4, 0, ppp);
} else {
canvas.drawText(value + "", fontMetrics.top / 2, 0, ppp);
}
}
}

MainActivity.java

package com.example.testcustomview;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText; public class MainActivity extends Activity { private MyCustomView custom_view;
private Button bt;
private EditText et; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); et = (EditText) findViewById(R.id.et);
bt = (Button) findViewById(R.id.bt);
custom_view = (MyCustomView) findViewById(R.id.custom_view);
bt.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
custom_view.setSocre(Integer.valueOf(et.getText().toString()));
}
});
}
}

自定义View(三),仿支付宝芝麻信用自定义控件的更多相关文章

  1. iOS仿支付宝芝麻信用仪表盘效果

    概述 自定义View之高仿支付宝芝麻信用分数仪表盘动画效果 详细 代码下载:http://www.demodashi.com/demo/10654.html 仿支付宝芝麻信用仪表盘效果 一.主要思路 ...

  2. Android 自定义View,仿微信视频播放按钮

    闲着,尝试实现了新版微信视频播放按钮,使用的是自定义View,先来个简单的效果图...真的很简单哈. 由于暂时用不到,加上时间原因,加上实在是没意思,加上……,本控件就没有实现自定义属性,有兴趣的朋友 ...

  3. android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索

    我们的手机通讯录一般都有这样的效果,如下图: OK,这种效果大家都见得多了,基本上所有的android手机通讯录都有这样的效果.那我们今天就来看看这个效果该怎么实现. 一.概述 1.页面功能分析 整体 ...

  4. 自定义View(三)--实现一个简单地流式布局

    Android中的流式布局也就是常说的瀑布流很是常见,不仅在很多项目中都能见到,而且面试中也有很多面试官问道,那么什么是流式布局呢?简单来说就是如果当前行的剩余宽度不足以摆放下一个控件的时候,则自动将 ...

  5. Android自定义view之仿微信录制视频按钮

    本文章只写了个类似微信的录制视频的按钮,效果图如下:             一.主要的功能: 1.长按显示进度条,单击事件,录制完成回调 2.最大时间和最小时间控制 3.进度条宽度,颜色设置 二.实 ...

  6. Android 自定义View (三) 圆环交替 等待效果

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24500107 一个朋友今天有这么个需求(下图),我觉得那自定义View来做还是很 ...

  7. Android自定义View实现仿QQ实现运动步数效果

    效果图: 1.attrs.xml中 <declare-styleable name="QQStepView"> <attr name="outerCol ...

  8. Android 自定义View修炼-仿QQ5.0 的侧滑菜单效果的实现

    有一段时间没有写博客了,最近比较忙,没什么时间写,刚好今天有点时间, 我就分享下,侧滑菜单的实现原理,一般android侧滑的实现原理和步骤如下:(源码下载在下面最后给出哈) 1.使用ViewGrou ...

  9. Android 自定义View修炼-仿360手机卫士波浪球进度的实现

    像360卫士的波浪球进度的效果,一般最常用的方法就是 画线的方式,先绘sin线或贝塞尔曲线,然后从左到右绘制竖线,然后再裁剪圆区域. 今天我这用图片bitmap的方式,大概的方法原理是: (1)首先用 ...

随机推荐

  1. (转)简单的Malloc实现

    现在,一般来说,我们可以实现malloc使得对malloc的调用将会被映射到系统调用sbrk上,sbrk(n)将会移动程序中断的位置-也就是程序的data段的最后.-偏移n个字节,这意味着,n个字节的 ...

  2. 浅谈BST(二叉查找树)

    目录 BST的性质 BST的建立 BST的检索 BST的插入 BST求前驱/后继 BST的节点删除 复杂度 平衡树 BST的性质 树上每个节点上有个值,这个值叫关键码 每个节点的关键码大于其任意左侧子 ...

  3. PATB1006换个格式输出整数

    参考代码: #include<cstdio> int main() { int n;//接收输入的数字 int a = 0, b = 0, c = 0;//分别记录百位十位个位上的数 sc ...

  4. mac Sublime Text 快捷键

    mac Sublime Text 快捷键 Tab: 光标后缩进 Shift+Tab: 反缩进 cmd+P: 打开文件切换面板 cmd+/: 行注释 cmd+R: 快速列出/跳转到某个函数 双击可选中光 ...

  5. java web开发入门一(servlet和jsp)基于eclispe

    servlet 用java语言开发动态资源网站的技术,在doGet方法中拼接显示html,在doPost方法中提交数据.类似于.net的ashx技术. servlet生成的class文件存放在tomc ...

  6. prometheus、node_exporter、cAdvisor常用参数

    本节将介绍一下我在使用过程中用到的promethues.node_exporter.cAdvisor的常用参数,做一个总结 一.prometheus prometheus分为容器安装和二进制文件安装, ...

  7. 设计高性能大并发WEB系统架构注意点

    设计高性能大并发WEB系统架构注意点 第01:大型架构的演进之路第02(上):分布式缓存第02(下):分布式缓存第03:分布式消息队列第04:分布式数据存储第05:分布式服务框架第06:高性能系统架构 ...

  8. vux scroller在iOS13上,一停止滑动就跳到顶部

    转载:https://blog.csdn.net/sllailcp/article/details/102502452 今天客户反馈的问题,说在最新版的iOS上(iOS13),滑动列表,滑完就会跳到顶 ...

  9. ArcSOC进程数不断增长导致oracle processes溢出原因分析

    现场出现了一个问题,oracle运行一段时间之后,process个数会溢出,然后新的连接会失败.通过分析,发现Arcgis Server 的ArcSOC进程在不段增长.ArcSOC是arcgis se ...

  10. SQL Server ----- 备份数据库 生成(.bak)文件

    转移数据库   备份数据库 选中数据库 进入后界面如图 选择合适位置进行备份 注意:选择配置好保存位置的 成功后出现 如果出现错误. 还有一种可能是哪个文件夹中已经有了一个 把文件家中的那个删了 还原 ...