首页 最新 热门 推荐

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

HarmonyOS鸿蒙开发实战(Beta5.0)PK投票动效实现实践解析

  • 25-03-03 06:42
  • 4187
  • 6486
blog.csdn.net

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

HarmonyOS NEXT应用开发性能实践总结

HarmonyOS NEXT应用开发案例实践总结合集

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

非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!


介绍

本示例介绍使用绘制组件中的Polygon组件配合使用显式动画以及borderRadius实现投票pk组件。

效果预览图

使用说明

  1. 加载完成后会有一个胶囊块被切割成两个等大的图形来作为投票的两个选项,中间由PK两字分隔开
  2. 点击左边选项,两个图形会随着选择人数的比例同步变化,且有变化的动画效果,PK两字消失,图形间间隙变小,选项颜色变淡, 分别在两个图形上显示选择对应选项的人数比例,下方提示文字也会同步改成已选择的选项,且显示总参与投票人数

实现思路

  1. 使用Column绘制胶囊块图形,为实现胶囊块的切割效果以及投票后的比例变换,这里使用两个Colum分别绘制两个半个胶囊块拼接而成。源码参考VotingComponent.ets。
  1. // 使用Column绘制出胶囊块
  2. Column()// 设置左上和左下两个角为圆角
  3. .borderRadius({
  4. topLeft: $r("app.integer.voting_component_fillet_radius"),
  5. bottomLeft: $r("app.integer.voting_component_fillet_radius"),
  6. topRight: $r("app.integer.voting_component_right_angle_radius"),
  7. bottomRight: $r("app.integer.voting_component_right_angle_radius")
  8. })
  9. .backgroundColor(Constants.LEFT_COLOR)
  10. .opacity(this.fillOpacity)// 动态变化透明度
  11. .width(this.leftOptionWidth)// 选项宽度
  12. .height($r("app.integer.voting_component_option_background_height"))
  1. 使用绘制组件中的Polygon实现胶囊块中间被分割的效果。中间的间隙有两个状态:1、未投票时是个宽度比较大的平行四边形,且有PK两字;2、投票后是个宽度很窄的平行四边形,且PK两字消失。源码参考VotingComponent.ets。
  1. Stack() {
  2. // TODO:知识点3:使用绘制组件Polygon投票组件中间的平行四边形空隙效果
  3. Polygon()
  4. .points(this.points)
  5. .fill($r("app.color.voting_component_pk"))
  6. .antiAlias(true)
  7. .width($r("app.integer.voting_component_polygon_width"))
  8. .height($r("app.integer.voting_component_polygon_height"))
  9. // 点击前,空隙宽度稍微大一些,且其中有PK二字
  10. Stack() {
  11. if (!this.isClick) {
  12. Text() {
  13. Span($r("app.string.voting_component_mid_text_left"))
  14. .fontColor(Constants.LEFT_COLOR)
  15. Span($r("app.string.voting_component_mid_text_right"))
  16. .fontColor(Constants.RIGHT_COLOR)
  17. }
  18. .fontSize($r("app.integer.voting_component_mid_text_font_size"))
  19. .fontStyle(FontStyle.Italic)
  20. .fontWeight(Constants.MID_TEXT_FONT_WEIGHT)
  21. .textAlign(TextAlign.Center)
  22. }
  23. }
  24. }
  25. // TODO:知识点4:因为Polygon是以一个矩形框为基准来绘制的,因此会受到这个矩形框的影响,使用position以及markAnchor来偏移,以抵消前述影响
  26. .position({ x: this.leftOptionWidth })
  27. .markAnchor({ x: $r("app.string.voting_component_mid_gap_mark_anchor") })
  1. 计算投票比例作为左右图形宽度,且定义动画效果。源码参考VotingComponent.ets。
  1. // 定义动画
  2. animateParam: AnimateParam = {
  3. duration: Constants.ANIMATE_DURATION,
  4. curve: Curve.EaseOut
  5. }
  6. /**
  7. * 投票后改变属性
  8. *
  9. * @param option 投了左边还是右边
  10. */
  11. changeState(option: string) {
  12. // 投票后将点击状态置为已点击,实现投票只能投一次的效果
  13. this.isClick = true;
  14. // 左下角文字提示投票已选择的选项
  15. this.notice = '已选择"' + option + '"';
  16. // 投票后设置透明度,实现颜色变浅的效果
  17. this.fillOpacity = Constants.END_FILL_OPACITY;
  18. // 根据投票人数来计算选项两边的比例
  19. const leftOptionPercent: number = this.leftOptionChoose / (this.leftOptionChoose + this.rightOptionChoose) * Constants.PERCENTAGE;
  20. // TODO:知识点1:使用显式动画,只有在宽度变化时生效
  21. animateTo(this.animateParam, () => {
  22. this.leftOptionWidth = leftOptionPercent.toFixed(0) + '%';
  23. this.rightOptionWidth = (Constants.PERCENTAGE - leftOptionPercent).toFixed(0) + '%';
  24. this.points = Constants.END_POINTS;
  25. });
  26. }

高性能知识点

不涉及

工程结构&模块类型

  1. votingcomponent // har类型
  2. |---constants
  3. | |---Constants.ets // 常量类
  4. |---view
  5. | |---VotingComponent.ets // 视图层-投票组件页面

模块依赖

本场景依赖了路由模块来注册路由。

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

/ 登录

评论记录:

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

分类栏目

后端 (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