首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

HarmonyOS鸿蒙开发实战( Beta5.0)基于绘制组件实现自定义进度动画实践案例

  • 25-03-03 06:42
  • 3375
  • 9292
blog.csdn.net

鸿蒙HarmonyOS开发实战往期必看文章:(持续更新......)

HarmonyOS NEXT应用开发性能实践总结(持续更新......)

HarmonyOS NEXT应用开发案例实践总结合集(持续更新......)

一分钟了解”纯血版!鸿蒙HarmonyOS Next应用开发!

最新版!“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通)


介绍

本示例介绍使用绘制组件中的Circle组件以及Path组件实现实时进度效果。该场景多用于手机电池电量、汽车油量、水位变化等动态变化中。

效果预览图

使用说明

  1. 加载完成后初始显示进度为0%,颜色为红色,且有充电、耗电两个按钮。
  2. 点击充电按钮,进度会持续增长,直到100%时绿色填充满整个圆形,当到达20%以上和80%以上时,颜色动态变化。
  3. 点击耗电按钮,进度会持续下降,直到0%恢复1中的初始效果,当到达20%以下和80%以下时,颜色动态变化。

实现思路

  1. 使用Circle组件绘制外层的圆环。 源码参考PaintComponent.ets。
  1. // 外框圆环
  2. Circle({
  3. width: Constants.BIG_DIAMETER,
  4. height: Constants.BIG_DIAMETER
  5. })
  6. .fill(Constants.COLOR_TRANSPARENT)
  7. .stroke(this.colorBackgroundFill)
  8. .strokeWidth($r("app.integer.paint_component_outer_circle_stroke_width"))
  1. 绘制中间的进度的填充。中间的填充有两个状态:1、在进度100%时是填充颜色的圆形;2、在进度不足100%时,使用Path组件绘制闭合曲线实现。源码参考PaintComponent.ets。
  1. // 进度展示
  2. Circle({
  3. width: Constants.DIAMETER,
  4. height: Constants.DIAMETER
  5. })
  6. .fill(this.bgColor)
  7. // TODO:知识点:使用Path组件绘制封闭曲线,实现水位线效果
  8. Path()
  9. .width(Constants.DIAMETER)
  10. .height(Constants.DIAMETER)
  11. .commands(this.pathCommands)
  12. .fill(this.colorBackgroundFill)
  13. .antiAlias(true)
  14. .stroke(this.colorBackgroundFill)
  15. .strokeWidth($r("app.integer.paint_component_path_stroke_width"))
  1. 计算封闭曲线。水位线的端点的纵坐标y与进度k的关系为:y=(1-k)*2r,而圆心坐标为(r,r),以此确定水位线的坐标,然后拼接成绘制封闭曲线的commands。源码参考PaintComponent.ets。
  1. /**
  2. * 根据进度拿到水位线的端点的纵坐标
  3. *
  4. * @param progressPercent 进度百分比
  5. * @returns 水位线的端点的纵坐标
  6. */
  7. getOrdinate(progressPercent: number): number {
  8. return (Constants.UNIT_ONE - progressPercent) * (Constants.RADIUS_IN_PX + Constants.RADIUS_IN_PX);
  9. }
  10. /**
  11. * 根据圆心,以及纵坐标拿到水位线两个端点的距离的平方
  12. *
  13. * @param ordinate 纵坐标
  14. * @returns 端点间距离的平方
  15. */
  16. getDistanceSquare(ordinate: number): number {
  17. return Constants.RADIUS_IN_PX * Constants.RADIUS_IN_PX - (ordinate - Constants.RADIUS_IN_PX) * (ordinate - Constants.RADIUS_IN_PX);
  18. }
  19. /**
  20. * 计算闭合曲线
  21. *
  22. * @param progressNum 进度
  23. * @returns 绘制闭合曲线的commands
  24. */
  25. getPathCommands(progressNum: number): string {
  26. // 拿到水位线的端点的纵坐标
  27. const ordinate: number = this.getOrdinate(progressNum / Constants.PERCENT_RATE);
  28. // 拿到端点之间的距离的平方
  29. const distanceSquare: number = this.getDistanceSquare(ordinate);
  30. if (distanceSquare >= Constants.ZERO) {
  31. // 开平方得到端点间的距离
  32. const distance: number = Math.sqrt(distanceSquare);
  33. // 计算得出第一个端点的横坐标
  34. const firstAbscissa: number = Constants.RADIUS_IN_PX - distance;
  35. // 计算得到第二个端点的横坐标
  36. const secondAbscissa: number = Constants.RADIUS_IN_PX + distance;
  37. return this.formatPathCommands(firstAbscissa, secondAbscissa, ordinate, Constants.RADIUS_IN_PX);
  38. }
  39. return "";
  40. }
  41. /**
  42. * 拼接绘制闭合曲线的commands
  43. *
  44. * @param firstAbscissa
  45. * @param secondAbscissa
  46. * @param ordinate
  47. * @param radius
  48. * @returns
  49. */
  50. formatPathCommands(firstAbscissa: number, secondAbscissa: number, ordinate: number, radius: number): string {
  51. return `M${firstAbscissa} ${ordinate} A${radius} ${radius} 0 ${ordinate > Constants.RADIUS_IN_PX ? 0 : 1} 0 ${secondAbscissa} ${ordinate}`
  52. + `Q${(firstAbscissa + 3 * secondAbscissa) / 4} ${ordinate + 12.5 * (secondAbscissa - firstAbscissa) / radius}, ${(firstAbscissa + secondAbscissa) / 2} ${ordinate} T${firstAbscissa} ${ordinate}`;
  53. }
  1. 绘制最上层的百分比显示。源码参考PaintComponent.ets。
  1. // 进度百分比
  2. Row() {
  3. Text($r("app.string.paint_component_progress_percentage_symbol_name"))
  4. .fontColor(Constants.COLOR_NORMAL)
  5. .fontSize($r("app.integer.paint_component_progress_percentage_symbol_font_size"))
  6. Text(this.progressNum.toFixed(Constants.ZERO) + Constants.PERCENTAGE_STR)
  7. .fontSize($r("app.integer.paint_component_progress_percentage_font_size"))

高性能知识点

不涉及

工程结构&模块类型

  1. paintcomponent // har类型
  2. |---constants
  3. | |---Constants.ets // 常量类
  4. |---view
  5. | |---PaintComponent.ets // 视图层-绘制组件页面

鸿蒙NEXT全套学习资料
微信名片
注:本文转载自blog.csdn.net的让开,我要吃人了的文章"https://blog.csdn.net/weixin_55362248/article/details/142559082"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top