Android PathMeasure自定义View带动画的提交按钮

代码 代码 1202 人阅读 | 0 人回复

<
  操纵PathMeasure去完成自界说的动绘
源码地点

https://github.com/SHPDZY/AndroidUiDemo
结果展现

214336c0yx1ugfqxyu7gzg.gif

代码完成

次要利用PathMeasure画造View动绘的施行途径,胜利/失利的动绘利用贝塞我完成。
设置view途径

  1. //边框途径
  2. val path = Path()
  3. path.moveTo(lineStartX, lineTopY)
  4. path.lineTo(lineStopX, lineTopY)
  5. arcRectF.left = mW - mH + padding
  6. arcRectF.top = padding
  7. arcRectF.right = mW - padding
  8. arcRectF.bottom = mH - padding
  9. path.arcTo(arcRectF, arcRtStartAng, arcSweepAng)
  10. pathMeasureStrokeTop = PathMeasure(path, false)
  11. pathMeasureStrokeLen = pathMeasureStrokeTop.length
  12. path.reset()
  13. path.moveTo(lineStopX, lineBtmY)
  14. path.lineTo(lineStartX, lineBtmY)
  15. arcRectF.left = padding
  16. arcRectF.top = padding
  17. arcRectF.right = mH + padding
  18. arcRectF.bottom = mH - padding
  19. path.arcTo(arcRectF, arcLtStartAng, arcSweepAng)
  20. pathMeasureStrokeBtm = PathMeasure(path, false)
  21. //对钩的途径
  22. path.reset()
  23. path.moveTo(tickLtStartX, tickLtStartY)
  24. path.quadTo(tickLtControlX, tickLtControlY, tickLtEndX, tickLtEndY)
  25. path.quadTo(tickCenX, tickCenY, tickCenEndX, tickCenEndY)
  26. path.quadTo(tickRtControlX, tickRtControlY, tickRtEdX, tickRtEdY)
  27. mPathMeasureTick = PathMeasure(path, false)
  28. pathMeasureTickLen = mPathMeasureTick.length
  29. // X的途径
  30. path.reset()
  31. path.moveTo(xLfStartX, xLfStartY)
  32. path.lineTo(xLfEdX, xLfEdY)
  33. pathMeasureXL = PathMeasure(path, false)
  34. pathMeasureXLen = pathMeasureXL.length
  35. path.reset()
  36. path.moveTo(xRfStartX, xRfStartY)
  37. path.lineTo(xRfEdX, xRfEdY)
  38. pathMeasureXR = PathMeasure(path, false)
复造代码
按照途径战动绘施行进度画造

  1. /**
  2. * 画造边框
  3. */
  4. private fun drawStroke(canvas: Canvas) {
  5.     getStrokePaint()
  6.     pathMeasurePath.reset()
  7.     pathMeasureStrokeLenRatio = pathMeasureStrokeLen * strokeRatio
  8.     if (strokeMode == MODE_STROKE_AROUND) {
  9.         pathMeasureStrokeLenRatio *= 2f
  10.     }
  11.     pathMeasureStrokeTop.getSegment(pathMeasureStrokeLenRatio, pathMeasureStrokeLen, pathMeasurePath, true)
  12.     canvas.drawPath(pathMeasurePath, paint)
  13.     if (strokeMode == MODE_STROKE_AROUND) {
  14.         pathMeasureStrokeLenRatio = pathMeasureStrokeLen * max((strokeRatio - 0.5f), 0f) * 2f
  15.     }
  16.     pathMeasurePath.reset()
  17.     pathMeasureStrokeBtm.getSegment(pathMeasureStrokeLenRatio, pathMeasureStrokeLen, pathMeasurePath, true)
  18.     canvas.drawPath(pathMeasurePath, paint)
  19. }
  20. /**
  21. * 画造胜利或失利的图案
  22. */
  23. private fun drawComplete(canvas: Canvas) {
  24.     getTickAndXPaint()
  25.     pathMeasurePath.reset()
  26.     if (isSuccess) {
  27.         mPathMeasureTick.getSegment(0f, pathMeasureTickLen * tickAndXRatio, pathMeasurePath, true)
  28.         canvas.drawPath(pathMeasurePath, paint)
  29.         return
  30.     }
  31.     pathMeasureXLenRatio = pathMeasureXLen * tickAndXRatio
  32.     pathMeasureXL.getSegment(0f, pathMeasureXLenRatio, pathMeasurePath, true)
  33.     canvas.drawPath(pathMeasurePath, paint)
  34.     pathMeasurePath.reset()
  35.     pathMeasureXLenRatio = pathMeasureXLen * max(tickAndXRatio - 0.5f, 0f) * 2f
  36.     pathMeasureXR.getSegment(0f, pathMeasureXLenRatio, pathMeasurePath, true)
  37.     canvas.drawPath(pathMeasurePath, paint)
  38. }
  39. /**
  40. * 画造布景
  41. */
  42. private fun drawBackground(canvas: Canvas) {
  43.     getBacPaint()
  44.     if (isSuccess) {
  45.         paint.color = getColor(bacColorStart, bacColorSuccess, (strokeRatio + tickAndXRatio) / 2f)
  46.     } else {
  47.         paint.color = getColor(bacColorStart, bacColorError, (strokeRatio + tickAndXRatio) / 2f)
  48.     }
  49.     canvas.drawRoundRect(0f, 0f, mW, mH, 200f, 200f, paint)
  50. }
  51. /**
  52. * 画造笔墨
  53. */
  54. private fun drawText(canvas: Canvas) {
  55.     getTextPaint()
  56.     val fontMetrics: Paint.FontMetrics = paint.fontMetrics
  57.     textY = mH / 2f - (fontMetrics.ascent + fontMetrics.descent) / 2f
  58.     paint.color = getColor(textColor, 1f - strokeRatio)
  59.     canvas.drawText(if (strokeRatio == 0f) text else textLoading, textX, textY, paint)
  60. }
复造代码
免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则