Andriod雷达图简单实现
来源:互联网 发布:飞控软件 语言 编辑:程序博客网 时间:2024/04/29 20:54
最近又被毕设指导老师鄙视了一番,说我的方法不适用,表示毕设求过。
实习也快结束了,也没做出什么东西来,感觉很不好。
雷达图效果图
代码:
package com.fr.chart.render;import android.content.Context;import android.graphics.*;import android.view.MotionEvent;import android.view.View;import com.fr.tools.MathTools;import org.json.JSONObject;/** * User: randost * Date: 2014/4/23 * 雷达图 */public class RadarView extends View{ private int count = 6; //数据个数 private float angle = 360/count; private int point_radius = 5; //数据点的半径 private int regionwidth = 30; //点击选取区域大小 private int valueRulingCount = 5; //等分值线个数 private int radius; //网格最大半径 private int centerX; //中心X private int centerY; //中心Y private String[] titles = {"a","b","c","d","e","f"}; private Point[] pts; //维度端点 private Region[] regions; //打分点区域 private float[] regionValues; //打分点分数 private Path valuePath; private double[] data = {8,6,6,6,4,5}; //各维度分值 private float maxValue = 100; //数据最大值 private Point[] value_pts; //维度端点 private Paint mainPaint; //雷达区画笔 private Paint valuePaint; //数据区画笔 private Paint textPaint; //文本画笔 //构造函数 public RadarView(Context context, org.mozilla.javascript.Context jsCx, JSONObject options) { super(context); } public RadarView(Context context, double[] data, String[] titles) { super(context); setData(data); setTitles(titles); init(); } //初始化 private void init() { if (data.length == titles.length) { count = data.length; } maxValue = (float) MathTools.roundUp(MathTools.max(data)); mainPaint = new Paint(); mainPaint.setAntiAlias(true); mainPaint.setColor(Color.GRAY); mainPaint.setStyle(Paint.Style.FILL_AND_STROKE); valuePaint = new Paint(); valuePaint.setAntiAlias(true); valuePaint.setColor(Color.BLUE); valuePaint.setStyle(Paint.Style.FILL_AND_STROKE); textPaint = new Paint(); textPaint.setTextSize(20); textPaint.setStyle(Paint.Style.FILL); textPaint.setColor(Color.BLACK); pts = new Point[count]; value_pts = new Point[count]; valuePath = new Path(); for(int i=0; i<count; i++) { pts[i] = new Point(); value_pts[i] = new Point(); } regionValues = new float[count*valueRulingCount*2]; regions = new Region[count*valueRulingCount*2]; for(int i=0; i<regions.length; i++) { regions[i] = new Region(); } } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { radius = Math.min(h, w)/2 - 50; centerX = w/2; centerY = h/2; for(int i=0; i<count; i++) { pts[i].x = centerX+(int)(radius*Math.cos(Math.toRadians(angle*i))); pts[i].y = centerY-(int)(radius*Math.sin(Math.toRadians(angle*i))); //逆时针- for(int j=1; j<=valueRulingCount*2; j++) { int x = centerX + (pts[i].x-centerX)/(valueRulingCount*2)*j; int y = centerY + (pts[i].y-centerY)/(valueRulingCount*2)*j; regions[i*valueRulingCount*2+j-1].set(x-regionwidth/2, y-regionwidth/2, x+regionwidth/2, y+regionwidth/2); regionValues[i*valueRulingCount*2+j-1] = j * maxValue / valueRulingCount / 2; } } postInvalidate(); super.onSizeChanged(w, h, oldw, oldh); } @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); float x = event.getX(); float y = event.getY(); switch(action) { case MotionEvent.ACTION_DOWN: for(int i = 0; i<regions.length; i++) { if (regions[i].contains((int)x, (int)y)) { data[(i/(valueRulingCount*2))] = regionValues[i]; break; } } invalidate(); break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: break; } return super.onTouchEvent(event); } @Override protected void onDraw(Canvas canvas) { canvas.drawColor(Color.WHITE); //绘制雷达网格 for(int i=0; i<count; i++) { int end = i+1 == count? 0:i+1; for(int j=1; j<=valueRulingCount; j++) { canvas.drawLine(centerX+(pts[i].x-centerX)*j/valueRulingCount, centerY+(pts[i].y-centerY)*j/valueRulingCount, centerX+(pts[end].x-centerX)*j/valueRulingCount, centerY+(pts[end].y-centerY)*j/valueRulingCount, mainPaint); } canvas.drawLine(centerX, centerY, pts[i].x, pts[i].y, mainPaint); } //绘制四周文本 Paint.FontMetrics fontMetrics = textPaint.getFontMetrics(); float fontHeight = fontMetrics.ascent; for(int i=0; i<count; i++) { if ((angle * i == 90.0) || (angle * i == 270.0)) textPaint.setTextAlign(Paint.Align.CENTER); else if ((angle * i < 90) || (angle * i > 270)) textPaint.setTextAlign(Paint.Align.LEFT); else if ((angle * i > 90) || (angle * i < 270)) textPaint.setTextAlign(Paint.Align.RIGHT); if (angle * i > 225 && angle * i < 315) canvas.drawText(titles[i], pts[i].x, pts[i].y-fontHeight, textPaint); else canvas.drawText(titles[i], pts[i].x, pts[i].y, textPaint); } for(int i=0; i<count; i++) { value_pts[i].x = (int)(centerX + (pts[i].x-centerX) * data[i]/maxValue); value_pts[i].y = (int)(centerY + (pts[i].y-centerY) * data[i]/maxValue); } //绘制数据图 valuePath.reset(); for(int i = 0; i< pts.length; i++) { if (i == 0) valuePath.moveTo(value_pts[i].x, value_pts[i].y); else valuePath.lineTo(value_pts[i].x, value_pts[i].y); canvas.drawCircle(value_pts[i].x, value_pts[i].y, point_radius, valuePaint); } valuePaint.setAlpha(150); canvas.drawPath(valuePath, valuePaint); } public void setTitles(String[] titles) { this.titles = titles; } public void setData(double[] data) { this.data = data; }}
0 0
- Andriod雷达图简单实现
- echarts图表库 实现简单 雷达图
- andriod折线图简单实现
- andriod饼图简单实现
- andriod面积图简单实现
- andriod柱形图简单实现
- andriod散点图简单实现
- 神器!!!简单一步就可以实现雷达图
- Qt 实现雷达图
- 雷达扫描View的简单实现
- Hightchart 实现 polar 雷达图
- Dundas Chart 雷达图,RadarChart简单示例
- andriod饼图(3d)简单实现
- cocos2dx实现游戏属性雷达图
- Android雷达图变种的一个实现
- [MSCHART]如何使用MSCHART实现雷达图
- iOS雷达图 iOS RadarChart实现
- iOS雷达图 iOS RadarChart实现
- 关于Qt中翻译不对的问题
- cannot convert parameter 1 from 'const char [] ' to 'const wchar_t * '的解决方法
- 韩国hanatour的gnis系统考勤管理修改建议
- FTP命令详解
- 编程之美初赛题:相似字符串
- Andriod雷达图简单实现
- 解决rpm 命令不能用
- <Linux> Xen虚拟机下挂载
- CSDN博客的一些问题(友好的吐槽)--后记,有一点点改进
- mysql 各种命令 二
- 视觉算法-区域增长
- 西北工业大学_2011___考研计算机_复试上机
- 从一道面试题谈linux下fork的运行机制
- 远程桌面连接时,用电脑名不能连接,用IP就可以,为什么