Android仿芝麻信用分雷达分布图
首先看下支付宝上芝麻信用分的效果图:
今天来下面的效果
1. 绘制多边形以及线条
2. 绘制图标和文本
3. 绘制覆盖区域
4. 绘制覆盖分数
绘制多边形
参上上面的方法,可以计算出B的坐标,那么,绘制AB弦就变得很简单了吧!
绘制多边形以及线条
效果图如下:
绘制图标和文本
绘制覆盖区域
绘制覆盖分数
附上全部代码:
SesameCreditView.java
package com.jackie.sesamecredit.View;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;import com.jackie.sesamecredit.R;/*** Created by Administrator on 2016/11/18.*/public class SesameCreditView extends View {private Paint mPaint;/*** 圆心坐标*/private float mCenterX, mCenterY;/*** 圆心半径*/private float mRadius;/*** 绘制图标的大小*/private float mIconWidth;/*** 多边形的边数*/private static final int POLYGON_COUNT = 5;/*** 绘制文字的大小*/private static final int TEXT_SIZE = 25;/*** 角度*/private static final int DEGREE = 360 / POLYGON_COUNT;private static final int ICON_TITLE_MARGIN = 20;/*** 各维度分值*/private static final float[] SESAME_DATA = {170, 180, 160, 170, 180};/*** 数据最大值*/private static final float SESAME_MAX_VALUE = 190;private static final String[] SESAME_TITLE = { "身份特质", "履约能力", "信用历史", "人脉关系", "行为偏好" };private static final int[] SESAME_IDS = { R.mipmap.ic_identity, R.mipmap.ic_performance, R.mipmap.ic_history, R.mipmap.ic_contacts, R.mipmap.ic_predilection };public SesameCreditView(Context context) {this(context, null);}public SesameCreditView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public SesameCreditView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initView();}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);int width = getMeasuredWidth();int height = getMeasuredHeight();mCenterX = width / 2;mCenterY = height / 2;mRadius = Math.min(mCenterX, mCenterY) * 2 / 3;mIconWidth = mRadius / 3;}private void initView() {mPaint = new Paint();mPaint.setAntiAlias(true);mPaint.setDither(true);mPaint.setStrokeWidth(3);mPaint.setColor(Color.WHITE);mPaint.setTextSize(TEXT_SIZE);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);drawPolygon(canvas);drawIcon(canvas);drawText(canvas);drawRegion(canvas);drawScore(canvas);}private void drawPolygon(Canvas canvas) {/*** 先绘制多边形的边*/for (int i = 0; i < POLYGON_COUNT; i++) {canvas.save();//圆心正上方的点作为参考点
// float targetX = mRadius;float targetX = Math.min(mCenterX, mCenterY);float targetY = mCenterY - mRadius;float distance = (float) (2 * mRadius * Math.sin(Math.toRadians(DEGREE / 2)));float y = (distance * distance + mCenterY * mCenterY - targetY * targetY - mRadius * mRadius) / (2 * (mCenterY - targetY));float x = (float) (Math.sqrt(distance * distance - (y - targetY) * (y - targetY)) + targetX);canvas.rotate(DEGREE * i, mCenterX, mCenterY);canvas.drawLine(targetX, targetY, x, y, mPaint);canvas.drawLine(mCenterX, mCenterY, targetX, targetY, mPaint);canvas.restore();}}private void drawIcon(Canvas canvas) {for (int i = 0; i < SESAME_IDS.length; i++) {canvas.save();//图片的宽度和高度设置为半径的1 / 3Bitmap bitmap = BitmapFactory.decodeResource(getResources(), SESAME_IDS[i]);//获取图标左上顶点的坐标Point point = getIconPoint(i, 1);int left = point.x;int top = point.y;int right = (int) (left + mIconWidth);int bottom = (int) (top + mIconWidth);Rect rect = new Rect(left, top, right, bottom);canvas.drawBitmap(bitmap, null, rect, mPaint);canvas.restore();}}private void drawText(Canvas canvas) {for (int i = 0; i < SESAME_TITLE.length; i++) {canvas.save();Point point = getIconPoint(i, 1);int left = point.x;int top = point.y;int textLeft = (int) (left - (mPaint.measureText(SESAME_TITLE[i]) / 2 - mIconWidth / 2));int textTop = (int) (top + mIconWidth + ICON_TITLE_MARGIN * 2);canvas.drawText(SESAME_TITLE[i], textLeft, textTop, mPaint);canvas.restore();}}private void drawRegion(Canvas canvas) {mPaint.setAlpha(120);Path path = new Path();canvas.save();for (int i = 0; i < SESAME_DATA.length; i++) {float percent = SESAME_DATA[i] / SESAME_MAX_VALUE;Point point = getVertexPoint(i, percent);int x = point.x;int y = point.y;if (i == 0) {path.moveTo(x, y);} else {path.lineTo(x, y);}}path.close();mPaint.setStyle(Paint.Style.STROKE);canvas.drawPath(path, mPaint);//绘制填充区域mPaint.setStyle(Paint.Style.FILL_AND_STROKE);canvas.drawPath(path, mPaint);canvas.restore();}private void drawScore(Canvas canvas) {canvas.save();mPaint.setTextSize(150);int width = (int) mPaint.measureText("860");canvas.drawText("860", mCenterX - width / 2, mCenterY + ICON_TITLE_MARGIN, mPaint);canvas.restore();}/**I* 获取多边形的顶点* @return*/private Point getVertexPoint(int position, float percent) {/**I* 计算多边形每个顶点的坐标* degree = DEGREE = 360 / POLYGON_COUNT;* 0 mCenterX + mRadius * sin(0 * degree) mCenterY - mRadius * cos(0 * degree)* 1 mCenterX + mRadius * sin(1 * degree) mCenterY - mRadius * cos(1* degree)* 2 mCenterX + mRadius * sin(2 * degree) mCenterY - mRadius * cos(2*degree)*....*/int vertexX = (int) (mCenterX + mRadius * Math.sin(Math.toRadians(position * DEGREE)) * percent);int vertexY = (int) (mCenterY - mRadius * Math.cos(Math.toRadians(position * DEGREE)) * percent);return new Point(vertexX, vertexY);}/*** 获取图标的位置* @param position* @return*/private Point getIconPoint(int position, float percent) {Point point = getVertexPoint(position, percent);int vertexX = point.x;int vertexY = point.y;int left = 0;int top = 0;if (position == 0) {left = (int) (vertexX - mIconWidth / 2);/*** 这里为了让文字能够显示下,自己手动设置 ICON_TITLE_MARGIN * 3* 实际开发中需要自己是调试* 同理,下面的ICON_TITLE_MARGIN都是为了保证图标和雷达分布图之间留有空隙*/top = (int) (vertexY - mIconWidth - ICON_TITLE_MARGIN * 3);} else if (position == 1) {left = vertexX + ICON_TITLE_MARGIN;top = (int) (vertexY - mIconWidth / 2);} else if (position == 2) {left = vertexX;top = vertexY;} else if (position == 3) {left = (int) (vertexX - mIconWidth);top = vertexY;} else if (position == 4) {left = (int) (vertexX - mIconWidth - ICON_TITLE_MARGIN);top = (int) (vertexY - mIconWidth / 2);}return new Point(left, top);}
}
效果图如下:
Android仿芝麻信用分雷达分布图相关推荐
- [置顶] Android自定义控件 芝麻信用分雷达图
[置顶] Android自定义控件 芝麻信用分雷达图 标签: android自定义雷达芝麻信用 2016-10-23 20:11 3548人阅读 评论(24) 收藏 举报 分类: 自定义控 ...
- Android仿芝麻信用分
1.先准备好图片 2.新建一个CreditScoreView类,继承View public class CreditScoreView extends View {//数据个数private int ...
- canvas仿芝麻信用分画的一个刻度表(可根据分数变色)
有些时间没练习canvas了,感觉好像略有生疏,这次是canvas仿芝麻信用分画了一个刻度表,没有特别难的地方,不过在计算时也算折腾了一番. 因为需要有五种状态,所以根据传入的值,进入了五种判断,并给 ...
- Android 仿芝麻信用进度条,Android仿支付宝上芝麻信用分雷达图
一.首先看下支付宝上芝麻信用分的效果图: 二.思路 1.确定雷达图中心点坐标 2.绘制多边形及连接线 3.根据维度值绘制覆盖区域 4.绘制分数 5.绘制每个维度的标题文字和图标 三.实现 获取布局的中 ...
- Android 仿芝麻信用进度条,自定义View仿支付宝芝麻信用分仪表盘效果
image 前言 灵感来自几天前看到一位作者的仿芝麻信用自定义View的文章很不错,所以我换了一种方式来进行实现,写了旧版和新版芝麻信用分仪表盘的效果. 截图 这是我做的效果,还是有点差距的,嘿嘿. ...
- 支付宝 android ui,Android 仿支付宝芝麻信用分仪表盘效果 CreditSesameRingView
软件介绍 自定义View之仿支付宝芝麻信用分仪表盘效果,喜欢的话,请给个star,谢谢. 使用添加项目依赖Add it in your root build.gradle at the end of ...
- android 自定义中文加盘,Android自定义View仿支付宝芝麻信用分仪表盘
先看下iOS的芝麻信用分截图 这是我做的效果,还是有点差距的 支付宝9.9版本芝麻信用分的实现 首先初始化各种画笔,默认的size,padding,小圆点. (因为实在找不到原版芝麻信用的带点模糊效果 ...
- 自定义View之仿支付宝v9.9芝麻信用分仪表盘效果
点击上方蓝字关注公众号 码个蛋第242次推文 因为信用,所以简单 作者:hotBitmapGG 博客:http://www.jianshu.com/u/566d6cec0ebc 文章目录 前言 截图 ...
- 自定义View仿支付宝芝麻信用分仪表盘效果
前言 灵感来自几天前看到一位作者的仿芝麻信用自定义View的文章很不错,所以我换了一种方式来进行实现,写了旧版和新版芝麻信用分仪表盘的效果. Github地址: https://github.com/ ...
- 芝麻信用分SDK接入,显示芝麻信用授权界面(Android)
转自:http://blog.csdn.net/coycleipenghui/article/details/52909367 前言:本文主要介绍芝麻信用授权在app中的接入工作,以及代码中出现onC ...
最新文章
- 一文搞懂结构体的定义及实际使用
- 采集网站特殊文件Meta信息
- [003]Reference in C++---C++引用基础知识篇
- 实战mongodb3.06 Relica Sets+sharding集群
- python下常用OpenCV代码
- SQL SERVER备份脚本
- “无法找到运行搜索助理需要的一个文件”的解决办法
- F-Spot 0.3.2
- 手机上有没有学python的软件-【Learn Python】用手机学Python
- 拯救天使 (BFS)
- web网页开发-前端
- Pr 水墨动画转场效果
- 学会对VUE的SEO优化,你的网站总是排在前面
- spring + springmvc +mybatis 搭建 maven 项目的核心配置文件
- 信用风险建模 in Python 系列 7 - ASRF 模型
- python——简单通讯录
- arcgis server里预览地图显示空白
- 用户反馈信息textbox填充数据表,页面使用gridview显示反馈意见
- learnOpenGL-深度测试
- 四种访问修饰符---(Java版)
热门文章
- Redo log In-depth(Only for experienced Oracle DBA NOT for Fresher DBA)
- IIC总线最多能接几个设备
- HTML5期末大作业:南京旅游网站设计——六朝古都-南京旅游(10页) HTML+CSS+JavaScript 出游旅游主题度假酒店 计划出行网站设计
- matlab syms类型,matlab中syms类型的转换
- 滴滴裁员2000人启示:牛逼的人,都有铁饭碗
- 冰刃(icesword) V1.22 Final┊官方中文绿色版
- macOS 原生系统压缩文件在 Windows 上解压可能会乱码的原因及解决办法
- kettle-java代码执行hive相关ktr时报错: database type with plugin id [HIVE2] couldn‘t be found!
- 灵遁者散文小说集《从今往后》:永远都是开始
- 数字签名?电子签名?傻傻分不清楚!