FunnelView.java 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648
  1. package com.xzjmyk.pm.activity.view;
  2. import android.animation.ObjectAnimator;
  3. import android.animation.ValueAnimator;
  4. import android.content.Context;
  5. import android.graphics.Canvas;
  6. import android.graphics.Color;
  7. import android.graphics.Paint;
  8. import android.graphics.Path;
  9. import android.util.AttributeSet;
  10. import android.util.TypedValue;
  11. import android.view.View;
  12. import android.view.animation.AccelerateDecelerateInterpolator;
  13. import java.util.ArrayList;
  14. import java.util.List;
  15. /**
  16. * Created by zhengjiong on 16/1/20.
  17. */
  18. public class FunnelView extends View implements ValueAnimator.AnimatorUpdateListener {
  19. public static final float ANGLE_SCALE = 3.0f;
  20. private List<Integer> mMoneys = new ArrayList<>();
  21. private int maxMoney;
  22. private float phaseX = 1f;
  23. private int textAlpha = 255;
  24. private Paint mPaint1;
  25. private Paint mPaint2;
  26. private Paint mPaint3;
  27. private Paint mPaint4;
  28. private Paint mPaint5;
  29. private Paint mPaint6;
  30. private Paint mPaint7;
  31. private Paint mPaint8;
  32. private Paint mPaint9;
  33. private Paint mPaint10;
  34. private Paint mPaintLine;
  35. private Paint mPaintText;
  36. private Path mPath1;
  37. private Path mPath2;
  38. private Path mPath3;
  39. private Path mPath4;
  40. private Path mPath5;
  41. private Path mPath6;
  42. private Path mPath7;
  43. private Path mPath8;
  44. private Path mPath9;
  45. private Path mPath10;
  46. private float mTotalHeight = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 250, getResources().getDisplayMetrics());
  47. private float mPath1Height;
  48. private float mPath2Height;
  49. private float mPath3Height;
  50. private float mPath4Height;
  51. private float mPath5Height;
  52. private float mPath6Height;
  53. private float mPath7Height;
  54. private float mPath8Height;
  55. private float mPath9Height;
  56. private float mPath10Height;
  57. private float mPath1AngleWidth;
  58. private float mPath2AngleWidth;
  59. private float mPath3AngleWidth;
  60. private float mPath4AngleWidth;
  61. private float mPath5AngleWidth;
  62. private float mPath6AngleWidth;
  63. private float mPath7AngleWidth;
  64. private float mPath8AngleWidth;
  65. private float mPath9AngleWidth;
  66. private float mPath10AngleWidth;
  67. private float mPath3LineStartX;
  68. private float mPath3LineStartY;
  69. private float mPath4LineStartX;
  70. private float mPath4LineStartY;
  71. private float mPath5LineStartX;
  72. private float mPath5LineStartY;
  73. private float maxWidth = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 330, getResources().getDisplayMetrics());
  74. private float maxLineH = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 90, getResources().getDisplayMetrics());
  75. private float minLineH = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getResources().getDisplayMetrics());
  76. private float startOffsetX = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getResources().getDisplayMetrics());
  77. private float startOffsetY = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getResources().getDisplayMetrics());
  78. private float lineStartOffsetX = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics());
  79. private float textStartOffsetX = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 7, getResources().getDisplayMetrics());
  80. private float mLastX;
  81. private float mLastY;
  82. private float mLastWidth;
  83. public FunnelView(Context context) {
  84. this(context, null);
  85. }
  86. public FunnelView(Context context, AttributeSet attrs) {
  87. this(context, attrs, 0);
  88. }
  89. public FunnelView(Context context, AttributeSet attrs, int defStyleAttr) {
  90. super(context, attrs, defStyleAttr);
  91. init();
  92. }
  93. public void setData(List<Integer> moneys, int maxMoney) {
  94. this.mMoneys = moneys;
  95. this.maxMoney = maxMoney;
  96. calculate();
  97. //int averageHeight = (int) (mTotalHeight / 5);
  98. invalidate();
  99. }
  100. private void calculate() {
  101. for (int i = 0; i < mMoneys.size(); i++) {
  102. int money = mMoneys.get(i);
  103. float scale = (float) money / maxMoney;
  104. switch (i) {
  105. case 0:
  106. mPath1Height = mTotalHeight * scale * phaseX;
  107. if (mPath1Height < minLineH * phaseX) {
  108. mPath1Height = minLineH * phaseX;
  109. } else if (mPath1Height > maxLineH * phaseX) {
  110. mPath1Height = maxLineH * phaseX;
  111. }
  112. mPath1AngleWidth = mPath1Height / ANGLE_SCALE;
  113. //System.out.println("mPath1Height=" + mPath1Height + " ,phaseX=" + phaseX);
  114. break;
  115. case 1:
  116. mPath2Height = mTotalHeight * scale * phaseX;
  117. if (mPath2Height < minLineH * phaseX) {
  118. mPath2Height = minLineH * phaseX;
  119. } else if (mPath2Height > maxLineH * phaseX) {
  120. mPath2Height = maxLineH * phaseX;
  121. }
  122. mPath2AngleWidth = mPath2Height / ANGLE_SCALE;
  123. //System.out.println("mPath2Height=" + mPath2Height);
  124. break;
  125. case 2:
  126. mPath3Height = mTotalHeight * scale * phaseX;
  127. if (mPath3Height < minLineH * phaseX) {
  128. mPath3Height = minLineH * phaseX;
  129. } else if (mPath3Height > maxLineH * phaseX) {
  130. mPath3Height = maxLineH * phaseX;
  131. }
  132. mPath3AngleWidth = mPath3Height / ANGLE_SCALE;
  133. //System.out.println("mPath3Height=" + mPath3Height);
  134. break;
  135. case 3:
  136. mPath4Height = mTotalHeight * scale * phaseX;
  137. if (mPath4Height < minLineH * phaseX) {
  138. mPath4Height = minLineH * phaseX;
  139. } else if (mPath4Height > maxLineH * phaseX) {
  140. mPath4Height = maxLineH * phaseX;
  141. }
  142. mPath4AngleWidth = mPath4Height / ANGLE_SCALE;
  143. //System.out.println("mPath4Height=" + mPath4Height);
  144. break;
  145. case 4:
  146. mPath5Height = mTotalHeight * scale * phaseX;
  147. if (mPath5Height < minLineH * phaseX) {
  148. mPath5Height = minLineH * phaseX;
  149. } else if (mPath5Height > maxLineH * phaseX) {
  150. mPath5Height = maxLineH * phaseX;
  151. }
  152. mPath5AngleWidth = mPath5Height / ANGLE_SCALE;
  153. //System.out.println("mPath5Height=" + mPath5Height);
  154. break;
  155. case 5:
  156. mPath6Height = mTotalHeight * scale * phaseX;
  157. if (mPath6Height < minLineH * phaseX) {
  158. mPath6Height = minLineH * phaseX;
  159. } else if (mPath6Height > maxLineH * phaseX) {
  160. mPath6Height = maxLineH * phaseX;
  161. }
  162. mPath6AngleWidth = mPath6Height / ANGLE_SCALE;
  163. break;
  164. case 6:
  165. mPath7Height = mTotalHeight * scale * phaseX;
  166. if (mPath7Height < minLineH * phaseX) {
  167. mPath7Height = minLineH * phaseX;
  168. } else if (mPath7Height > maxLineH * phaseX) {
  169. mPath7Height = maxLineH * phaseX;
  170. }
  171. mPath7AngleWidth = mPath7Height / ANGLE_SCALE;
  172. break;
  173. case 7:
  174. mPath8Height = mTotalHeight * scale * phaseX;
  175. if (mPath8Height < minLineH * phaseX) {
  176. mPath8Height = minLineH * phaseX;
  177. } else if (mPath8Height > maxLineH * phaseX) {
  178. mPath8Height = maxLineH * phaseX;
  179. }
  180. mPath8AngleWidth = mPath8Height / ANGLE_SCALE;
  181. break;
  182. case 8:
  183. mPath9Height = mTotalHeight * scale * phaseX;
  184. if (mPath9Height < minLineH * phaseX) {
  185. mPath9Height = minLineH * phaseX;
  186. } else if (mPath9Height > maxLineH * phaseX) {
  187. mPath9Height = maxLineH * phaseX;
  188. }
  189. mPath9AngleWidth = mPath9Height / ANGLE_SCALE;
  190. break;
  191. case 9:
  192. mPath10Height = mTotalHeight * scale * phaseX;
  193. if (mPath10Height < minLineH * phaseX) {
  194. mPath10Height = minLineH * phaseX;
  195. } else if (mPath10Height > maxLineH * phaseX) {
  196. mPath10Height = maxLineH * phaseX;
  197. }
  198. mPath10AngleWidth = mPath10Height / ANGLE_SCALE;
  199. break;
  200. }
  201. }
  202. }
  203. private void init() {
  204. mPaint1 = new Paint();
  205. mPaint2 = new Paint();
  206. mPaint3 = new Paint();
  207. mPaint4 = new Paint();
  208. mPaint5 = new Paint();
  209. mPaint6 = new Paint();
  210. mPaint7 = new Paint();
  211. mPaint8 = new Paint();
  212. mPaint9 = new Paint();
  213. mPaint10 = new Paint();
  214. mPaintLine = new Paint();
  215. mPaintText = new Paint();
  216. // FF0000 00CCFF FFFF00 00FF00 FF00FF FF9900 993366 C0C0C0 FFCC99
  217. mPaint1.setColor(Color.parseColor("#FF0000"));
  218. mPaint1.setStyle(Paint.Style.FILL);
  219. mPaint1.setDither(true); //设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰
  220. mPaint1.setAntiAlias(true);
  221. mPaint2.setColor(Color.parseColor("#00CCFF"));
  222. mPaint2.setStyle(Paint.Style.FILL);
  223. mPaint2.setDither(true);
  224. mPaint2.setAntiAlias(true);
  225. mPaint3.setColor(Color.parseColor("#FFFF00"));
  226. mPaint3.setStyle(Paint.Style.FILL);
  227. mPaint3.setDither(true);
  228. mPaint3.setAntiAlias(true);
  229. mPaint4.setColor(Color.parseColor("#00FF00"));
  230. mPaint4.setStyle(Paint.Style.FILL);
  231. mPaint4.setDither(true);
  232. mPaint4.setAntiAlias(true);
  233. mPaint5.setColor(Color.parseColor("#FF00FF"));
  234. mPaint5.setStyle(Paint.Style.FILL);
  235. mPaint5.setDither(true);
  236. mPaint5.setAntiAlias(true);
  237. mPaint6.setColor(Color.parseColor("#FF9900"));
  238. mPaint6.setStyle(Paint.Style.FILL);
  239. mPaint6.setDither(true);
  240. mPaint6.setAntiAlias(true);
  241. mPaint7.setColor(Color.parseColor("#993366"));
  242. mPaint7.setStyle(Paint.Style.FILL);
  243. mPaint7.setDither(true);
  244. mPaint7.setAntiAlias(true);
  245. mPaint8.setColor(Color.parseColor("#C0C0C0"));
  246. mPaint8.setStyle(Paint.Style.FILL);
  247. mPaint8.setDither(true);
  248. mPaint8.setAntiAlias(true);
  249. mPaint9.setColor(Color.parseColor("#FFCC99"));
  250. mPaint9.setStyle(Paint.Style.FILL);
  251. mPaint9.setDither(true);
  252. mPaint9.setAntiAlias(true);
  253. mPaint10.setColor(Color.parseColor("#FFCC99"));
  254. mPaint10.setStyle(Paint.Style.FILL);
  255. mPaint10.setDither(true);
  256. mPaint10.setAntiAlias(true);
  257. mPaintLine.setColor(Color.parseColor("#A8ADB2"));
  258. // mPaintLine.setColor(Color.parseColor("#A8ADB2"));
  259. mPaintLine.setStyle(Paint.Style.FILL);
  260. mPaintLine.setStrokeWidth(2);
  261. mPaintText.setColor(Color.parseColor("#A8ADB2"));
  262. mPaintText.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 14, getResources().getDisplayMetrics()));
  263. mPaintText.setAntiAlias(true);
  264. mPaintText.setTextAlign(Paint.Align.LEFT);
  265. }
  266. private void draw1(Canvas canvas) {
  267. mLastX = startOffsetX;
  268. mLastY = startOffsetY;
  269. mLastWidth = maxWidth - startOffsetX;
  270. mPath1 = new Path();
  271. mPath1.moveTo(mLastX, startOffsetY);
  272. mPath1.lineTo(mLastX + mLastWidth, startOffsetY);
  273. mPath1.lineTo(mLastX + mLastWidth - mPath1AngleWidth, mLastY + mPath1Height);
  274. mPath1.lineTo(mLastX + mPath1AngleWidth, mLastY + mPath1Height);
  275. mPath1.close();
  276. canvas.drawPath(mPath1, mPaint1);
  277. mLastWidth = mLastWidth - 2 * mPath1AngleWidth;
  278. mLastX = mLastX + mPath1AngleWidth;
  279. mLastY = mLastY + mPath1Height;
  280. }
  281. private void draw2(Canvas canvas) {
  282. mPath2 = new Path();
  283. mPath2.moveTo(mLastX, mLastY);
  284. mPath2.lineTo(mLastX + mLastWidth, mLastY);
  285. mPath2.lineTo(mLastX + mLastWidth - mPath2AngleWidth, mLastY + mPath2Height);
  286. mPath2.lineTo(mLastX + mPath2AngleWidth, mLastY + mPath2Height);
  287. mPath2.close();
  288. canvas.drawPath(mPath2, mPaint2);
  289. mLastWidth = mLastWidth - mPath2AngleWidth - mPath2AngleWidth;
  290. mLastX = mLastX + mPath2AngleWidth;
  291. mLastY = mLastY + mPath2Height;
  292. }
  293. private void draw3(Canvas canvas) {
  294. mPath3 = new Path();
  295. mPath3.moveTo(mLastX, mLastY);
  296. mPath3.lineTo(mLastX + mLastWidth, mLastY);
  297. mPath3.lineTo(mLastX + mLastWidth - mPath3AngleWidth, mLastY + mPath3Height);
  298. mPath3.lineTo(mLastX + mPath3AngleWidth, mLastY + mPath3Height);
  299. mPath3.close();
  300. canvas.drawPath(mPath3, mPaint3);
  301. mLastWidth = mLastWidth - mPath3AngleWidth - mPath3AngleWidth;
  302. mLastX = mLastX + mPath3AngleWidth;
  303. mLastY = mLastY + mPath3Height;
  304. mPath3LineStartX = mLastX + mLastWidth + mPath3AngleWidth / 2;
  305. mPath3LineStartY = mLastY - mPath3Height / 2;
  306. }
  307. private void draw4(Canvas canvas) {
  308. mPath4 = new Path();
  309. mPath4.moveTo(mLastX, mLastY);
  310. mPath4.lineTo(mLastX + mLastWidth, mLastY);
  311. mPath4.lineTo(mLastX + mLastWidth - mPath4AngleWidth, mLastY + mPath4Height);
  312. mPath4.lineTo(mLastX + mPath4AngleWidth, mLastY + mPath4Height);
  313. mPath4.close();
  314. canvas.drawPath(mPath4, mPaint4);
  315. mLastWidth = mLastWidth - 2 * mPath4AngleWidth;//最新长度
  316. mLastX = mLastX + mPath4AngleWidth;//第四个点的x坐标
  317. mLastY = mLastY + mPath4Height;//第四个点的y坐标
  318. mPath4LineStartX = mLastX + mLastWidth + mPath4AngleWidth / 2;
  319. mPath4LineStartY = mLastY - mPath4Height / 2;
  320. }
  321. private void draw5(Canvas canvas) {
  322. mPath5 = new Path();
  323. mPath5.moveTo(mLastX, mLastY);
  324. mPath5.lineTo(mLastX + mLastWidth, mLastY);
  325. mPath5.lineTo(mLastX + mLastWidth - mPath5AngleWidth, mLastY + mPath5Height);
  326. mPath5.lineTo(mLastX + mPath5AngleWidth, mLastY + mPath5Height);
  327. mPath5.close();
  328. canvas.drawPath(mPath5, mPaint5);
  329. //mLastWidth = maxWidth - startOffsetX;
  330. //mLastX = mLastX;
  331. // mLastY = mLastY + mPath5Height;
  332. // mPath5LineStartX = mLastX + mLastWidth;
  333. // mPath5LineStartY = mLastY - mPath5Height / 2;
  334. mLastWidth = mLastWidth - 2 * mPath5AngleWidth;//最新长度
  335. mLastX = mLastX + mPath5AngleWidth;//第四个点的x坐标
  336. mLastY = mLastY + mPath5Height;//第四个点的y坐标
  337. }
  338. private void draw6(Canvas canvas) {
  339. mPath6 = new Path();
  340. mPath6.moveTo(mLastX, mLastY);
  341. mPath6.lineTo(mLastX + mLastWidth, mLastY);
  342. mPath6.lineTo(mLastX + mLastWidth - mPath6AngleWidth, mLastY + mPath6Height);
  343. mPath6.lineTo(mLastX + mPath6AngleWidth, mLastY + mPath6Height);
  344. mPath6.close();
  345. canvas.drawPath(mPath6, mPaint6);
  346. mLastWidth = mLastWidth - 2 * mPath6AngleWidth;//最新长度
  347. mLastX = mLastX + mPath6AngleWidth;//第四个点的x坐标
  348. mLastY = mLastY + mPath6Height;//第四个点的y坐标
  349. }
  350. private void draw7(Canvas canvas) {
  351. mPath7 = new Path();
  352. mPath7.moveTo(mLastX, mLastY);
  353. mPath7.lineTo(mLastX + mLastWidth, mLastY);
  354. mPath7.lineTo(mLastX + mLastWidth - mPath7AngleWidth, mLastY + mPath7Height);
  355. mPath7.lineTo(mLastX + mPath7AngleWidth, mLastY + mPath7Height);
  356. mPath7.close();
  357. canvas.drawPath(mPath7, mPaint7);
  358. mLastWidth = mLastWidth - 2 * mPath7AngleWidth;//最新长度
  359. mLastX = mLastX + mPath7AngleWidth;//第四个点的x坐标
  360. mLastY = mLastY + mPath7Height;//第四个点的y坐标
  361. }
  362. private void draw8(Canvas canvas) {
  363. mPath8 = new Path();
  364. mPath8.moveTo(mLastX, mLastY);
  365. mPath8.lineTo(mLastX + mLastWidth, mLastY);
  366. mPath8.lineTo(mLastX + mLastWidth - mPath8AngleWidth, mLastY + mPath8Height);
  367. mPath8.lineTo(mLastX + mPath8AngleWidth, mLastY + mPath8Height);
  368. mPath8.close();
  369. canvas.drawPath(mPath8, mPaint8);
  370. mLastWidth = mLastWidth - 2 * mPath8AngleWidth;//最新长度
  371. mLastX = mLastX + mPath8AngleWidth;//第四个点的x坐标
  372. mLastY = mLastY + mPath8Height;//第四个点的y坐标
  373. }
  374. private void draw9(Canvas canvas) {
  375. mPath9 = new Path();
  376. mPath9.moveTo(mLastX, mLastY);
  377. mPath9.lineTo(mLastX + mLastWidth, mLastY);
  378. mPath9.lineTo(mLastX + mLastWidth - mPath9AngleWidth, mLastY + mPath9Height);
  379. mPath9.lineTo(mLastX + mPath9AngleWidth, mLastY + mPath9Height);
  380. mPath9.close();
  381. canvas.drawPath(mPath9, mPaint9);
  382. mLastWidth = mLastWidth - 2 * mPath9AngleWidth;//最新长度
  383. mLastX = mLastX + mPath9AngleWidth;//第四个点的x坐标
  384. mLastY = mLastY + mPath9Height;//第四个点的y坐标
  385. }
  386. private void draw10(Canvas canvas) {
  387. mPath10 = new Path();
  388. mPath10.moveTo(mLastX, mLastY);
  389. mPath10.lineTo(mLastX + mLastWidth, mLastY);
  390. mPath10.lineTo(mLastX + mLastWidth - mPath10AngleWidth, mLastY + mPath10Height);
  391. mPath10.lineTo(mLastX + mPath10AngleWidth, mLastY + mPath10Height);
  392. mPath10.close();
  393. canvas.drawPath(mPath10, mPaint10);
  394. mLastWidth = mLastWidth - 2 * mPath10AngleWidth;//最新长度
  395. mLastX = mLastX + mPath10AngleWidth;//第四个点的x坐标
  396. mLastY = mLastY + mPath10Height;//第四个点的y坐标
  397. }
  398. @Override
  399. protected void onDraw(Canvas canvas) {
  400. super.onDraw(canvas);
  401. draw1(canvas);
  402. // drawText1(canvas);
  403. draw2(canvas);
  404. // drawText2(canvas);
  405. draw3(canvas);
  406. // drawLine3(canvas);
  407. // drawText3(canvas);
  408. draw4(canvas);
  409. // drawLine4(canvas);
  410. // drawText4(canvas);
  411. draw5(canvas);
  412. // drawLine5(canvas);
  413. // drawText5(canvas);
  414. draw6(canvas);
  415. draw7(canvas);
  416. draw8(canvas);
  417. draw9(canvas);
  418. // draw10(canvas);
  419. }
  420. public void animateY() {
  421. ObjectAnimator xAnimator = ObjectAnimator.ofFloat(this, "phaseX", 0, 1);
  422. xAnimator.setDuration(2000);
  423. xAnimator.addUpdateListener(this);
  424. xAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
  425. xAnimator.start();
  426. ObjectAnimator alphaAnimator = ObjectAnimator.ofInt(this, "textAlpha", 0, 255);
  427. alphaAnimator.setDuration(2000);
  428. //alphaAnimator.addUpdateListener(this);
  429. alphaAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
  430. alphaAnimator.start();
  431. }
  432. @Override
  433. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  434. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  435. /*int specMode = MeasureSpec.getMode(heightMeasureSpec);
  436. int specSize = MeasureSpec.getSize(heightMeasureSpec);
  437. int height = 0;
  438. if (specMode == MeasureSpec.EXACTLY) {
  439. height = specSize;
  440. } else {
  441. height = (int) mLastY;
  442. }
  443. System.out.println("onMeasure mLastY=" + mLastY);
  444. setMeasuredDimension(MeasureSpec.getMode(widthMeasureSpec), height);*/
  445. }
  446. public float getPhaseX() {
  447. return phaseX;
  448. }
  449. public void setPhaseX(float phaseX) {
  450. this.phaseX = phaseX;
  451. }
  452. public int getTextAlpha() {
  453. return textAlpha;
  454. }
  455. public void setTextAlpha(int textAlpha) {
  456. this.textAlpha = textAlpha;
  457. }
  458. @Override
  459. public void onAnimationUpdate(ValueAnimator animation) {
  460. calculate();
  461. postInvalidate();
  462. }
  463. private void drawText1(Canvas canvas) {
  464. Paint.FontMetrics fontMetrics = mPaintText.getFontMetrics();
  465. float fontTotalHeight = fontMetrics.bottom - fontMetrics.top;
  466. float offY = fontTotalHeight / 2 - fontMetrics.bottom;
  467. //System.out.println("offY=" +offY);
  468. //float newY = baseY + offY;
  469. mPaintText.setAlpha(textAlpha);
  470. canvas.drawText("初期沟通(10%)", maxWidth + textStartOffsetX, mLastY - mPath1Height / 2 + offY, mPaintText);
  471. }
  472. private void drawText2(Canvas canvas) {
  473. Paint.FontMetrics fontMetrics = mPaintText.getFontMetrics();
  474. float fontTotalHeight = fontMetrics.bottom - fontMetrics.top;
  475. float offY = fontTotalHeight / 2 - fontMetrics.bottom;
  476. //float newY = baseY + offY;
  477. canvas.drawText("立项跟踪(10%)", maxWidth + textStartOffsetX, mLastY - mPath2Height / 2 + offY, mPaintText);
  478. }
  479. private void drawLine3(Canvas canvas) {
  480. canvas.drawLine(mPath3LineStartX + lineStartOffsetX, mPath3LineStartY, maxWidth, mPath3LineStartY, mPaintLine);
  481. }
  482. private void drawText3(Canvas canvas) {
  483. Paint.FontMetrics fontMetrics = mPaintText.getFontMetrics();
  484. float fontTotalHeight = fontMetrics.bottom - fontMetrics.top;
  485. float offY = fontTotalHeight / 2 - fontMetrics.bottom;
  486. //float newY = baseY + offY;
  487. canvas.drawText("呈报方案(10%)", maxWidth + textStartOffsetX, mLastY - mPath3Height / 2 + offY, mPaintText);
  488. }
  489. private void drawLine4(Canvas canvas) {
  490. canvas.drawLine(mPath4LineStartX + lineStartOffsetX, mPath4LineStartY, maxWidth, mPath4LineStartY, mPaintLine);
  491. }
  492. private void drawText4(Canvas canvas) {
  493. Paint.FontMetrics fontMetrics = mPaintText.getFontMetrics();
  494. float fontTotalHeight = fontMetrics.bottom - fontMetrics.top;
  495. float offY = fontTotalHeight / 2 - fontMetrics.bottom;
  496. //float newY = baseY + offY;
  497. canvas.drawText("商务谈判(10%)", maxWidth + textStartOffsetX, mLastY - mPath4Height / 2 + offY, mPaintText);
  498. }
  499. private void drawLine5(Canvas canvas) {
  500. canvas.drawLine(mPath5LineStartX + lineStartOffsetX, mPath5LineStartY, maxWidth, mPath5LineStartY, mPaintLine);
  501. }
  502. private void drawText5(Canvas canvas) {
  503. Paint.FontMetrics fontMetrics = mPaintText.getFontMetrics();
  504. float fontTotalHeight = fontMetrics.bottom - fontMetrics.top;
  505. float offY = fontTotalHeight / 2 - fontMetrics.bottom;
  506. //float newY = baseY + offY;
  507. canvas.drawText("赢单(10%)", maxWidth + textStartOffsetX, mLastY - mPath5Height / 2 + offY, mPaintText);
  508. }
  509. }