首先看下支付宝上芝麻信用分的效果图:

今天来下面的效果

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仿芝麻信用分雷达分布图相关推荐

  1. [置顶] Android自定义控件 芝麻信用分雷达图

    [置顶] Android自定义控件 芝麻信用分雷达图 标签: android自定义雷达芝麻信用 2016-10-23 20:11  3548人阅读  评论(24)  收藏  举报   分类: 自定义控 ...

  2. Android仿芝麻信用分

    1.先准备好图片 2.新建一个CreditScoreView类,继承View public class CreditScoreView extends View {//数据个数private int ...

  3. canvas仿芝麻信用分画的一个刻度表(可根据分数变色)

    有些时间没练习canvas了,感觉好像略有生疏,这次是canvas仿芝麻信用分画了一个刻度表,没有特别难的地方,不过在计算时也算折腾了一番. 因为需要有五种状态,所以根据传入的值,进入了五种判断,并给 ...

  4. Android 仿芝麻信用进度条,Android仿支付宝上芝麻信用分雷达图

    一.首先看下支付宝上芝麻信用分的效果图: 二.思路 1.确定雷达图中心点坐标 2.绘制多边形及连接线 3.根据维度值绘制覆盖区域 4.绘制分数 5.绘制每个维度的标题文字和图标 三.实现 获取布局的中 ...

  5. Android 仿芝麻信用进度条,自定义View仿支付宝芝麻信用分仪表盘效果

    image 前言 灵感来自几天前看到一位作者的仿芝麻信用自定义View的文章很不错,所以我换了一种方式来进行实现,写了旧版和新版芝麻信用分仪表盘的效果. 截图 这是我做的效果,还是有点差距的,嘿嘿. ...

  6. 支付宝 android ui,Android 仿支付宝芝麻信用分仪表盘效果 CreditSesameRingView

    软件介绍 自定义View之仿支付宝芝麻信用分仪表盘效果,喜欢的话,请给个star,谢谢. 使用添加项目依赖Add it in your root build.gradle at the end of  ...

  7. android 自定义中文加盘,Android自定义View仿支付宝芝麻信用分仪表盘

    先看下iOS的芝麻信用分截图 这是我做的效果,还是有点差距的 支付宝9.9版本芝麻信用分的实现 首先初始化各种画笔,默认的size,padding,小圆点. (因为实在找不到原版芝麻信用的带点模糊效果 ...

  8. 自定义View之仿支付宝v9.9芝麻信用分仪表盘效果

    点击上方蓝字关注公众号 码个蛋第242次推文 因为信用,所以简单 作者:hotBitmapGG 博客:http://www.jianshu.com/u/566d6cec0ebc 文章目录 前言 截图 ...

  9. 自定义View仿支付宝芝麻信用分仪表盘效果

    前言 灵感来自几天前看到一位作者的仿芝麻信用自定义View的文章很不错,所以我换了一种方式来进行实现,写了旧版和新版芝麻信用分仪表盘的效果. Github地址: https://github.com/ ...

  10. 芝麻信用分SDK接入,显示芝麻信用授权界面(Android)

    转自:http://blog.csdn.net/coycleipenghui/article/details/52909367 前言:本文主要介绍芝麻信用授权在app中的接入工作,以及代码中出现onC ...

最新文章

  1. 一文搞懂结构体的定义及实际使用
  2. 采集网站特殊文件Meta信息
  3. [003]Reference in C++---C++引用基础知识篇
  4. 实战mongodb3.06 Relica Sets+sharding集群
  5. python下常用OpenCV代码
  6. SQL SERVER备份脚本
  7. “无法找到运行搜索助理需要的一个文件”的解决办法
  8. F-Spot 0.3.2
  9. 手机上有没有学python的软件-【Learn Python】用手机学Python
  10. 拯救天使 (BFS)
  11. web网页开发-前端
  12. Pr 水墨动画转场效果
  13. 学会对VUE的SEO优化,你的网站总是排在前面
  14. spring + springmvc +mybatis 搭建 maven 项目的核心配置文件
  15. 信用风险建模 in Python 系列 7 - ASRF 模型
  16. python——简单通讯录
  17. arcgis server里预览地图显示空白
  18. 用户反馈信息textbox填充数据表,页面使用gridview显示反馈意见
  19. learnOpenGL-深度测试
  20. 四种访问修饰符---(Java版)

热门文章

  1. Redo log In-depth(Only for experienced Oracle DBA NOT for Fresher DBA)
  2. IIC总线最多能接几个设备
  3. HTML5期末大作业:南京旅游网站设计——六朝古都-南京旅游(10页) HTML+CSS+JavaScript 出游旅游主题度假酒店 计划出行网站设计
  4. matlab syms类型,matlab中syms类型的转换
  5. 滴滴裁员2000人启示:牛逼的人,都有铁饭碗
  6. 冰刃(icesword) V1.22 Final┊官方中文绿色版
  7. macOS 原生系统压缩文件在 Windows 上解压可能会乱码的原因及解决办法
  8. kettle-java代码执行hive相关ktr时报错: database type with plugin id [HIVE2] couldn‘t be found!
  9. 灵遁者散文小说集《从今往后》:永远都是开始
  10. 数字签名?电子签名?傻傻分不清楚!