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

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

番茄钟:

经常使用番茄钟的各种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 文件中添加抽奖的页面布局: 在js 文件中添加抽奖逻辑: 实现了一个简单的地奖功能,用户点击“开始抽奖“按知后,抽奖结里会从奖品列表中贿机

    2024年02月16日
    浏览(50)
  • 微信小程序(原生)搜索功能实现

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

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

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

    2024年04月28日
    浏览(33)
  • 微信小程序实现订阅消息功能

             * 源码已经上传到资源处,需要的话点击跳转下载 |  源码下载         小程序中的订阅内容在日常中大家都会使用到,一般在支付的时候,会收到支持成功的消息,里面有一些基础信息花费多少以及是使用在什么地方,订阅消息是小程序向用户发送消息的方式

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

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

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

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

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

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

    2024年02月04日
    浏览(67)
  • 微信小程序图片裁剪功能的实现

    在之前的博文中,已经介绍了如何使用在前端开发中,实现较方便自由的图片裁剪功能,可见博文: 如何一步步实现图片裁剪功能。 本文将进一步讲述在微信小程序中,我们实现图片裁剪功能需要如何处理,文章末尾将附上小程序端图片裁剪完整源码的下载链接。 在小程序

    2023年04月15日
    浏览(44)
  • 通过微信小程序实现登录功能

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

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

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

    2024年02月08日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包