1.先准备好图片

2.新建一个CreditScoreView类,继承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);public CreditScoreView(Context context) {this(context, null);}public CreditScoreView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public CreditScoreView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}private void init() {mainPaint = new Paint();mainPaint.setAntiAlias(true);mainPaint.setStrokeWidth(0.3f);mainPaint.setColor(Color.WHITE);mainPaint.setStyle(Paint.Style.STROKE);valuePaint = new Paint();valuePaint.setAntiAlias(true);valuePaint.setColor(Color.WHITE);valuePaint.setAlpha(120);valuePaint.setStyle(Paint.Style.FILL_AND_STROKE);scorePaint = new Paint();scorePaint.setAntiAlias(true);scorePaint.setTextSize(scoreSize);scorePaint.setColor(Color.WHITE);scorePaint.setTextAlign(Paint.Align.CENTER);scorePaint.setStyle(Paint.Style.FILL);titlePaint = new Paint();titlePaint.setAntiAlias(true);titlePaint.setTextSize(titleSize);titlePaint.setColor(Color.WHITE);titlePaint.setStyle(Paint.Style.FILL);iconPaint = new Paint();iconPaint.setAntiAlias(true);}@Overrideprotected 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);}@Overridepublic void draw(Canvas canvas) {super.draw(canvas);drawPolygon(canvas);drawLines(canvas);drawRegion(canvas);drawScore(canvas);drawTitle(canvas);drawIcon(canvas);}/*** 绘制多边形** @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);}}/*** 绘制覆盖区域** @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 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 paint 文本绘制的画笔* @return 文本高度*/private int getTextHeight(Paint paint) {Paint.FontMetrics fontMetrics = paint.getFontMetrics();return (int) (fontMetrics.descent - fontMetrics.ascent);}
}

3.DensityUtils类

public class DensityUtils {public static int dp2px(Context context, float dp) {//获取设备密度float density = context.getResources().getDisplayMetrics().density;//4.3, 4.9, 加0.5是为了四舍五入int px = (int) (dp * density + 0.5f);return px;}public static float px2dp(Context context, int px) {//获取设备密度float density = context.getResources().getDisplayMetrics().density;float dp = px / density;return dp;}
}

4.在activity的xml中写上这个控件,设上背景就好

<com.example.jy_mac_01.myapplication.CreditScoreViewandroid:layout_width="300dp"android:layout_height="300dp"android:layout_centerInParent="true"android:background="@color/colorPrimary" />

5.运行

6.完结

Android仿芝麻信用分相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. mysql中sql语句
  2. 独家 | 忘记波士顿动力公司。这个机器人可以自学走路
  3. 开源Python做的火币和ZB搬砖差价监控程序
  4. 腾讯产品面试题 | 如何把剃须刀卖给张飞?
  5. uboot通过使用U磁盘引导内核RT5350成功
  6. leetcode 355. Design Twitter | 355. 设计推特(Java)
  7. mysql 建数据库并设置为utf-8编码
  8. CSS、JavaScript和Ajax实现图片预加载的三大方法及优缺点分析
  9. 屏蔽tomcat服务器报错信息,tomcat 屏蔽网络爬虫
  10. Doris之分区缓存(全面)
  11. frame越过另一个frame_Python3.6实现一个简单的文本编辑器
  12. 怎样通过java用web3j查询以太坊交易信息?
  13. Atitit 企业文化之道 ---假日文化 attilax总结
  14. Rust: 如何与DLL文件进行交互?
  15. 找网络高手联系方式_怎么才能联系到网络高手(找网络大牛联系方式)
  16. CSS3实现缺角矩形,缺角边框以及折角矩形
  17. 开发了一款开虚拟店通过百度网盘卖成千上万本电子书虚拟商品自动发货机器人软件助手
  18. 新浪云服务器注册免费,新浪免费云空间SAE注册及云豆获取方法
  19. java内存分析工具_java内存查看与分析
  20. 什么是 FOUC(无样式内容闪烁)?你如何来避免 FOUC?

热门文章

  1. linux 实时监控文件的输出
  2. 1015葛芮杉李睿莹|1-圖像处理与人脸识别的结合应用。群里贴图2-每组学会一个新的ffmpeg的命令,用于视音频处理(自学:看文档,搜索等)3-每组学会2个图像处理的函数,贴图
  3. 没人比得过的游吧看吧
  4. 又见人面桃花相映红!(2008-07-28 10:21:32| 分类: 心情故事)
  5. FPGA 基于双端口RAM的串口通信系统
  6. 能否实现 Ext.grid.ColumnModel 宽度动态适应
  7. 顶尖资源整合模式,儿童玩具市场借力各商家,全新的方案让人疯狂
  8. Jetson TX1 刷机(20221107亲测教程)完整程度⭐⭐⭐⭐⭐避免踩坑
  9. mybatis--开发Dao--原始dao方式和Mapper代理方式
  10. 想要打印数码照片?“Pixelmator Pro”教你如何自行裁剪出清晰生动的照片!