Android仿支付宝上芝麻信用分雷达图

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

二、思路

1、确定雷达图中心点坐标

2、绘制多边形及连接线

3、根据维度值绘制覆盖区域

4、绘制分数

5、绘制每个维度的标题文字和图标

三、实现

获取布局的中心坐标

在onSizeChanged(int w, int h, int oldw, int oldh)方法里面,根据View的长宽,计算出雷达图的半径(这里取布局宽高最小值的四分之一,可以自定义),获取整个布局的中心坐标。

public class CreditScoreView extends View { //数据个数 private int dataCount = 5; //每个角的弧度 private float radian = (float) (Math.PI * 2 / dataCount); //雷达图半径 private float radius; //中心X坐标 private int centerX; //中心Y坐标 private int centerY; //各维度标题 private String[] titles = {"履约能力", "信用历史", "人脉关系", "行为偏好", "身份特质"}; //各维度图标 private int[] icons = {R.mipmap.ic_performance, R.mipmap.ic_history, R.mipmap.ic_contacts, R.mipmap.ic_predilection, R.mipmap.ic_identity}; //各维度分值 private float[] data = {170, 180, 160, 170, 180}; //数据最大值 private float maxValue = 190; //雷达图与标题的间距 private int radarMargin = DensityUtils.dp2px(getContext(), 15); //雷达区画笔 private Paint mainPaint; //数据区画笔 private Paint valuePaint; //分数画笔 private Paint scorePaint; //标题画笔 private Paint titlePaint; //图标画笔 private Paint iconPaint; //分数大小 private int scoreSize = DensityUtils.dp2px(getContext(), 28); //标题文字大小 private int titleSize = DensityUtils.dp2px(getContext(), 13); ... @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { //雷达图半径 radius = Math.min(h, w) / 2 * 0.5f; //中心坐标 centerX = w / 2; centerY = h / 2; postInvalidate(); super.onSizeChanged(w, h, oldw, oldh); } ... }

绘制多边形和连接线

主要看下getPoint方法,此方法封装了获取雷达图上各个点坐标的计算逻辑。

/** * 绘制多边形 * * @param canvas 画布 */ private void drawPolygon(Canvas canvas) { Path path = new Path(); for (int i = 0; i < dataCount; i++) { if (i == 0) { path.moveTo(getPoint(i).x, getPoint(i).y); } else { path.lineTo(getPoint(i).x, getPoint(i).y); } } //闭合路径 path.close(); canvas.drawPath(path, mainPaint); } /** * 绘制连接线 * * @param canvas 画布 */ private void drawLines(Canvas canvas) { Path path = new Path(); for (int i = 0; i < dataCount; i++) { path.reset(); path.moveTo(centerX, centerY); path.lineTo(getPoint(i).x, getPoint(i).y); canvas.drawPath(path, mainPaint); } }

getPoint方法,参数radarMargin与percent在此步骤赋予默认值。

/** * 获取雷达图上各个点的坐标 * * @param position 坐标位置(右上角为0,顺时针递增) * @return 坐标 */ private Point getPoint(int position) { return getPoint(position, 0, 1); } /** * 获取雷达图上各个点的坐标(包括维度标题与图标的坐标) * * @param position 坐标位置 * @param radarMargin 雷达图与维度标题的间距 * @param percent 覆盖区的的百分比 * @return 坐标 */ private Point getPoint(int position, int radarMargin, float percent) { int x = 0; int y = 0; if (position == 0) { x = (int) (centerX + (radius + radarMargin) * Math.sin(radian) * percent); y = (int) (centerY - (radius + radarMargin) * Math.cos(radian) * percent); } else if (position == 1) { x = (int) (centerX + (radius + radarMargin) * Math.sin(radian / 2) * percent); y = (int) (centerY + (radius + radarMargin) * Math.cos(radian / 2) * percent); } else if (position == 2) { x = (int) (centerX - (radius + radarMargin) * Math.sin(radian / 2) * percent); y = (int) (centerY + (radius + radarMargin) * Math.cos(radian / 2) * percent); } else if (position == 3) { x = (int) (centerX - (radius + radarMargin) * Math.sin(radian) * percent); y = (int) (centerY - (radius + radarMargin) * Math.cos(radian) * percent); } else if (position == 4) { x = centerX; y = (int) (centerY - (radius + radarMargin) * percent); } return new Point(x, y); }

多边形和连接线

绘制覆盖区域

/** * 绘制覆盖区域 * * @param canvas 画布 */ private void drawRegion(Canvas canvas) { Path path = new Path(); for (int i = 0; i < dataCount; i++) { //计算百分比 float percent = data[i] / maxValue; int x = getPoint(i, 0, percent).x; int y = getPoint(i, 0, percent).y; if (i == 0) { path.moveTo(x, y); } else { path.lineTo(x, y); } } //绘制填充区域的边界 path.close(); valuePaint.setStyle(Paint.Style.STROKE); canvas.drawPath(path, valuePaint); //绘制填充区域 valuePaint.setStyle(Paint.Style.FILL_AND_STROKE); canvas.drawPath(path, valuePaint); }

覆盖区域

绘制分数

/** * 绘制分数 * * @param canvas 画布 */ private void drawScore(Canvas canvas) { int score = 0; //计算总分 for (int i = 0; i < dataCount; i++) { score += data[i]; } canvas.drawText(score + "", centerX, centerY + scoreSize / 2, scorePaint); }

分数

绘制标题

/** * 绘制标题 * * @param canvas 画布 */ private void drawTitle(Canvas canvas) { for (int i = 0; i < dataCount; i++) { int x = getPoint(i, radarMargin, 1).x; int y = getPoint(i, radarMargin, 1).y; Bitmap bitmap = BitmapFactory.decodeResource(getResources(), icons[i]); int iconHeight = bitmap.getHeight(); float titleWidth = titlePaint.measureText(titles[i]); //底下两个角的坐标需要向下移动半个图片的位置(1、2) if (i == 1) { y += (iconHeight / 2); } else if (i == 2) { x -= titleWidth; y += (iconHeight / 2); } else if (i == 3) { x -= titleWidth; } else if (i == 4) { x -= titleWidth / 2; } canvas.drawText(titles[i], x, y, titlePaint); } }

标题

绘制图标

/** * 绘制图标 * * @param canvas 画布 */ private void drawIcon(Canvas canvas) { for (int i = 0; i < dataCount; i++) { int x = getPoint(i, radarMargin, 1).x; int y = getPoint(i, radarMargin, 1).y; Bitmap bitmap = BitmapFactory.decodeResource(getResources(), icons[i]); int iconWidth = bitmap.getWidth(); int iconHeight = bitmap.getHeight(); float titleWidth = titlePaint.measureText(titles[i]); //上面获取到的x、y坐标是标题左下角的坐标 //需要将图标移动到标题上方居中位置 if (i == 0) { x += (titleWidth - iconWidth) / 2; y -= (iconHeight + getTextHeight(titlePaint)); } else if (i == 1) { x += (titleWidth - iconWidth) / 2; y -= (iconHeight / 2 + getTextHeight(titlePaint)); } else if (i == 2) { x -= (iconWidth + (titleWidth - iconWidth) / 2); y -= (iconHeight / 2 + getTextHeight(titlePaint)); } else if (i == 3) { x -= (iconWidth + (titleWidth - iconWidth) / 2); y -= (iconHeight + getTextHeight(titlePaint)); } else if (i == 4) { x -= iconWidth / 2; y -= (iconHeight + getTextHeight(titlePaint)); } canvas.drawBitmap(bitmap, x, y, titlePaint); } } /** * 获取文本的高度 * * @param paint 文本绘制的画笔 * @return 文本高度 */ private int getTextHeight(Paint paint) { Paint.FontMetrics fontMetrics = paint.getFontMetrics(); return (int) (fontMetrics.descent - fontMetrics.ascent); }

图标

总结

好了,到这里主要的绘制工作就完成了,有些图标实在找不到,就用相似的代替了。希望这篇文章的内容对各位Android开发者们能有所帮助,如果有疑问大家可以留言交流。

时间: 2024-09-19 11:28:10

Android仿支付宝上芝麻信用分雷达图的相关文章

Android仿支付宝上芝麻信用分雷达图_Android

一.首先看下支付宝上芝麻信用分的效果图: 二.思路      1.确定雷达图中心点坐标      2.绘制多边形及连接线      3.根据维度值绘制覆盖区域      4.绘制分数      5.绘制每个维度的标题文字和图标 三.实现 获取布局的中心坐标 在onSizeChanged(int w, int h, int oldw, int oldh)方法里面,根据View的长宽,计算出雷达图的半径(这里取布局宽高最小值的四分之一,可以自定义),获取整个布局的中心坐标. public class

芝麻信用在支付宝哪 芝麻信用分查看小技巧

1.进入支付宝手机客户端后,选择最下排菜单中的<财富>选项,进入后能看到现在多了芝麻信用分的选项: 2.进入后就可以查看自己的信用分,小编的信用分不错,是优秀呵,不知道这个信用分的具体计算方式,应该和网购.转账.还贷这些支付宝阿里系操作有关. 3.下个图代表了综合评测的五方面,为身份特质.行为偏好.人脉关系.信用历史.履约能力;行为偏好是指看的东西是不是高大上? 4.下方有<信用猜猜>和好友比拼谁的分数高,可以选择手机通讯簿里的人,唉,这个不太安全啦 5.另一项<信用生活&g

支付宝APP芝麻信用分提升方法解析

给各位支付宝软件的使用者们来详细的解析分享一下芝麻信用分提升的方法. 方法分享: 1.首先,打开支付宝,找到芝麻信用分的窗口,我们可以查到自己目前的芝麻信用分.芝麻信用分越多,可透支额度就越高,例如我开通时,就有10000块的可透支额度.         2.通常来说,影响你的芝麻信用分有五大主要因素,一是身份特质,比较丰富的真实的学习或职业经历信息,还有你的实名消费行为.简单点说,就是你平时用支付宝购买的本人的火车票,机票等实名制消费,可以提高你的芝麻信用分.     3.二就是行为偏好,也就

Android自定义View仿支付宝芝麻信用分仪表盘_Android

先看下iOS的芝麻信用分截图 这是我做的效果,还是有点差距的 支付宝9.9版本芝麻信用分的实现 首先初始化各种画笔,默认的size,padding,小圆点. (因为实在找不到原版芝麻信用的带点模糊效果的小圆点,所以只好用这个代替) //View的默认大小 defaultSize = dp2px(250); //默认Padding大小 arcDistance = dp2px(14); //外层圆环画笔 mMiddleArcPaint = new Paint(Paint.ANTI_ALIAS_FLA

js canvas仿支付宝芝麻信用分仪表盘_javascript技巧

这是一个仿支付宝芝麻信用分的一个canvas,其实就是一个动画仪表盘. 首先, 上原图: 这个是在下支付宝上的截图,分低各位见笑了.然后看下我用canvas实现的效果图: <canvas id="canvas" width="400" height="700" data-score='724'></canvas> <!-- 设置data-score,分数区间[400, 900] --> 唉,总感觉不像.这个是G

支付宝芝麻分可以办签证?支付宝芝麻信用分办理签证教程

1.首先需要在淘宝的阿里旅行去啊中选择相应国家的"签证" 2.在支付宝中查看芝麻信用分是否符合申请标准,然后填写签证申请表 3.上传资料,在平常的办理签证过程是需要很繁琐的手续,在支付宝芝麻分办签证过程中就省去了很多步骤,只需提交护照,照片和14A受理申请表就行了. 4.在线支付办理费用,然后等待出签证,电子签证会发送到Email邮箱中,整个过程大概需要等待3-4天.

提高支付宝芝麻信用分多种方法 芝麻信用分暴增技巧分享

11月27日,来自支付宝名为"校友日记"的"生活圈"截图火爆刷屏.根据支付宝相关页面的介绍,"校园日记"只有女大学生才可以发布动态,不能发布动态的用户可以点赞和打赏,芝麻信用分大于等于750分的用户还可以进行评论. 同时,支付宝也针对白领人群上线了"白领日记"的生活圈,只有白领女士才可以发布动态."你可以在这里聊聊你的职场经历,也可以记录每天的生活瞬间",与校园日记类似,不能发布动态的用户可以点赞.打赏,芝

怎么用支付宝芝麻分办签证?芝麻信用分在哪查看

芝麻信用分在哪查看 打开手机支付宝钱包--财富--芝麻信用分 支付宝怎么用芝麻分办签证 1.登录阿狸旅行,去啊选择签证 2.登录后查看芝麻分,是否符合申请标准,并填写申请表 3.上传资料 4.在线支付,等候出签,电子签发送至电子邮箱周期3-4天 芝麻分卢森堡签证办理方法 1.登录阿里旅行去啊选择签证 2.在线生成芝麻信用报告并提交 3.提交材料 4.付款去大使馆录入指纹 芝麻分在750分以上的亲可以在6月底通过阿里旅行办理卢森堡的"信用签证",申请成功后就可以在申根联盟国家自由出入,芝

支付宝芝麻信用分申请“好期贷”教程

在支付宝页面可以看见,芝麻分在700以上的用户有机会申请开通支付宝好期贷.所以说要想用支付宝芝麻信用贷款,就先把自己的芝麻信用分升起来再说.下面就给大家说说支付宝芝麻信用分达到700分后开通好期贷一些注意事项和方法. "好期贷"是什么? "好期贷"是招商银行与联通集团的合资公司"招联消费金融公司"推出的一款互联网在线个人消费贷款产品.信用贷款不须抵押,无需担保,纯凭个人信用获取贷款. 贷款额度:2000-10000元 贷款期限:3.6.12个月