<人物> 图>公司产品需要一个雷达图来展示各维度的比重,网上找了一波,学到不少,直接自己上手来撸一记
无图言虚空
简单分析一波,确定雷达图正几边形的——正五边形int数=5,分为几个层数4层int layerCount=4
@Override 保护空白> 私人int数=5;//几边形 私人int layerCount=4;//层数 私人浮动角;//每条边对应的圆心角 私人int centerX;//圆心x 私人int centerY;//圆心y 私人浮动半径;//半径 私人油漆polygonPaint;//边框油漆 私人油漆linePaint;//连线油漆 私人油漆txtPaint;//文字油漆 私人油漆circlePaint;//圆点漆 私人油漆regionColorPaint;//覆盖区域油漆 私人双[]9={0.91,0.35,0.12,0.8,0.5};//覆盖区域百分比 私人String[]标题={“队伍”、“斗地主”,“大吉大利,晚上吃鸡”,“炉石传说”、“跳一跳”},//文字
公共RadarView(上下文语境){ 这(上下文,null, 0); } 公共RadarView(上下文语境,@Nullable AttributeSet attrs) { 这(上下文、attrs 0); } 公共RadarView(上下文语境,@Nullable AttributeSet attrs, int defStyleAttr) { 超级(上下文、attrs defStyleAttr);//计算圆心角 角=(浮动)(数学。π* 2/数); polygonPaint=new油漆(); polygonPaint.setColor (ContextCompat。R.color.radarPolygonColor色鬼(上下文)); polygonPaint.setAntiAlias(真正的); polygonPaint.setStyle (Paint.Style.STROKE); polygonPaint.setStrokeWidth (4); linePaint=new油漆(); linePaint.setColor (ContextCompat。R.color.radarLineColor色鬼(上下文)); linePaint.setAntiAlias(真正的); linePaint.setStyle (Paint.Style.STROKE); linePaint.setStrokeWidth (2); txtPaint=new油漆(); txtPaint.setColor (ContextCompat。R.color.radarTxtColor色鬼(上下文)); txtPaint.setAntiAlias(真正的); txtPaint.setStyle (Paint.Style.STROKE); txtPaint.setTextSize (DensityUtil。dpToPx(上下文,12)); circlePaint=new油漆(); circlePaint.setColor (ContextCompat。R.color.radarCircleColor色鬼(上下文)); circlePaint.setAntiAlias(真正的); regionColorPaint=new油漆(); regionColorPaint.setColor (ContextCompat。R.color.radarRegionColor色鬼(上下文)); regionColorPaint.setStyle (Paint.Style.FILL); regionColorPaint.setAntiAlias(真正的); }
<强>确定中心点强>
需要正五边形得有一个圆,圆内接正五边形,在onSizeChanged方法里获取圆心,确定半径
@Override 保护空白> 私人空间drawPolygon(帆布画布){ 路径路径=new路径(); 浮动半径r=/layerCount; for (int i=1;我& lt;=layerCount;我+ +){ 浮动咕咕叫=r *我;//当前所在层的半径 for (int j=0;j & lt;计数;j + +) { 如果(j==0) {//每一层第一个点坐标 路径。函数(centerX centerY -咕咕叫); 其他}{//顺时针记录其余顶角的点坐标 浮动x=(浮动)(centerX +数学。罪(角* j) *咕咕叫); 浮动y=(浮动)(centerY——数学。因为(角* j) *咕咕叫); 路径。画线(x, y); } }//最外层的顶角外面的五个小圆点(图中红色部分) 如果(i==layerCount) { for (int j=0;j & lt;计数;j + +) { 浮动x=(浮动)(centerX +数学。罪(角* j) *(咕咕叫+ 12)); 浮动y=(浮动)(centerY——数学。因为(角* j) *(咕咕叫+ 12)); 画布。drawCircle (x, y, 4, circlePaint); } } path.close (); 画布。drawPath(路径,polygonPaint); } }
私人空白画直线(帆布画布){ 浮动半径r=/layerCount; for (int i=0;我& lt;计数;我+ +){//起始坐标从中心开始的话startx=centerX startY=浮动startX=(浮动)(centerX +数学。罪(角* i) * r); 浮动startY=(浮动)(centerY -数学。因为(角* i) * r);//末端坐标 浮动endX=(浮动)(centerX +数学。罪(角* i) *半径); 恩迪?(浮动)(centerY -数学。因为(我)角* *半径); 画布。画直线(startX startY endX,恩迪,linePaint); } }