体系课-数据可视化入门到精通-打造前端差异化竞争力

download:体系课-数据可视化入门到精通-打造前端差异化竞争力

首门微体系课,不谦虚的讲,全网打着灯笼也找不到这么精炼、系统、实用的数据可视化课程,通过学习课程,不管是数据报表、数据大屏、移动报表需求,你都将游刃有余,掌握课程所授,你基本可以应对企业90%以上的数据可视化开发需求,升职加薪几乎是一定的!
适合人群
想系统学习数据可视化的前端工程师
技术储备要求
掌握HTML、Javascript(ES6)
有Vue.js 、Node.js基础
在activity中使用,下面是范例代码, 至于怎么正确放置代码,相信做过android的朋友都很熟悉了。

       FinanceScoreDialView fcdView =new  FinanceScoreDialView(context);
       addview(fcdView);

        fcdView.setValues(new double[]{80.5, 10});
        fcdView.setScoreTitleString("第三季度");
        fcdView.setRankingTitleString("行业排名");
        fcdView.setScoreTitleColor(0xff666666);
        fcdView.setScoreColor(0xffc1611e);
        fcdView.setRankingTitleColor(0xff666666);
        fcdView.setRankingColor(Color.WHITE);

        fcdView.setInnerScoreRingColor(0xffc1ddf9);
        fcdView.setOuterScoreRingColor(0xff328deb);
        fcdView.setOuterScoreSelRingColor(0xffc1611e);
        fcdView.setScoreAxisLineColor(0xff00ff00);
        fcdView.setScoreAxisLables(5);

        fcdView.postInvalidate();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.view.View;

import java.text.NumberFormat;

class FinanceScoreDialView extends View{

private double score;   //

private int ranking;

private String mScoreTitleStr;     //表盘标题
private String mRankingTitleStr;   
private int mScoreAxisLineColor;   //表盘刻度文字

public void setScoreTitleColor(int mScoreTitleColor) {
    this.mScoreTitleColor = mScoreTitleColor;
}

public void setScoreColor(int mScoreColor) {
    this.mScoreColor = mScoreColor;
}

public void setRankingTitleColor(int mRankingTitleColor) {
    this.mRankingTitleColor = mRankingTitleColor;
}

public void setRankingColor(int mRankingColor) {
    this.mRankingColor = mRankingColor;
}

private int mScoreTitleColor;  //表盘标题文字颜色
private int mScoreColor;      
private int mRankingTitleColor;
private int mRankingColor;

public void setInnerScoreRingColor(int mInnerScoreRingColor) {
    this.mInnerScoreRingColor = mInnerScoreRingColor;
}

public void setOuterScoreRingColor(int mOuterScoreRingColor) {
    this.mOuterScoreRingColor = mOuterScoreRingColor;
}

public void setOuterScoreSelRingColor(int mOuterScoreSelRingColor) {
    this.mOuterScoreSelRingColor = mOuterScoreSelRingColor;
}

public void setScoreAxisLineColor(int axisLineColor){
    this.mScoreAxisLineColor = axisLineColor;
}

private int mInnerScoreRingColor;
private int mOuterScoreRingColor;
private int mOuterScoreSelRingColor;

private float totalScore = 100;

private float stepDegree = -1;

public void setScoreAxisLables(int scoreAxisLables) {
    this.scoreAxisLables = scoreAxisLables;

    axisLabelStrs = new String[scoreAxisLables];

    float step = totalScore / (scoreAxisLables-1);

    for (int i =0; i< scoreAxisLables; i++){
        axisLabelStrs[i] = String.valueOf(nFormat2.format(step *i));
    }

    float sweepAngle = 180+Math.abs(2*offset_degree);

    stepDegree = sweepAngle/(scoreAxisLables-1);

}

private int scoreAxisLables;
private String[] axisLabelStrs;

private float axisLineWidth = Tool.dpToPx(0.5f);

private float axisLableTextSize = Tool.dpToPx(12);

private Paint axisLablePaint = new Paint();

private float leftmargin = Tool.dpToPx(5);

private float v_margin = Tool.dpToPx(15);

private float h_space  = Tool.dpToPx(15);

private float ring_space = Tool.dpToPx(5);

private float outter_ringWidth = Tool.dpToPx(1);

private float inner_ringWidth = Tool.dpToPx(5);

private Paint rankingTextPaint = new Paint();
private Paint scoreTextPaint = new Paint();

private Paint scoreRingPaint = new Paint();

private float scoreTitleTextSize = Tool.dpToPx(14);
private float rankingTitleTextSize = Tool.dpToPx(14);
private float scoreTextSize  = Tool.dpToPx(40);
private float rankingTextSize  = Tool.dpToPx(30);

private static final float offset_degree = -10;  //负代表往下偏移10度

private float maxOutterScoreDiameter = -1;

private float maxOutterScoreRadius = -1;

private float innerScoreDiameter = -1;

private RectF ring_rectf = new RectF();

private static NumberFormat nFormat = NumberFormat.getNumberInstance();
private static NumberFormat nFormat2 = NumberFormat.getNumberInstance();

static{
    nFormat.setMaximumFractionDigits(2);
    nFormat.setMinimumFractionDigits(2);

    nFormat2.setMaximumFractionDigits(0);
}

public FinanceScoreDialView(Context context) {
    super(context);
    init();
}

private void init(){
    rankingTextPaint.setAntiAlias(true);
    scoreTextPaint.setAntiAlias(true);
    scoreRingPaint.setAntiAlias(true);
}

public void setValues(double[] values){
    if(null != values){
        if(values.length >0){
            score = values[0];
        }

        if(values.length >1 ){
            ranking = (int)values[1];
        }
    }
}

public void setScoreTitleString(String str){
    this.mScoreTitleStr = str;

}

public void setRankingTitleString(String str){
    this.mRankingTitleStr = str;
}

public  void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
    int specWidth = MeasureSpec.getSize(widthMeasureSpec);
    int measuredWidth = specWidth;

    int measuredHeight = 0;

    scoreTextPaint.setTextSize(scoreTitleTextSize);
    float scoretitle_h  = getFontHeight(scoreTextPaint);
    float scoretitle_w = scoreTextPaint.measureText(mScoreTitleStr);

    scoreTextPaint.setTextSize(scoreTextSize);
    float score_h  = getFontHeight(scoreTextPaint);
    float score_w = scoreTextPaint.measureText(nFormat.format(score));

    float totalh_score = scoretitle_h + Tool.dpToPx(5) + score_h;
    float totalw_score = Math.max(scoretitle_w,score_w) + 2*Tool.dpToPx(20);

    float score_diameter = Math.max(totalw_score, totalh_score);

    float max_outter_score_diameter = score_diameter + 2* (inner_ringWidth + ring_space + outter_ringWidth);

    maxOutterScoreDiameter = max_outter_score_diameter;

    innerScoreDiameter = max_outter_score_diameter - 2*(outter_ringWidth + ring_space);

    float max_outter_score_radius = max_outter_score_diameter/2;
    maxOutterScoreRadius = max_outter_score_radius;
    measuredHeight += max_outter_score_radius;

    double rAngle = Math.toRadians(90 - (-180 + offset_degree));

    measuredHeight += Math.abs(max_outter_score_radius*Math.cos(rAngle));
    measuredHeight += 2*v_margin;

    setMeasuredDimension(measuredWidth, measuredHeight);

}

public void onDraw(Canvas canvas){

    int startX = getScrollX();
    int startY = getScrollY();

    rankingTextPaint.setTextSize(rankingTitleTextSize);
    rankingTextPaint.setColor(mRankingTitleColor);

    float rankingTitleBaseline = startY + v_margin + getFontTopYToBaseline(rankingTextPaint);
    canvas.drawText(mRankingTitleStr, startX + leftmargin, rankingTitleBaseline, rankingTextPaint);

    float rankingTitle_w = rankingTextPaint.measureText(mRankingTitleStr);

    //圆心纵横坐标
    float centerX  = startX + leftmargin + h_space + rankingTitle_w + maxOutterScoreDiameter/2;
    float centerY =startY + v_margin + maxOutterScoreDiameter/2;

    float max_outter_ring_startX = centerX - maxOutterScoreDiameter/2 + outter_ringWidth/2;
    float max_outter_ring_startY = v_margin + outter_ringWidth/2;
    float max_outter_ring_endX = max_outter_ring_startX + maxOutterScoreDiameter - outter_ringWidth;
    float max_outter_ring_endY = max_outter_ring_startY + maxOutterScoreDiameter - outter_ringWidth;

    ring_rectf.set(max_outter_ring_startX, max_outter_ring_startY, max_outter_ring_endX, max_outter_ring_endY);

    scoreRingPaint.setStyle(Paint.Style.STROKE);
    scoreRingPaint.setStrokeWidth(outter_ringWidth);

    scoreRingPaint.setColor(mOuterScoreRingColor);

    float startAngle = -180 + offset_degree;
    float sweepAngle = 180+Math.abs(2*offset_degree);

    float sweepAngle1 = (float)(sweepAngle * score/ totalScore);

    if(sweepAngle1 > sweepAngle || (sweepAngle-sweepAngle1<1)){
        sweepAngle1 = sweepAngle;
    }

    canvas.drawArc(ring_rectf,startAngle,sweepAngle,false,scoreRingPaint );    //画外环

    scoreRingPaint.setColor(mOuterScoreSelRingColor);
    canvas.drawArc(ring_rectf,startAngle,sweepAngle1,false,scoreRingPaint );

    float inner_ring_startX = centerX - innerScoreDiameter/2 + inner_ringWidth/2;
    float inner_ring_startY = centerY - innerScoreDiameter/2 + inner_ringWidth/2;
    float inner_ring_endX = inner_ring_startX + innerScoreDiameter - inner_ringWidth;
    float inner_ring_endY = inner_ring_startY + innerScoreDiameter - inner_ringWidth;

    ring_rectf.set(inner_ring_startX, inner_ring_startY, inner_ring_endX, inner_ring_endY);

    scoreRingPaint.setStrokeWidth(inner_ringWidth);
    scoreRingPaint.setColor(mInnerScoreRingColor);
    canvas.drawArc(ring_rectf, startAngle, sweepAngle, false, scoreRingPaint);

    for (int i =0; i<scoreAxisLables; i++){
        float degree = -1;

        degree =  -180 + offset_degree + stepDegree * i;

        double radian = Math.toRadians(90-degree);

        float shortRadius = innerScoreDiameter/2 - inner_ringWidth;
        float longRadius = innerScoreDiameter/2;

        double sinValue = Math.sin(radian);
                double cosValue = Math.cos(radian);

        float x1 =  (float) (centerX +shortRadius * sinValue);
        float y1 = (float)(centerY +shortRadius * cosValue);
        float x2 = (float)(centerX +  longRadius * sinValue);
        float y2 = (float)(centerY + longRadius * cosValue);

        scoreRingPaint.setStyle(Paint.Style.STROKE);
        scoreRingPaint.setStrokeWidth(axisLineWidth);
        scoreRingPaint.setColor(mScoreAxisLineColor);

        canvas.drawLine(x1, y1, x2, y2, scoreRingPaint);

        axisLablePaint.setTextSize(axisLableTextSize);
        axisLablePaint.setTextAlign(Paint.Align.CENTER);
        axisLablePaint.setColor(mInnerScoreRingColor);

        float axisLable_fonth = getFontHeight(axisLablePaint);
        float labelRadius =innerScoreDiameter/2 - inner_ringWidth - axisLable_fonth/2 + 3;

        float x3 =  (float) (centerX + labelRadius * sinValue);
                float y3  =(float) (centerY + labelRadius * cosValue);

        canvas.save();

        canvas.rotate(90+ degree,x3,y3);    //绘制倾斜文字

        canvas.drawText(axisLabelStrs[i],x3,y3 + getFontCenterYToBaseLine(axisLablePaint),axisLablePaint);

        canvas.restore();

    }

    scoreTextPaint.setTextAlign(Paint.Align.CENTER);
    scoreTextPaint.setTextSize(scoreTextSize);
    scoreTextPaint.setColor(mScoreColor);

    double rAngle = Math.toRadians(90 - (-180 + offset_degree));    //弧度

    float offset_y = (float)(maxOutterScoreRadius*Math.cos(rAngle));

    float scoreBaselineY = centerY + offset_y;
    float tempH = getFontTopYToBaseline(scoreTextPaint);

    canvas.drawText(nFormat.format(score), centerX, scoreBaselineY, scoreTextPaint);

    scoreTextPaint.setTextSize(scoreTitleTextSize);
    scoreTextPaint.setColor(mScoreTitleColor);

    float scoreTitleBaselineY = scoreBaselineY - tempH - Tool.dpToPx(2);

    canvas.drawText(mScoreTitleStr, centerX, scoreTitleBaselineY, scoreTextPaint);

}

public static float getFontHeight(Paint textPaint){

    Paint.FontMetrics fm = textPaint.getFontMetrics();

    return (float)Math.ceil(fm.descent - fm.ascent) + 3;
}

public static float getFontTopYToBaseline(Paint textPaint){
    Paint.FontMetrics fm = textPaint.getFontMetrics();

    return (float)Math.ceil(-fm.ascent) + 3;
}

public static float getFontBottomYToBaseline(Paint textPaint){
    Paint.FontMetrics fm = textPaint.getFontMetrics();

    return (float)Math.ceil(fm.descent) + 3;
}

public static float getFontCenterYToBaseLine(Paint textPaint){
    Paint.FontMetrics fm = textPaint.getFontMetrics();

    float fonth = getFontHeight(textPaint);

    return (float)Math.abs(Math.ceil(fonth/2- fm.descent));
}
上一篇:国内Top团队大牛带你玩转Android性能分析与优化


下一篇:阿里P7架构师解析Java内部类