登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
登录
注册
9月20日,Gitee × 模力方舟来成都了!聚焦 AI 应用在开发范式、算力架构、交互设计、硬件选型等跨场景创新实践,点击立即报名~
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
7
Star
28
Fork
8
Gitee Community
/
OpenHarmony组件开发大赛-有奖征文
代码
Issues
17
Pull Requests
0
Wiki
统计
流水线
服务
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
我知道了,不再自动展开
更新失败,请稍后重试!
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
大赛经验 - 长按膨胀按钮从构思到实现
意向
#I4EKMZ
需求
詹伟松
创建于
2021-10-20 09:52
### 前言 今年7月中旬参加实习接触到OpenHarmony,开始学习使用DevEco Studio,适逢举办OpenHarmony组件开发大赛,自己学习了一段时间,想尝试着参与一下。 第一个首要的问题是设计什么样的组件,应用于什么场景,能够实现哪些功能,光是这几个问题想必就难到了各位参赛者,我也是想了很久都没能想出比较好的点子。 一天我在写项目中的某个长按事件时发现,onlongpress事件似乎不能设定长按的时间,而且绑定了长按事件的按钮在完成长按操作前后没有明显的样式变化,用户从中得到自己的长按操作正在执行的反馈很有限。这给了我设计开发的灵感,决定结合这些需求开发一个自定义长按按钮。 <br/> ### 一、初步设计 首先是自定义长按操作的时间,原有的onlongpress方法是无法满足了,因此将长按操作拆分为按下和松开两个动作,按下时启动计时,松开时结束计时,并根据松开后计时器的值与设定的常量进行对比判断长按操作是否合规。 接下来的问题是以何种形式给予用户长按操作完成的反馈。这种反馈可以是视觉的、听觉的或是触觉的,听觉上可以是播报提示音,触觉上可以是震动,但这两个的应用场景都比较有针对性,且相对受限于环境,比如我就不习惯虚拟键盘的哒哒声,震动则感觉过于“正式”,所以选择较为平常的视觉反馈方式。 要用哪种形式上的视觉提示呢,动画、进度条、颜色渐变,我打算将这些结合起来。我想起水波纹的动画效果,看起来不错,如果再给这个波纹加个框又能起到进度条的效果,等完成长按就变色提示用户。接着我就画了张概念图,如下:  <br/> ### 二、开发 - #### 外圈显隐 确定了设计方案就开始开发,先将整个实现流程进行拆解,分为点击、松开两个动作,即在同一个按钮绑定ontouchstart和ontouchend两个事件。点击时显示外圈,按钮逐渐膨胀变大,变大到外圈大小时变色提示用户,用户松开按钮,启动事件。 之前在官方文档看到一个隐藏文本点击显示的Demo,受其启发设想外圈根据按钮点击或松开两种状态变化,点击时显示,松开时消失。使用渲染属性if加boolean类型变量的方式来控制外圈的显隐,发现在预览器上实际测试时外圈仅仅闪了一下就消失了。我以为是stack布局显示的问题,也有可能是该渲染属性不支持canvas组件的问题(后来才明白应该使用show渲染属性,虽然二者的描述很类似,但效果还是有区别的)。  原本计划在初始化时将外圈画好,默认设置画布隐藏,待点击按钮时显现,松开时再隐藏。但画布组件的getContext方法并不支持在OnInit中调用。  随后放弃使用渲染属性,转变思路,将“隐藏”改为“擦除”。原本是在hml文件的canvas组件中添加show属性,现在直接在js文件里对画布对象使用clearRect()方法删除指定区域内的绘制内容。点击按钮时在画布上画圈,松开按钮时擦除画布,从而实现显隐效果。  <br/> - #### 膨胀动画 在开发过程中,我抛弃了原本计时器长按计时的方案,改为根据膨胀按钮的半径长度与外圈长度做对比判断。其中膨胀动画用到了API6的动画样式,当按住按钮时,膨胀动画持续播放,按钮慢慢变大,松开时反向播放恢复为初始状态。设定膨胀动画完整播放完所需的时间,成功完成长按操作,按钮膨胀到外圈大小后松开保持现有大小,需要设置动画对象的options属性参数,将其中的动画启停模式参数fill的值设为forwards。  而中途松开按钮则重置按钮样式为初始大小,通过声明使用一个相反方向的重置动画属性集options2,将其中的播放时长参数duration设为0,瞬间完成重置动画,并将初始按钮大小的值赋给end参数。  <br/> - #### 完成提示 最后是长按操作完成的视觉提示,原先设想是完成长按操作时按钮变色提示,但在开发时出现问题不得不转变方案。为了方便解释我在此将按钮分为初始态(未点击),点击态(正被点击)两种状态,当我们点击按钮时按钮处于点击态,此时按钮的颜色会比初始态稍微深一点点,我们可以通过在对于的css文件中声明button-style:active样式来设定按钮点击态的颜色。按钮变色的目的是提示用户“已经完成长按操作,可以松开按钮”,但是按钮处于点击态的颜色遮挡了按钮初始态的颜色,所以即使按钮对应的颜色变量改变了,也只能看到点击态的按钮颜色,只有松开按钮后才看到变色后的初始态按钮颜色,这就相当于“马后炮”了。于是我决定改变方案,从按钮变色改为生成外圈阴影,也能达到视觉提示的目的。  <br/> ### 三、最终效果 最后的成品尽管与最初的设计有些不同,但基本上满足了一开始的需求。为了方便动态图展示效果,参考了官方文档中自定义组件里父组件和子组件之间的参数传递的示例(这部分内容在赛前辅导的直播课里老师也有讲到,讲得挺详细的,大家可以去看视频学习),加了文本和日志打印用于显示按钮状态及事件进度,最终效果如下: 
### 前言 今年7月中旬参加实习接触到OpenHarmony,开始学习使用DevEco Studio,适逢举办OpenHarmony组件开发大赛,自己学习了一段时间,想尝试着参与一下。 第一个首要的问题是设计什么样的组件,应用于什么场景,能够实现哪些功能,光是这几个问题想必就难到了各位参赛者,我也是想了很久都没能想出比较好的点子。 一天我在写项目中的某个长按事件时发现,onlongpress事件似乎不能设定长按的时间,而且绑定了长按事件的按钮在完成长按操作前后没有明显的样式变化,用户从中得到自己的长按操作正在执行的反馈很有限。这给了我设计开发的灵感,决定结合这些需求开发一个自定义长按按钮。 <br/> ### 一、初步设计 首先是自定义长按操作的时间,原有的onlongpress方法是无法满足了,因此将长按操作拆分为按下和松开两个动作,按下时启动计时,松开时结束计时,并根据松开后计时器的值与设定的常量进行对比判断长按操作是否合规。 接下来的问题是以何种形式给予用户长按操作完成的反馈。这种反馈可以是视觉的、听觉的或是触觉的,听觉上可以是播报提示音,触觉上可以是震动,但这两个的应用场景都比较有针对性,且相对受限于环境,比如我就不习惯虚拟键盘的哒哒声,震动则感觉过于“正式”,所以选择较为平常的视觉反馈方式。 要用哪种形式上的视觉提示呢,动画、进度条、颜色渐变,我打算将这些结合起来。我想起水波纹的动画效果,看起来不错,如果再给这个波纹加个框又能起到进度条的效果,等完成长按就变色提示用户。接着我就画了张概念图,如下:  <br/> ### 二、开发 - #### 外圈显隐 确定了设计方案就开始开发,先将整个实现流程进行拆解,分为点击、松开两个动作,即在同一个按钮绑定ontouchstart和ontouchend两个事件。点击时显示外圈,按钮逐渐膨胀变大,变大到外圈大小时变色提示用户,用户松开按钮,启动事件。 之前在官方文档看到一个隐藏文本点击显示的Demo,受其启发设想外圈根据按钮点击或松开两种状态变化,点击时显示,松开时消失。使用渲染属性if加boolean类型变量的方式来控制外圈的显隐,发现在预览器上实际测试时外圈仅仅闪了一下就消失了。我以为是stack布局显示的问题,也有可能是该渲染属性不支持canvas组件的问题(后来才明白应该使用show渲染属性,虽然二者的描述很类似,但效果还是有区别的)。  原本计划在初始化时将外圈画好,默认设置画布隐藏,待点击按钮时显现,松开时再隐藏。但画布组件的getContext方法并不支持在OnInit中调用。  随后放弃使用渲染属性,转变思路,将“隐藏”改为“擦除”。原本是在hml文件的canvas组件中添加show属性,现在直接在js文件里对画布对象使用clearRect()方法删除指定区域内的绘制内容。点击按钮时在画布上画圈,松开按钮时擦除画布,从而实现显隐效果。  <br/> - #### 膨胀动画 在开发过程中,我抛弃了原本计时器长按计时的方案,改为根据膨胀按钮的半径长度与外圈长度做对比判断。其中膨胀动画用到了API6的动画样式,当按住按钮时,膨胀动画持续播放,按钮慢慢变大,松开时反向播放恢复为初始状态。设定膨胀动画完整播放完所需的时间,成功完成长按操作,按钮膨胀到外圈大小后松开保持现有大小,需要设置动画对象的options属性参数,将其中的动画启停模式参数fill的值设为forwards。  而中途松开按钮则重置按钮样式为初始大小,通过声明使用一个相反方向的重置动画属性集options2,将其中的播放时长参数duration设为0,瞬间完成重置动画,并将初始按钮大小的值赋给end参数。  <br/> - #### 完成提示 最后是长按操作完成的视觉提示,原先设想是完成长按操作时按钮变色提示,但在开发时出现问题不得不转变方案。为了方便解释我在此将按钮分为初始态(未点击),点击态(正被点击)两种状态,当我们点击按钮时按钮处于点击态,此时按钮的颜色会比初始态稍微深一点点,我们可以通过在对于的css文件中声明button-style:active样式来设定按钮点击态的颜色。按钮变色的目的是提示用户“已经完成长按操作,可以松开按钮”,但是按钮处于点击态的颜色遮挡了按钮初始态的颜色,所以即使按钮对应的颜色变量改变了,也只能看到点击态的按钮颜色,只有松开按钮后才看到变色后的初始态按钮颜色,这就相当于“马后炮”了。于是我决定改变方案,从按钮变色改为生成外圈阴影,也能达到视觉提示的目的。  <br/> ### 三、最终效果 最后的成品尽管与最初的设计有些不同,但基本上满足了一开始的需求。为了方便动态图展示效果,参考了官方文档中自定义组件里父组件和子组件之间的参数传递的示例(这部分内容在赛前辅导的直播课里老师也有讲到,讲得挺详细的,大家可以去看视频学习),加了文本和日志打印用于显示按钮状态及事件进度,最终效果如下: 
评论 (
0
)
登录
后才可以发表评论
状态
意向
意向
已确认
方案设计
UI设计
开发中
待测试
测试中
待演示
待上线
已上线
已验收
已拒绝
挂起
负责人
未设置
标签
未设置
项目
未立项任务
未立项任务
里程碑
未关联里程碑
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
未关联
master
develop
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
预计工期
(小时)
参与者(1)
其他
1
https://gitee.com/gitee-community/OHZW210809.git
[email protected]
:gitee-community/OHZW210809.git
gitee-community
OHZW210809
OpenHarmony组件开发大赛-有奖征文
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册