Android 自定义雷达图

来源:互联网 发布:linux命令行上网 编辑:程序博客网 时间:2024/05/16 00:29
package com.cnten.demo.graph;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.Align;import android.graphics.Paint.FontMetrics;import android.graphics.Path;import android.graphics.Point;import android.graphics.Region;import android.view.KeyEvent;import android.view.MotionEvent;import android.view.View;import android.widget.Toast;/** * 雷达图 *  * @author Administrator *  */public class LifeWheelRadarGraph extends View {private static int count = 8;private float angle = 360 / count;private int point_radius = 5; // 画点的半径private int regionwidth = 40; // 选择分值小区域宽度private int valueRulingCount = 5; // 画等分值线private int radius;private int centerX;private int centerY;private static String[] titles = { "工作", "财富", "健康", "娱乐", "家庭", "社交","精神", "贡献" };private static LifeWheelRadarGraph lfrg = null;private Point[] pts; // 维度端点private Region[] regions; // 打分点区域private float[] regionValues; // 打分点分数private Path valuePath;private static float[] values = { 8, 6, 8, 6, 6, 6, 4, 5 }; // 各维度分值private int maxValue = 10;private Point[] value_pts; // 维度端点private Paint paint;private Paint valuePaint;public float[] getValues() {return values;}public static LifeWheelRadarGraph getInstance(Context context,String[] titile, float[] values) {titles = titile;LifeWheelRadarGraph.values = values;count = titile.length;if (lfrg == null)lfrg = new LifeWheelRadarGraph(context);return lfrg;}public static LifeWheelRadarGraph newInstance(Context context,String[] titile, float[] values) {titles = titile;LifeWheelRadarGraph.values = values;count = titile.length;return new LifeWheelRadarGraph(context);}private LifeWheelRadarGraph(Context context) {super(context);init();}/** * 初始化方法 */public void init() {paint = new Paint();valuePaint = new Paint();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();}}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {radius = Math.min(h, w) / 2 - 40;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;}}postInvalidate();super.onSizeChanged(w, h, oldw, oldh);}@SuppressWarnings("unused")@Overridepublic boolean onTouchEvent(MotionEvent event) {int action = event.getAction();float x = event.getX();float y = event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:for (int i = 0; i < regions.length; i++) {if (regions[i].contains((int) x, (int) y)) {values[(int) (i / (valueRulingCount * 2))] = regionValues[i];break;}}invalidate();break;case MotionEvent.ACTION_MOVE:break;case MotionEvent.ACTION_UP:break;}return super.onTouchEvent(event);}@Overridepublic boolean onKeyLongPress(int keyCode, KeyEvent event) {// TODO Auto-generated method stubreturn super.onKeyLongPress(keyCode, event);}@Overrideprotected void onDraw(Canvas canvas) {canvas.drawColor(Color.WHITE);/* 设置画布的颜色 */paint.setAntiAlias(true);paint.setColor(Color.GRAY); // 画边框线paint.setStyle(Paint.Style.FILL_AND_STROKE);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) / 5 * j, centerY+ (pts[i].y - centerY) / 5 * j, centerX+ (pts[end].x - centerX) / 5 * j, centerY+ (pts[end].y - centerY) / 5 * j, paint);}canvas.drawLine(centerX, centerY, pts[i].x, pts[i].y, paint);}// 写文字paint.setTextSize(20);paint.setColor(Color.BLACK);FontMetrics fontMetrics = paint.getFontMetrics();float fontHegiht = -fontMetrics.ascent;for (int i = 0; i < count; i++) {if ((angle * i == 90.0) || (angle * i == 270.0))paint.setTextAlign(Align.CENTER);else if ((angle * i < 90) || (angle * i > 270))paint.setTextAlign(Align.LEFT);else if ((angle * i > 90) || (angle * i < 270))paint.setTextAlign(Align.RIGHT);if (angle * i == 270.0)canvas.drawText(titles[i], pts[i].x, pts[i].y + fontHegiht,paint);elsecanvas.drawText(titles[i], pts[i].x, pts[i].y, paint);}// 画方向盘分值区域for (int i = 0; i < count; i++) {value_pts[i].x = (int) (centerX + (pts[i].x - centerX) * values[i]/ maxValue);value_pts[i].y = (int) (centerY + (pts[i].y - centerY) * values[i]/ maxValue);}valuePath.reset();valuePaint.setAntiAlias(true);valuePaint.setColor(Color.BLUE);valuePaint.setStyle(Paint.Style.FILL_AND_STROKE);for (int i = 0; i < pts.length; i++) {// 给valuePath赋值if (i == 0)valuePath.moveTo(value_pts[i].x, value_pts[i].y);elsevaluePath.lineTo(value_pts[i].x, value_pts[i].y);// 画取分圆圈canvas.drawCircle(value_pts[i].x, value_pts[i].y, point_radius,paint);}valuePaint.setAlpha(150);canvas.drawPath(valuePath, valuePaint);}}

使用方法:

package com.cnten.demo;import com.cnten.demo.graph.LifeWheelRadarGraph;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.view.View;import android.view.ViewGroup.LayoutParams;import android.widget.Toast;public class SendActivity extends Activity {private String[] titles = { "工作", "财富", "健康", "娱乐", "家庭", "社交", "精神", "贡献","1111", "21312" };private float[] values = { 8, 6, 8, 6, 6, 6, 4, 5, 2, 3 }; // 各维度分值@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_send);LifeWheelRadarGraph lf = LifeWheelRadarGraph.newInstance(this, titles,values);addContentView(lf, new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));}}
源码地址:点击打开链接   访问密码 d7ca

0 0