7 Star 30 Fork 8

Gitee Community / OpenHarmony组件开发大赛-有奖征文

 / 详情

源码解读 - Swell长按膨胀按钮组件源码解读

意向
需求
创建于  
2021-10-20 16:38

组件介绍

基于OpenHarmony下的JavaScript UI框架,使用stack容器组件、canvas画布组件和button按钮组件,在按钮上绑定ontouchstart事件和ontouchend事件,实现一个自定义长按膨胀按钮组件,同时兼顾按钮和进度条两个功能。


项目结构

项目结构


子组件布局

<stack class="stack-parent" style="background-color : #00000000">
    <canvas ref="canvas1" style="width: 300px; height: 300px; background-color: #00000000;"></canvas>
    <button id="btn" disabled="{{ disabled }}" class="Animation" type="circle"
            style="radius: {{ divR }}; background-color: #9D9D9D;"
            ontouchstart="Show" ontouchend="Erase"></button>
</stack>

动作拆解

  • 点击动作

点击时画外圈,按钮逐渐变大。

点击动作

    Show() {
        //打印按钮当前状态为“正在点击”
        this.$emit('btnType', {btnstate: '点击'});
        console.log("————按钮状态:点击中————");

        const el = this.$refs.canvas1;
        const ctx = el.getContext('2d', { antialias: true });
        //画外圈,用于提示长按进度
        ctx.lineWidth = 5;
        ctx.strokeStyle = '#82D900';
        ctx.beginPath();
        ctx.arc(150, 150, 100, 0, 6.28);
        ctx.stroke();
        console.log("外圈显现,按钮膨胀");

        //膨胀动画
        var options1 = {
            duration: this.duration,     //运行时间
            easing: 'linear',       //动画时间曲线
            fill: 'forwards',       //指定动画起始态或终止态
            iterations: 1,      //播放次数
            begin: 50.0,        //播放起点
            end: 100.0,     //播放终点
        }
        this.animator.update(options1);
        var _this = this;
        this.animator.onframe = function(value) {
            _this.divR = value;
            //外部色圈显现,提示启动事件准备就绪
            if(100 == _this.divR) {
                ctx.beginPath();
                ctx.arc(150, 150, 120, 0, 6.28);
                ctx.shadowBlur = 1;
                ctx.shadowColor = '#FFFF37';
                ctx.stroke();
                console.log("准备就绪");
            }
        };
        this.animator.play();
    },
  • 松开动作

长按达到设定时间,生成外圈阴影,松开即可启动事件,若中途松开,按钮瞬间恢复到初始状态。

松开动作

    Erase() {
        //打印按钮当前状态为“松开”
        this.$emit('btnType', {btnstate: '松开'});
        console.log("————按钮状态:松开————");

        //重置动画
        var options2 = {
            duration: 0,        //运行时间
            easing: 'linear',       //动画时间曲线
            fill: 'forwards',       //指定动画起始态或终止态
            iterations: 1,      //播放次数
            end: 50.0,      //播放终点为初始起点
        }
        this.animator.update(options2);
        var _this = this;
        this.animator.onframe = function(value) {
            _this.divR = value;
        };

        //成功启动事件
        if(100 == _this.divR) {
            this.disabled = true;       //按钮失效,不可点击
            //向父组件传递事件的状态值为true
            this.$emit('eventType', {eventstate: true});
            console.log("启动成功");
        }

        //启动失败,擦除提示外圈
        else {
            const el = this.$refs.canvas1;
            const ctx = el.getContext('2d');
            ctx.clearRect(45, 45, 210, 210);
            console.log("启动失败")
            console.log("外圈擦除,按钮重置");
        }
    },

关键代码

  • 外圈显隐

使用canvas画布组件,以坐标(150,150)为圆心,2π为弧度,画半径为100的浅绿色圆形外圈。

画外圈

中途松开按钮时,使用clearRect方法擦除该外圈(以坐标(45,45)为起点,擦除边长为210的方形区域)。

擦除外圈

  • 膨胀动画

导入模块

import animator from '@ohos.animator';

初始化声明

    onInit() {
        //膨胀动画初始化创建声明
        var options = {};
        this.animator = animator.createAnimator(options);
    },

按钮膨胀动画,当用户持续长按达到设定时间时,膨胀动画完整播放,按钮半径达到最大值100,此时触发提示条件,生成黄色外圈阴影提示用户“长按操作已完成,松开即可启动事件”。

按钮膨胀

中途松开按钮,动画对象加载反方向的动画属性集,将按钮初始半径作为播放终点,运行时间设定为零,瞬间恢复初始状态。

重置动画


组件引用

  • 引用声明

<element name="btnswell" src='../../common/component/btnswell.hml'></element>
  • 参数传递

父组件 -> 子组件:父组件通过设置子组件中duration属性设定长按操作所需的时间。

设定长按时间

子组件 -> 父组件:
文本用于显示按钮处于何种状态(点击/松开)。

显示按钮状态

当成功完成长按操作,子组件向父组件传递参数eventstate值为true,用户可结合自身项目需求使用该值触发某些事件。

事件状态


最终效果

完整演示

结语

该自定义组件开发项目较为简单,代码逻辑也并不复杂,比较适合刚入门的新手参考学习,希望能帮助到大家,谢谢评阅。

评论 (0)

詹伟松 创建了需求
詹伟松 修改了描述
詹伟松 修改了标题
展开全部操作日志

登录 后才可以发表评论

状态
负责人
项目
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
预计工期 (小时)
参与者(1)
其他
1
https://gitee.com/gitee-community/OHZW210809.git
git@gitee.com:gitee-community/OHZW210809.git
gitee-community
OHZW210809
OpenHarmony组件开发大赛-有奖征文

搜索帮助