蜘蛛图表SpiderChart
效果圖
原理分析:
獲取基本信息:
A、確定中心點(diǎn)的坐標(biāo)x,y;
B、確定半徑radius,本控件設(shè)置radius為Math.min(w,h)的3/8,因?yàn)檫€要給五個(gè)角上的文本預(yù)留位置
C、得到單個(gè)環(huán)的寬度,圖中為5層環(huán),所以單個(gè)環(huán)的寬度radiusSingle = radius / 5;
繪制步驟:(從底層到上層繪制)
A、由外到內(nèi)繪制5個(gè)不同半徑的五邊形(五個(gè)環(huán)形,相鄰的環(huán)顏色是不一樣的,如果是一樣的顏色,繪制一個(gè)大五邊形就可以了)
B、繪制區(qū)隔環(huán)的封閉黑色線,以及中心放射到五個(gè)角的直線。
C、繪制五個(gè)角的文本(使用drawText()方法),也可以繪制圖片(使用drawBitmap()方法)。
D、繪制數(shù)據(jù)值區(qū)域,原理同A、B,繪制一個(gè)五邊形,同時(shí)繪制該五邊形的封閉邊線,最后在五個(gè)角的坐標(biāo)點(diǎn)繪制圓環(huán)。
代碼分解
A、創(chuàng)建SpiderChart類(lèi)繼承自View,并生成構(gòu)造方法。
public class SpiderChart extends View {public SpiderChart(Context context) {super(context);}public SpiderChart(Context context, AttributeSet attrs) {super(context, attrs);initDefineAttrs(context, attrs);initPaint();}public SpiderChart(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initDefineAttrs(context, attrs);initPaint();}}其中initDefineAttrs(context, attrs)為自定義屬性方法,initPaint()為初始化畫(huà)筆方法。具體代碼如下:
initDefineAttrs(context, attrs)
(1)其中用到的默認(rèn)寬、高數(shù)值可在本文最終代碼里查看,這里不列明。
(2)用到的樣式表R.styleable.SpiderChart需要在res-values-attrs.xml文件里聲明,內(nèi)容如下:
initPaint()初始化畫(huà)筆的方法代碼如下:
private void initPaint() {paintRing.setAntiAlias(true);paintRing.setStrokeWidth(spiderRingLineWidth);paintRing.setStyle(Paint.Style.FILL);paintRingLine.setAntiAlias(true);paintRingLine.setStrokeWidth(spiderRingLineWidth);paintRingLine.setStyle(Paint.Style.STROKE);paintRingLine.setColor(spiderRingLineColor);paintValuePoint.setAntiAlias(true);paintValuePoint.setColor(spiderValuePointColor);paintValuePoint.setStrokeWidth(spiderValuePointRadius);paintValuePoint.setStyle(Paint.Style.FILL);paintValueLine.setAntiAlias(true);paintValueLine.setColor(spiderValueLineColor);paintValueLine.setStrokeWidth(spiderValueLineWidth);paintValueLine.setStyle(Paint.Style.STROKE);paintValueRect.setAntiAlias(true);paintValueRect.setColor(spiderValueRectColor);paintValueRect.setStyle(Paint.Style.FILL);paintTitle.setAntiAlias(true);paintTitle.setTextAlign(Paint.Align.CENTER);paintTitle.setColor(spiderTitleColor);paintTitle.setStrokeWidth(1);paintTitle.setStyle(Paint.Style.FILL);paintTitle.setTextSize(spiderTitleSize);}B、在onSizeChanged()方法里確定基本的寬高、半徑等數(shù)值信息
@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {getBaseInfo(w, h);postInvalidate();super.onSizeChanged(w, h, oldw, oldh);}/** 獲取基本的數(shù)值信息 */private void getBaseInfo(int w, int h) {radius = Math.min(w, h) * 3 / 8;radiusSingle = radius / ringNum;centerX = w / 2;centerY = h / 2;}C、所有的繪制都在onDraw()方法里邊進(jìn)行處理
可以看出繪制步驟:繪制背景五邊形->繪制封閉線->繪制標(biāo)題->繪制數(shù)據(jù)值區(qū)域(其中有用到getPoint()方法,代碼在四個(gè)步驟方法下)
(1)drawBackground(canvas)
private void drawBackground(Canvas canvas) {for (int n=0; n<DEFAULT_RING_NUM; n++) {float radiusRing = radius - (radiusSingle * n);Path pathBg = new Path();for (int i=0; i<DEFAULT_POINT_NUM; i++) {int x = getPoint(i, radiusRing).x;int y = getPoint(i, radiusRing).y;if(i == 0)pathBg.moveTo(x, y);elsepathBg.lineTo(x, y);}pathBg.close();if(n % 2 == 0)paintRing.setColor(spiderRingLightColor);elsepaintRing.setColor(spiderRingDarkColor);canvas.drawPath(pathBg, paintRing);}}(2)drawBackgroundLine(canvas)
private void drawBackgroundLine(Canvas canvas) {for (int n=0; n<DEFAULT_RING_NUM; n++) {float radiusRing = radius - (radiusSingle * n);Path pathRingLine = new Path();for (int i=0; i<DEFAULT_POINT_NUM; i++) {int x = getPoint(i, radiusRing).x;int y = getPoint(i, radiusRing).y;if(i == 0)pathRingLine.moveTo(x, y);elsepathRingLine.lineTo(x, y);}pathRingLine.close();canvas.drawPath(pathRingLine, paintRingLine);if(n == DEFAULT_POINT_NUM - 1) {for (int j=0; j<DEFAULT_POINT_NUM; j++) {int x = getPoint(j, radius).x;int y = getPoint(j, radius).y;pathRingLine.reset();pathRingLine.moveTo(centerX, centerY);pathRingLine.lineTo(x, y);canvas.drawPath(pathRingLine, paintRingLine);}}}}(3)drawTitle(canvas)
private void drawTitle(Canvas canvas) {float radiusTitle = radius + titleMargin;for (int i=0; i<DEFAULT_POINT_NUM; i++) {int x = getPoint(i, radiusTitle).x;int y = getPoint(i, radiusTitle).y;switch (i) {case 0:canvas.drawText(spiderTitleOne, x, y, paintTitle);break;case 1:x += spiderTitleSize * 2;canvas.drawText(spiderTitleTwo, x, y, paintTitle);break;case 2:y += spiderTitleSize;canvas.drawText(spiderTitleThree, x, y, paintTitle);break;case 3:y += spiderTitleSize;canvas.drawText(spiderTitleFour, x, y, paintTitle);break;case 4:x -= spiderTitleSize * 2;canvas.drawText(spiderTitleFive, x, y, paintTitle);break;}}}(4)drawValue(canvas)
private void drawValue(Canvas canvas) {if(data == null)return;Path path = new Path();float[] fx = new float[5];float[] fy = new float[5];for (int i=0; i<DEFAULT_POINT_NUM; i++) {float percent = data[i] / maxValue;float x = getPoint(i, radius, percent).x;float y = getPoint(i, radius, percent).y;if(i ==0)path.moveTo(x, y);elsepath.lineTo(x, y);fx[i] = x;fy[i] = y;}path.close();canvas.drawPath(path, paintValueLine);canvas.drawPath(path, paintValueRect);for (int j=0; j<fx.length; j++) {paintValuePoint.setColor(spiderValuePointColor);canvas.drawCircle(fx[j], fy[j], spiderValuePointRadius, paintValuePoint);paintValuePoint.setColor(spiderValueInnerPointColor);canvas.drawCircle(fx[j], fy[j], spiderValueInnerPointRadius, paintValuePoint);}}(5)getPoint()方法,獲取SpiderChart上各個(gè)點(diǎn)的坐標(biāo)
/*** 獲取雷達(dá)圖上各個(gè)點(diǎn)的坐標(biāo)(包括維度標(biāo)題與圖標(biāo)的坐標(biāo))* 最頂部坐標(biāo)點(diǎn)position == 0, 順時(shí)針++* @param position 坐標(biāo)位置* @param radius 坐標(biāo)點(diǎn)所在圓的半徑* @return 坐標(biāo)*/private Point getPoint(int position, float radius) {return getPoint(position, radius, 1);}/*** 獲取雷達(dá)圖上各個(gè)點(diǎn)的坐標(biāo)(包括維度標(biāo)題與圖標(biāo)的坐標(biāo))* 最頂部坐標(biāo)點(diǎn)position == 0, 順時(shí)針++* @param position 坐標(biāo)位置* @param radius 坐標(biāo)點(diǎn)所在圓的半徑* @param percent 占總值的比例* @return 坐標(biāo)*/private Point getPoint(int position, float radius, float percent) {int x = 0;int y = 0;if (position == 0) {x = centerX;y = (int) (centerY - radius * percent);} else if (position == 1) {x = (int) (centerX + radius * Math.sin(radian) * percent);y = (int) (centerY - radius * Math.cos(radian) * percent);} else if (position == 2) {x = (int) (centerX + radius * Math.sin(radian / 2) * percent);y = (int) (centerY + radius * Math.cos(radian / 2) * percent);} else if (position == 3) {x = (int) (centerX - radius * Math.sin(radian / 2) * percent);y = (int) (centerY + radius * Math.cos(radian / 2) * percent);} else if (position == 4) {x = (int) (centerX - radius * Math.sin(radian) * percent);y = (int) (centerY - radius * Math.cos(radian) * percent);}return new Point(x, y);}D、供外部調(diào)用設(shè)置數(shù)值的方法
/** 開(kāi)始動(dòng)畫(huà) */public void doAnimation(float[] insertData) {if(insertData == null || insertData.length != 5)return;ValueAnimator animator = ValueAnimator.ofObject(new DataEvaluator(), DEFAULT_DATA, insertData);animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {data = (float[]) animation.getAnimatedValue();invalidate();}});animator.setStartDelay(200);animator.setDuration(800);animator.setInterpolator(new LinearOutSlowInInterpolator());this.setAnimator(animator);animator.start();}/** Cancel Animator */public void cancelAnimator() {this.getAnimator().cancel();}/** 動(dòng)畫(huà)插值器 */private class DataEvaluator implements TypeEvaluator<float[]> {@Overridepublic float[] evaluate(float fraction, float[] startValue, float[] endValue) {float[] newData = new float[startValue.length];for (int i=0; i<startValue.length; i++) {newData[i] = startValue[i] + fraction * (endValue[i] - startValue[i]);}return newData;}}SpiderChart完整代碼,其中的樣式表上文中有,顏色色值可自行設(shè)置
package customview;import android.animation.TypeEvaluator; import android.animation.ValueAnimator; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Point; import android.support.v4.content.ContextCompat; import android.support.v4.view.animation.LinearOutSlowInInterpolator; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.View;import com.example.zpf.animmenu.R;/*** SpiderChart*/ public class SpiderChart extends View {/** 默認(rèn)參數(shù)點(diǎn)的個(gè)數(shù) */private final int DEFAULT_POINT_NUM = 5;/** 默認(rèn)的圓環(huán)數(shù)量 */private final int DEFAULT_RING_NUM = 5;/** 圓環(huán)線的默認(rèn)的寬度 */private final float DEFAULT_RING_LINE_WIDTH = 2;/** 默認(rèn)的數(shù)值圓點(diǎn)的半徑 */private final float DEFAULT_VALUE_POINT_RADIUS = 8;/** 默認(rèn)的數(shù)值圓點(diǎn)的半徑 */private final float DEFAULT_VALUE_INNER_POINT_RADIUS = 4;/** 默認(rèn)的數(shù)值圓點(diǎn)連接線的寬度 */private final float DEFAULT_VALUE_LINE_WIDTH = 2;/** 默認(rèn)的文本的大小 */private final int DEFAULT_TEXT_SIZE = 22;/** 標(biāo)題距離數(shù)據(jù)頂點(diǎn)的距離 */private final float DEFAULT_TITLE_MARGIN = 24;/** 默認(rèn)數(shù)據(jù)集 */private final float[] DEFAULT_DATA = {0, 0, 0, 0, 0};/** 圓環(huán)的個(gè)數(shù) */private int ringNum = DEFAULT_RING_NUM;/** 圖的最大值 */private float maxValue = 100;/** 存儲(chǔ)傳入的數(shù)據(jù)值 */private float[] data;/** 圓心坐標(biāo)、半徑(半徑為長(zhǎng)、寬中最小值的1/4) */private int centerX, centerY;private float radius;/** 每?jī)蓚€(gè)點(diǎn)之間夾角的弧度 */private float radian = (float) (Math.PI * 2 / DEFAULT_POINT_NUM);/** 單個(gè)環(huán)半徑 */private float radiusSingle;/** 方形環(huán)淺色、深色 */private int spiderRingLightColor = ContextCompat.getColor(getContext(), R.color.spider_ring_light);private int spiderRingDarkColor = ContextCompat.getColor(getContext(), R.color.spider_ring_dark);/** 標(biāo)題的顏色、大小、距離標(biāo)題頂點(diǎn)的距離 */private int spiderTitleColor = ContextCompat.getColor(getContext(), R.color.colorGrayDarkDark);private float spiderTitleSize = DEFAULT_TEXT_SIZE;private float titleMargin = DEFAULT_TITLE_MARGIN;/** 標(biāo)題(頂部為titleOne, 順時(shí)針?lè)较?#xff09; */private String spiderTitleOne = "攻擊力",spiderTitleTwo = "防御力",spiderTitleThree = "殺傷范圍",spiderTitleFour = "移動(dòng)速度",spiderTitleFive = "回血速度";/** 內(nèi)部圓環(huán)線的顏色、寬度 */private int spiderRingLineColor = ContextCompat.getColor(getContext(), R.color.spider_ring_line);private float spiderRingLineWidth = DEFAULT_RING_LINE_WIDTH;/** 數(shù)據(jù)值大圓點(diǎn)顏色、半徑 */private int spiderValuePointColor = ContextCompat.getColor(getContext(), R.color.spider_value_line);private float spiderValuePointRadius = DEFAULT_VALUE_POINT_RADIUS;/** 數(shù)據(jù)值小圓點(diǎn)顏色、半徑 */private int spiderValueInnerPointColor = ContextCompat.getColor(getContext(), R.color.spider_ring_light);private float spiderValueInnerPointRadius = DEFAULT_VALUE_INNER_POINT_RADIUS;/** 數(shù)值圓點(diǎn)連接線顏色、寬度 */private int spiderValueLineColor = ContextCompat.getColor(getContext(), R.color.spider_value_line);private float spiderValueLineWidth = DEFAULT_VALUE_LINE_WIDTH;/** 數(shù)據(jù)值包圍范圍的顏色 */private int spiderValueRectColor = ContextCompat.getColor(getContext(), R.color.spider_value_rect);/** 內(nèi)層環(huán)的Paint */private Paint paintRing = new Paint();/** 內(nèi)層環(huán)線的Paint */private Paint paintRingLine = new Paint();/** 內(nèi)層數(shù)值圓點(diǎn)的Paint */private Paint paintValuePoint = new Paint();/** 內(nèi)層數(shù)值連接線的Paint */private Paint paintValueLine = new Paint();/** 內(nèi)層數(shù)值包圍區(qū)域的Paint */private Paint paintValueRect = new Paint();/** 標(biāo)題的Paint */private Paint paintTitle = new Paint();/** 動(dòng)畫(huà) */private ValueAnimator animator;public SpiderChart(Context context) {super(context);}public SpiderChart(Context context, AttributeSet attrs) {super(context, attrs);initDefineAttrs(context, attrs);initPaint();}public SpiderChart(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initDefineAttrs(context, attrs);initPaint();}private ValueAnimator getAnimator() {return animator;}private void setAnimator(ValueAnimator animator) {this.animator = animator;}/** 設(shè)置自定義xml屬性值 */private void initDefineAttrs(Context context, AttributeSet attrs) {DisplayMetrics metrics = context.getResources().getDisplayMetrics();TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.SpiderChart);int count = array.getIndexCount();for (int i=0; i<count; i++) {int attr = array.getIndex(i);switch (attr) {case R.styleable.SpiderChart_spiderRingNum:ringNum = array.getInt(attr, DEFAULT_RING_NUM);break;case R.styleable.SpiderChart_spiderTitleMargin:titleMargin = array.getDimension(attr, DEFAULT_TITLE_MARGIN);break;case R.styleable.SpiderChart_spiderTitleColor:spiderTitleColor = array.getColor(attr,ContextCompat.getColor(context, R.color.colorGrayDarkDark));break;case R.styleable.SpiderChart_spiderTitleSize:spiderTitleSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX,array.getDimensionPixelSize(attr, DEFAULT_TEXT_SIZE), metrics);break;case R.styleable.SpiderChart_spiderTitleOne:spiderTitleOne = array.getString(attr);break;case R.styleable.SpiderChart_spiderTitleTwo:spiderTitleTwo = array.getString(attr);break;case R.styleable.SpiderChart_spiderTitleThree:spiderTitleThree = array.getString(attr);break;case R.styleable.SpiderChart_spiderTitleFour:spiderTitleFour = array.getString(attr);break;case R.styleable.SpiderChart_spiderTitleFive:spiderTitleFive = array.getString(attr);break;case R.styleable.SpiderChart_spiderRingLineColor:spiderRingLineColor = array.getColor(attr,ContextCompat.getColor(context, R.color.spider_ring_line));break;case R.styleable.SpiderChart_spiderRingLineWidth:spiderRingLineWidth = array.getDimension(attr, DEFAULT_RING_LINE_WIDTH);break;case R.styleable.SpiderChart_spiderRingLightColor:spiderRingLightColor = array.getColor(attr,ContextCompat.getColor(context, R.color.spider_ring_light));break;case R.styleable.SpiderChart_spiderRingDarkColor:spiderRingDarkColor = array.getColor(attr,ContextCompat.getColor(context, R.color.spider_ring_dark));break;case R.styleable.SpiderChart_spiderValuePointColor:spiderValuePointColor = array.getColor(attr,ContextCompat.getColor(context, R.color.spider_value_line));break;case R.styleable.SpiderChart_spiderValuePointRadius:spiderValuePointRadius = array.getDimension(attr, DEFAULT_VALUE_POINT_RADIUS);break;case R.styleable.SpiderChart_spiderValueInnerPointColor:spiderValueInnerPointColor = array.getColor(attr,ContextCompat.getColor(getContext(), R.color.spider_ring_light));break;case R.styleable.SpiderChart_spiderValueInnerPointRadius:spiderValueInnerPointRadius = array.getDimension(attr,DEFAULT_VALUE_INNER_POINT_RADIUS);break;case R.styleable.SpiderChart_spiderValueLineColor:spiderValueLineColor = array.getColor(attr,ContextCompat.getColor(getContext(), R.color.spider_value_line));break;case R.styleable.SpiderChart_spiderValueLineWidth:spiderValueLineWidth = array.getDimension(attr, DEFAULT_VALUE_LINE_WIDTH);break;case R.styleable.SpiderChart_spiderValueRectColor:spiderValueRectColor = array.getColor(attr,ContextCompat.getColor(getContext(), R.color.spider_value_rect));break;default:break;}}array.recycle();}/** 初始化繪圖Paint */private void initPaint() {paintRing.setAntiAlias(true);paintRing.setStrokeWidth(spiderRingLineWidth);paintRing.setStyle(Paint.Style.FILL);paintRingLine.setAntiAlias(true);paintRingLine.setStrokeWidth(spiderRingLineWidth);paintRingLine.setStyle(Paint.Style.STROKE);paintRingLine.setColor(spiderRingLineColor);paintValuePoint.setAntiAlias(true);paintValuePoint.setColor(spiderValuePointColor);paintValuePoint.setStrokeWidth(spiderValuePointRadius);paintValuePoint.setStyle(Paint.Style.FILL);paintValueLine.setAntiAlias(true);paintValueLine.setColor(spiderValueLineColor);paintValueLine.setStrokeWidth(spiderValueLineWidth);paintValueLine.setStyle(Paint.Style.STROKE);paintValueRect.setAntiAlias(true);paintValueRect.setColor(spiderValueRectColor);paintValueRect.setStyle(Paint.Style.FILL);paintTitle.setAntiAlias(true);paintTitle.setTextAlign(Paint.Align.CENTER);paintTitle.setColor(spiderTitleColor);paintTitle.setStrokeWidth(1);paintTitle.setStyle(Paint.Style.FILL);paintTitle.setTextSize(spiderTitleSize);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {getBaseInfo(w, h);postInvalidate();super.onSizeChanged(w, h, oldw, oldh);}/** 獲取基本的數(shù)值信息 */private void getBaseInfo(int w, int h) {radius = Math.min(w, h) * 3 / 8;radiusSingle = radius / ringNum;centerX = w / 2;centerY = h / 2;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);drawBackground(canvas);drawBackgroundLine(canvas);drawTitle(canvas);drawValue(canvas);}/** draw background */private void drawBackground(Canvas canvas) {for (int n=0; n<DEFAULT_RING_NUM; n++) {float radiusRing = radius - (radiusSingle * n);Path pathBg = new Path();for (int i=0; i<DEFAULT_POINT_NUM; i++) {int x = getPoint(i, radiusRing).x;int y = getPoint(i, radiusRing).y;if(i == 0)pathBg.moveTo(x, y);elsepathBg.lineTo(x, y);}pathBg.close();if(n % 2 == 0)paintRing.setColor(spiderRingLightColor);elsepaintRing.setColor(spiderRingDarkColor);canvas.drawPath(pathBg, paintRing);}}/** draw Background line */private void drawBackgroundLine(Canvas canvas) {for (int n=0; n<DEFAULT_RING_NUM; n++) {float radiusRing = radius - (radiusSingle * n);Path pathRingLine = new Path();for (int i=0; i<DEFAULT_POINT_NUM; i++) {int x = getPoint(i, radiusRing).x;int y = getPoint(i, radiusRing).y;if(i == 0)pathRingLine.moveTo(x, y);elsepathRingLine.lineTo(x, y);}pathRingLine.close();canvas.drawPath(pathRingLine, paintRingLine);if(n == DEFAULT_POINT_NUM - 1) {for (int j=0; j<DEFAULT_POINT_NUM; j++) {int x = getPoint(j, radius).x;int y = getPoint(j, radius).y;pathRingLine.reset();pathRingLine.moveTo(centerX, centerY);pathRingLine.lineTo(x, y);canvas.drawPath(pathRingLine, paintRingLine);}}}}/** draw title */private void drawTitle(Canvas canvas) {float radiusTitle = radius + titleMargin;for (int i=0; i<DEFAULT_POINT_NUM; i++) {int x = getPoint(i, radiusTitle).x;int y = getPoint(i, radiusTitle).y;switch (i) {case 0:canvas.drawText(spiderTitleOne, x, y, paintTitle);break;case 1:x += spiderTitleSize * 2;canvas.drawText(spiderTitleTwo, x, y, paintTitle);break;case 2:y += spiderTitleSize;canvas.drawText(spiderTitleThree, x, y, paintTitle);break;case 3:y += spiderTitleSize;canvas.drawText(spiderTitleFour, x, y, paintTitle);break;case 4:x -= spiderTitleSize * 2;canvas.drawText(spiderTitleFive, x, y, paintTitle);break;}}}/** draw value rect */private void drawValue(Canvas canvas) {if(data == null)return;Path path = new Path();float[] fx = new float[5];float[] fy = new float[5];for (int i=0; i<DEFAULT_POINT_NUM; i++) {float percent = data[i] / maxValue;float x = getPoint(i, radius, percent).x;float y = getPoint(i, radius, percent).y;if(i ==0)path.moveTo(x, y);elsepath.lineTo(x, y);fx[i] = x;fy[i] = y;}path.close();canvas.drawPath(path, paintValueLine);canvas.drawPath(path, paintValueRect);for (int j=0; j<fx.length; j++) {paintValuePoint.setColor(spiderValuePointColor);canvas.drawCircle(fx[j], fy[j], spiderValuePointRadius, paintValuePoint);paintValuePoint.setColor(spiderValueInnerPointColor);canvas.drawCircle(fx[j], fy[j], spiderValueInnerPointRadius, paintValuePoint);}}/*** 獲取雷達(dá)圖上各個(gè)點(diǎn)的坐標(biāo)(包括維度標(biāo)題與圖標(biāo)的坐標(biāo))* 最頂部坐標(biāo)點(diǎn)position == 0, 順時(shí)針++* @param position 坐標(biāo)位置* @param radius 坐標(biāo)點(diǎn)所在圓的半徑* @return 坐標(biāo)*/private Point getPoint(int position, float radius) {return getPoint(position, radius, 1);}/*** 獲取雷達(dá)圖上各個(gè)點(diǎn)的坐標(biāo)(包括維度標(biāo)題與圖標(biāo)的坐標(biāo))* 最頂部坐標(biāo)點(diǎn)position == 0, 順時(shí)針++* @param position 坐標(biāo)位置* @param radius 坐標(biāo)點(diǎn)所在圓的半徑* @param percent 占總值的比例* @return 坐標(biāo)*/private Point getPoint(int position, float radius, float percent) {int x = 0;int y = 0;if (position == 0) {x = centerX;y = (int) (centerY - radius * percent);} else if (position == 1) {x = (int) (centerX + radius * Math.sin(radian) * percent);y = (int) (centerY - radius * Math.cos(radian) * percent);} else if (position == 2) {x = (int) (centerX + radius * Math.sin(radian / 2) * percent);y = (int) (centerY + radius * Math.cos(radian / 2) * percent);} else if (position == 3) {x = (int) (centerX - radius * Math.sin(radian / 2) * percent);y = (int) (centerY + radius * Math.cos(radian / 2) * percent);} else if (position == 4) {x = (int) (centerX - radius * Math.sin(radian) * percent);y = (int) (centerY - radius * Math.cos(radian) * percent);}return new Point(x, y);}/** 開(kāi)始動(dòng)畫(huà) */public void doAnimation(float[] insertData) {if(insertData == null || insertData.length != 5)return;ValueAnimator animator = ValueAnimator.ofObject(new DataEvaluator(), DEFAULT_DATA, insertData);animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {data = (float[]) animation.getAnimatedValue();invalidate();}});animator.setStartDelay(200);animator.setDuration(800);animator.setInterpolator(new LinearOutSlowInInterpolator());this.setAnimator(animator);animator.start();}/** Cancel Animator */public void cancelAnimator() {this.getAnimator().cancel();}/** 動(dòng)畫(huà)插值器 */private class DataEvaluator implements TypeEvaluator<float[]> {@Overridepublic float[] evaluate(float fraction, float[] startValue, float[] endValue) {float[] newData = new float[startValue.length];for (int i=0; i<startValue.length; i++) {newData[i] = startValue[i] + fraction * (endValue[i] - startValue[i]);}return newData;}} }總結(jié)
以上是生活随笔為你收集整理的蜘蛛图表SpiderChart的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 苹果更新“查找”APP,三星发布新款Sm
- 下一篇: java自定义异常并处理异常