微信小程序--实现番茄钟功能

这篇具有很好参考价值的文章主要介绍了微信小程序--实现番茄钟功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

番茄钟:

经常使用番茄钟的各种app,自己也想尝试一下制作,该小程序主要实现了番茄时钟、效率统计等功能。

设计如下:

微信小程序--实现番茄钟功能

代码地址:https://gitcode.net/weiba_tao/mypractice 

 计时页面:

微信小程序--实现番茄钟功能微信小程序--实现番茄钟功能

代码如下:

页面分为选择时间及任务页,倒计时页,两个页面用hidden进行切换

---wxml 选择页---  

<view hidden="{{isClock}}" class="wrap">
    <view class="slider">
        <slider min="1" max="60" show-value activeColor="#FA8072" value="{{time}}" bindchange="slideChange"></slider>
    </view>
    <view class="text">
        <view class="text_title">请选择一个任务</view>
        <view class="text_desc">在接下来的{{time}}分钟,开始专注吧</view>
    </view>
    <view class="box_cate">
        <view wx:for="{{cateArr}}" class="cate_item" wx:key="cate">
            <view class="cate_img">
                <image src="../../images/{{item.icon}}.png" bindtap="buttonChange" data-icon-list="{{item.text}}"></image>
            </view>
            <view class="cate_text">{{item.text}}</view>
        </view>
    </view>
</view>

 ---wxml 倒计时页---

<view hidden="{{!isClock}}" class="clock">
    <view class="clock_text">{{clockText}}中...</view>
    <view class="count_down">
        <canvas type="2d" id="circle" class="circle" ></canvas>
        <canvas type="2d" id="circle_active" class="circle_active"></canvas>
        <view class="count_text">{{timeStr}}</view>
    </view>
    <view class="clock_button">
        <image src="../../images/pause.png" bindtap="handlePause" wx:if="{{playShow}}"></image>
        <image src="../../images/play.png" bindtap="handlePlay" wx:else ></image>
        <image src="../../images/suspend.png" bindtap="handleSuspend"></image>
    </view>
</view>

点击“自定义”任务按钮和倒计时中止按钮时,均会弹出弹窗

微信小程序--实现番茄钟功能微信小程序--实现番茄钟功能

---js 弹窗---

    buttonChange(e){
        const iconList=e.currentTarget.dataset.iconList
        if(iconList==='自定义'){
            let _this=this
            wx.showModal({
                title: '自定义任务',
                editable:true,
                placeholderText:'请输入任务名称',
                confirmColor:'#FA8072',
                success (res) {
                  if (res.confirm) {
                    _this.setData({
                        clockText:res.content
                    })
                    _this.saveData()
                  }
                }
              })
        }else{
            this.setData({
                clockText:iconList
            })
            this.saveData()
        }
    },
    saveData(){
        this.setData({
            isClock:true,
            mTime:this.data.time*60*1000, //ms
            timeStr:parseInt(this.data.time) >= 10 ? this.data.time+ ":00" :"0" +this.data.time + ":00"
        })
        this.drawCircle()
        this.drawActive()
    },
//中止按钮
    handleSuspend(){
        clearInterval(this.data.timer);
        let _this=this
        wx.showModal({
            title: '提示',
            content:'确定中止任务吗?当前计时会立刻停止,并返回主界面',
            confirmColor:'#FA8072',
            success (res) {
              if (res.confirm) {
                _this.setData({
                    isClock:false,
                    playShow:true
                })
              }else if(res.cancel){
                _this.drawActive()
              }
            }
        })
    }

 倒计时完成后会自动弹出弹窗提醒计时完毕,并返回主页,同时将此次数据上传存储

微信小程序--实现番茄钟功能

 倒计时圆圈,利用小程序canvas画布绘制

drawActive(){
        let _this = this
        var timer =setInterval(()=>{
            let angle = 1.5 + 2*(_this.data.time*60*1000 - _this.data.mTime)/(_this.data.time*60*1000);
            let currentTime = _this.data.mTime - 100
            _this.setData({
                mTime:currentTime
            })
            if(angle<3.5){
                if(currentTime % 1000 == 0){
                    var timeStr1 = currentTime / 1000;//s
                    var timeStr2 = parseInt(timeStr1 / 60); //m
                    var timeStr3 = (timeStr1 - timeStr2 * 60) >= 10 ? (timeStr1 - timeStr2 * 60) :"0" +  (timeStr1 - timeStr2 * 60);
                    var timeStr2 = timeStr2 >= 10 ? timeStr2:"0" + timeStr2;
                    _this.setData({
                     timeStr:timeStr2 + ":" + timeStr3
                    })
                  };
                const lineWidth = 6 / _this.data.rate;//px
                const query = wx.createSelectorQuery()
                query.select('#circle_active')
                    .fields({ node:true, size: true})
                    .exec((res) => {
                    const canvas = res[0].node
                    const ctx = canvas.getContext('2d')
                    const dpr = wx.getSystemInfoSync().pixelRatio
                    canvas.width = res[0].width * dpr
                    canvas.height = res[0].height * dpr
                    ctx.scale(dpr, dpr)
                    ctx.lineCap='round'
                    ctx.lineWidth="lineWidth"
                    ctx.beginPath()
                    ctx.arc(400/_this.data.rate/2,400/_this.data.rate/2,400/_this.data.rate/2-2*lineWidth,1.5*Math.PI,angle*Math.PI,false)
                    ctx.strokeStyle ="#E7624F"
                    ctx.stroke()
                    })
            }else{
                //计时完成时
                wx.showModal({
                    title: '提示',
                    content:'当前计时已完成,将跳转回主界面',
                    showCancel:false,
                    confirmText:'好的',
                    confirmColor:'#FA8072',
                    success (res) {
                      if (res.confirm) {
                        var logs = wx.getStorageSync("logs") || [];
                        logs.unshift({
                            date: formatTime(new Date),
                            cate: _this.data.clockText,
                            time: _this.data.time
                        });
                        console.log(789,logs)
                        wx.setStorageSync('logs', logs); //存入缓存
                        _this.setData({
                            timeStr:"00:00",
                            playShow:false,
                            isClock:false
                         })
                      }
                    }
                })
                clearInterval(timer); 
            }    
        },100)
        _this.setData({
            timer :timer
        })    
    },

统计页面:

微信小程序--实现番茄钟功能

---wxml---

<view class="today">
    <view class="today_text">今日专注</view>
    <view class="today_wrap">
        <view wx:for="{{staList}}" class="staList" wx:key="staList">
            <view class="staList_title">{{item.title}}</view>
            <view class="staList_val">{{item.val}}</view>
        </view>
    </view>
</view>
<view class="altogether">
    <view class="al_text">累计专注</view>
    <view class="al_wrap">
        <view wx:for="{{allList}}" class="allList" wx:key="allList">
            <view class="al_title">{{item.title}}</view>
            <view class="al_val">{{item.val}}</view>
        </view>
    </view>
</view>

<view class="detail">
  <view class="detail_title">
    <view class="detail_title_text">分类统计</view>
    <view class="detail_title_type">
      <text class="{{activeIndex == 0 ? 'active':''}}" data-index="0" bindtap="changeType">今日</text>
      <text class="{{activeIndex == 1 ? 'active':''}}" data-index="1" bindtap="changeType">历史</text>
    </view>
  </view>

  <view class="detail_list" wx:if="{{list.length > 0}}">
    <view class="list_item" wx:for="{{list}}" wx:key="cate" >
        <view class="dotline">
            <view class="line"></view>
            <view class="dot"></view>
        </view>
        <view class="list_item_date">{{item.date}}</view>
        <view class="list_item_text">{{item.cate}}</view>
        <view class="list_item_time">{{item.time}}分钟</view>
        
    </view>
  </view>
</view>

---js---

主要在于用wx.getStorageSync( )获取之前存储的数据,再进行渲染和修改样式即可

onLoad(){
        var logs = wx.getStorageSync('logs') || [];
        var day = 0;
        var total = logs.length;
        var dayTime = 0;
        var totalTime = 0;
        var dayList = [];
        if(logs.length > 0){
            for(var i = 0;i < logs.length;i++){
            let a = logs[i].date + ""
            let b = formatTime(new Date) + ""
                if(a.slice(0,10) == b.slice(0,10)){
                console.log(formatTime(new Date))
                day = day + 1;
                dayTime = dayTime + parseInt(logs[i].time);
                dayList.push(logs[i]);
                this.setData({
                    dayList:dayList,
                    list:dayList
                })
                }
            totalTime = totalTime + parseInt(logs[i].time);
            }
            this.setData({
                'staList[0].val':day,
                'allList[0].val':total,
                'staList[1].val':dayTime+'分钟',
                'allList[1].val':totalTime+'分钟'
            })
        }
    },

图标来源:iconfont-阿里巴巴矢量图标库

学习参考:https://www.bilibili.com/video/BV1PV411k7ie/?spm_id_from=333.999.0.0&vd_source=4d32d05e88600f43895e6608cad6b5f5文章来源地址https://www.toymoban.com/news/detail-514213.html

到了这里,关于微信小程序--实现番茄钟功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序(原生)搜索功能实现

     一、效果图  二、代码 wxml scss js json文件是引入的vant

    2024年02月11日
    浏览(39)
  • 【微信小程序】下拉刷新功能实现

    微信小程序开发系列 在开发微信小程序中经常会需要下拉页面进行更新要页面数据的功能,微信小程序提供了onPullDownRefresh函数。该函数作用是监听用户下拉动作。 监听用户下拉刷新事件。 需要在app.json的window选项中或页面配置中开启enablePullDownRefresh: 可以通过wx.startPullD

    2024年02月12日
    浏览(32)
  • 微信小程序搜索框功能实现

    说明:本文只涉及了微信小程序前端部分的代码实现,需要的后台列表数据原本已经查询出来了的 思路实现: 1、首先确定自己想要的搜素效果大概是怎么样的,我想到的大概效果是在搜索输入框输入内容时根据搜索内容是否被包含在资讯列表的标题里面,如果包含在里面,

    2024年04月28日
    浏览(23)
  • 微信小程序实现筛选的功能

    在页面加载的时候,显示最原始的数据,当我们点击按钮的时候,触发筛选的功能,只显示符合条件的数据,再次点击的时候取消筛选的功能,显示原本的数据 在数据的显示过程中,可以设置一个临时的数组,在筛选的时候将临时数组清空,取消筛选的时候再将数值重新赋值

    2024年02月14日
    浏览(31)
  • 微信小程序:简单实现地图导航功能实现

    里面的小图片需要自己找,真机调试时,点击导航即可进入地图,可导航,规划路线… 效果图 代码: wxml js wxss

    2024年02月11日
    浏览(39)
  • 【微信开发】微信小程序实现实时聊天功能

    最近在做一个项目,需要运用到实时聊天功能,分享一下。      分为: 1.界面如何布局以及细节; 2.如何实现实时更新; 3.全部代码展示;         一、界面如何布局以及细节:         1.说到底,聊天界面就是循环一个数组,每一行为一个单位(item),循环(wx.for)我

    2024年02月04日
    浏览(41)
  • 【微信小程序】实现投票功能(附源码)

            Vant Weapp 是一个基于微信小程序的组件库,它提供了丰富的 UI 组件和交互功能,能够帮助开发者快速构建出现代化的小程序应用。Vant Weapp 的设计理念注重简洁、易用和高效,同时提供灵活的定制化选项,以满足开发者不同的需求。         Vant Weapp 包含了多个

    2024年02月08日
    浏览(29)
  • UNIAPP 微信小程序实现分享功能

    默认情况下点击微信小程序调试器无法实现分享功能,如下图  此时需要设置如下操作,个人默认习惯是在 utils文件下 创建 share.js 文件 并写入代码 内容如下 然后打开main.js 修改如下 设置完成后再点击右上角的分享就打开了 回到组件内 如果需要通过按钮实现分享功能  参考

    2024年02月04日
    浏览(45)
  • 通过微信小程序实现登录功能

    [ ](https://dev.csdn.net/activity?utm_source=sale_sourcesale_source=q4AnCOkys7) 在微信公众平台中注册小程序,并获取 AppID。 在小程序中创建登录页面,包括用户名、密码输入框和登录按钮。 将用户名和密码通过 HTTPS POST 请求发送到后端服务器。 后端服务器验证用户名和密码是否正确,如果

    2023年04月13日
    浏览(43)
  • 微信小程序实现画布生成海报功能

    微信小程序可以通过使用 标签来实现生成海报的功能。以下是基本实现步骤: 1.在 WXML 文件中创建一个 标签,并设置其宽度和高度属性。 ’ 2.在 JS 文件中,获取到 标签的上下文对象。 3.在 ctx 上下文对象中,使用各种绘图 API 绘制出海报的内容 4.最后调用 ctx.draw() 方法将海

    2024年02月16日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包