精华内容
下载资源
问答
  • 同样的程序
    千次阅读
    2017-08-04 14:08:42

            最近在MFC开发过程中,遇到一个问题,即运行一段程序需要对其进行计时,不能保证每个同时开始的程序或者说是每个同时开始的线程同时结束。测试的时候,为了找到原因,我让线程上跑的程序时间复杂度都保持一致,且未设置优先级,然而同时开始却依旧不能同时结束,或者说差距比较小的同时结束。最后我尝试了一种更加极端的测试,即同一段程序让其运行,看看运行时间是否一致,为了保证测试的精度,我定时器选择的是QueryPerformanceCounter,其精确度可以达到纳秒级的。测试的结果还是和原来一样,每次运行的时间不同且波动很大。

           于是我尝试在网上找到原因这个贴子,在测试一段代码运行时间,每次不一样,求问原因这个帖子里面我找了一个很可信的原因:

                            1、与操作系统的调度有关

                            2、现在的CPU支持动态调频

    更多相关内容
  • 零基础入门微信小程序开发

    万次阅读 多人点赞 2018-07-03 02:45:07
    本课程是一个系列入门教程,目标是从 0 开始带领读者上手实战,课程以微信小程序的核心概念作为主线,介绍配置文件、页面样式文件、JavaScript 的基本知识并以指南针为例对基本知识进行扩展,另外加上开发工具的安装...

    课程介绍

    本课程是一个系列入门教程,目标是从 0 开始带领读者上手实战,课程以微信小程序的核心概念作为主线,介绍配置文件、页面样式文件、JavaScript 的基本知识并以指南针为例对基本知识进行扩展,另外加上开发工具的安装、小程序发布等内容,共 9 篇文章。

    本课程共包含四个部分。

    第一部分(第1-3篇)带你初步了解小程序是什么,然后进行小程序开发的准备工作,从注册账号到安装开发工具一应俱全。工欲善其事,必先利其器。

    第二部分(第4-6篇)。面向入门级读者介绍小程序构成的各个部分。您不需要事前准备任何知识,需要掌握的会进行说明,需要扩展的会提供信息的出处。千里之行始于足下。

    第三部分(第7-8篇)通过指南针的例子,介绍一个小程序的实现过程。通过这个实例,综合运用所学知识,使小程序开发能力进一步提高。麻雀虽小,五脏俱全。

    第四部分(第9篇)只包含一篇文章,具体介绍小程序发布的过程。使读者能够对小程序开发的全过程有一个完整的了解。编筐编篓,全在收口。

    哪怕您事先没有任何微信小程序相关技术的经验,认真学完该达人课之后,您会掌握基本的小程序开发方法,并具备自主扩展知识面,以及进行更高层次开发的能力。

    点击查看课程全部内容

    作者介绍

    薛卫国,现就职于某外企担任架构小组责任人,CSDN 博客专家,长期从事 C++ 开发,精通 UML、设计模式,创办有公众号《面向对象思考》。毕业于东北大学,曾留校在国家重点实验室工作。

    课程内容

    第01课:初识微信小程序

    要火的节奏

    最近有一则来自北京商报的新闻引起了不少人的注意,我们这里选取一部分:

    争夺流量 手机厂商“抱团”对抗微信小程序

    3月20日,小米、中兴、华为等10家手机厂商联合对外宣布,推出基于手机硬件平台的新型应用生态“快应用”及相关标准。在微信小程序用户规模日益壮大、硬件利润微薄的背景下,本次快应用的推出被看做是手机厂商与腾讯争夺流量与利益的举动。业内人士认为,对于整个市场来说,流量竞争有促进作用,但微信已经具有较强的用户黏性,十大手机厂商要想争夺用户流量并非易事。

    估计这些厂家的标准出台还需要一段时间,但是有一点可以确定的是:小程序类的开发要火。

    但如果你打开轻应用的文档可以发现两点:

    1.应用文档的信息量还很有限。2.轻应用的架构,采用的技术和微信小程序很相似。

    处于这个目的,作者赶在这个时机制作了本课程,希望可以为潮流加一份力;作为程序员,希望各位可以通过本课程的学习,在有限的时间内为自己添一份技能!

    参考资料:轻应用开发文档

    什么是小程序?

    最近一个小游戏“跳一跳”火得不得了,相信即使您自己没有玩过,身边的亲戚朋友也一定玩过。画面大致如下:

    当然了,关于玩法等等不是本文的内容,可以参照百度百科

    这就是微信小程序的成功案例了。

    微信小程序简介

    微信小程序简称小程序,张小龙在微信公开课 Pro 上发布的小程序正式上线,时间是2017年1月9日。关于小程序,张小龙在他的公开课中有过很详细的说明,大家尽可以到网上去搜,这里不再赘述,只说作者自己的理解。

    微信小程序这个词可以分解为“微信”和“小程序”两部分。

    其中“微信”可以理解为“微信中的”,指的是小程序的执行环境;当然微信在提供执行环境的同时也延长了用户使用微信的时间。

    “小程序”是说它首先是程序,然后具备轻便的特征。小程序并不像其他应用那样,它不需要安装,而是通过扫描二维码等打开后直接执行;用完以后也不需要卸载。这就是所谓用完即走的原则。

    另外,微信不会提供类似于小程序商店的地方,需要小程序提供者自己通过二维码,群分享的手段来传播,这就是所谓去中心化的形态。

    微信朋友圈提供了好友之间沟通信息的手段,订阅号提供了面向粉丝推送信息的手段,而小程序则是提供了用户通过自己的操作而与服务实现互动的手段。

    小程序相关技术介绍

    本课程的目标读者群是了解基本的 C/C++ 语法但对小程序开发完全没有经验的程序员,因此在说明微信小程序的同时,对相关技术也将进行相应的介绍。通过这种方式,可使读者能够非常顺利地学习,而无需到处寻找资料导致忘了学习微信小程序这个本来的目的。

    微信小程序推出一年多一点的时间,算是一个新事物,但是利用的技术却都是已经存在的技术。如果你稍加调查就会发现,不光是微信小程序,很多类似形态的应用都采用类似的架构:

    1. 使用 JSON 技术来表现应用的配置信息。包含应用的基本信息,页面配置和路由,应用全体的信息等。
    2. 使用经过定制 CSS+XML 技术来实现视图层的描述。画面元素,例如列表、按钮、文本框、选择框等都通过 XML 语言来描述,遵从 XML 语法,对于页面的共同风格,使用 CSS 进行定义。
    3. 使用 JavaScript 语言来实现逻辑层结构。包括用户操作的处理,系统 API 的调用等。
    4. 架构在视图层和逻辑层之间提供数据和事件传输功能,从而尽量减少难度。由于类似应有都属于轻应用,所以提供的功能都比较单一。

    具体的语法,用途等将会在使用的时候详细介绍,这里只提一下相关技术的基本情况,了解即可。

    换一种说法就是:并不需要另外自己调查,跟着本课程走下去就好。

    JSON

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于 ECMAScript(W3C 制定的 JavaScript 规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

    XML

    XML(Extensible Markup Language),中文名为可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。

    在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息,比如文章等。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。是 Internet 环境中跨平台的、依赖于内容的技术,也是当今处理分布式结构信息的有效工具。早在1998年,W3C 就发布了 XML1.0 规范,使用它来简化 Internet 的文档信息传输。

    CSS

    层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现 HTML 或 XML 等文件样式的计算机语言。CSS 不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。

    CSS 能够对网页中元素位置的排版进行像素级精确控制,支持几乎所有的字体字号样式,拥有对网页对象和模型样式编辑的能力。

    JavaScript

    JavaScript 一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    在1995年时,由 Netscape 公司的 Brendan Eich,在网景导航者浏览器上首次设计实现而成。因为 Netscape 与 Sun 合作,Netscape 管理层希望它外观看起来像 Java,因此取名为 JavaScript。但实际上它的语法风格与 Self 及 Scheme 较为接近。

    为了取得技术优势,微软推出了 JScript,CEnvi 推出 ScriptEase,与 JavaScript 同样可在浏览器上运行。为了统一规格,再加上 JavaScript 兼容于 ECMA 标准,因此也称为 ECMAScript。

    学习方法

    微信小程序虽然是新事物,但学习方法却不是新方法。

    我们的套路是:首先生产一个最简单的小程序实例,通过这个实例介绍微信小程序的构造和想法,这算是学习这个活动中“学”的部分。然后扩展这些知识点,通过开发一个简单的小程序的过程来运用这些知识点,这算是“习”的过程。

    这是作者这些年来屡试不爽的方法。

    参考资料

    在学习和开发的过程中,我们主要会参考微信的开发文档。其原因是小程序太新了,相应的知识储备还不够丰富。虽然也可以找到一些开发方面的书籍,但是说实话,内容并不比微信本身的开发文档更详尽。

    第02课:开发环境的准备

    创建自己的小程序账号

    在开发自己的微信小程序之前,首先需要注册小程序账号,接下来我们一步一步做详细说明。

    打开浏览器,输入:mp.weixin.qq.com。

    因为是第一次使用,所以选择画面右上角的“立即注册”。

    选择左下角的“小程序”方框。

    输入邮箱、密码、确认密码、验证码,之后选择同意协议和条款。当然这里的密码不是邮箱的密码,而是正在申请的小程序账号的密码。

    最后按下“注册”按钮。

    点击“登录邮箱”按钮。打开相应的软件后,应该可以收到下面的邮件。如果没收到的话,建议看一下垃圾邮件,没准儿那里有。

    单击下半部一大片绿色的部分,就可以回到注册界面继续剩下的工作。

    选择主题类型为“个人”,然后输入管理员的姓名,身份证号码。

    输入手机号码并单击“获取验证码”,将手机接收到的验证码输入到短信验证码栏中。

    完成上述步骤,画面下部会出现一个二维码,需要用已经绑定银行卡的微信的扫一扫功能扫描该二维码进行实名认证。

    如果认证成功,画面会变成下面这个样子。

    点击“继续”按钮。

    意思就是现在后悔还来得及,如果不后悔今后就没法后悔了。我们按下“确定”按钮。

    大功告成!

    小程序管理平台

    账号申请成功之后,就可以登录“微信公众平台 | 小程序”了。在目前这个时间点虽然并不需要马上做什么。本文接下来将对其中重要的菜单功能做简单介绍。

    首页

    内容比较简单,主要是表示小程序的实时访问次数和系统公告。

    开发管理

    用户在使用小程序的时候,需要扫描二维码进入。而这个二维码需要开发者将小程序上传到腾讯服务器之后从腾讯取得。上传过程便在该页面上完成。

    过程也不复杂,一共分为三步:上传代码,提交审核和发布小程序。

    用户身份

    这个画面用来指定小程序项目的管理员和项目成员。其中项目成员又包括开发者和体验者。

    数据分析

    这个画面可以统计小程序的访问数量,对用户来源、性别、年龄分布等进行分析。

    模板消息

    这个画面可以定制微信小程序向客户发送的消息。

    客服消息

    通过这个画面可以指定小程序的客服人员,从而实现小程序的在线客服功能。

    附近的小程序

    当小程序的主体为企业、政府、媒体及其他组织时可以开通此功能。此功能有效时,小程序指定地点以后,用户可以通过微信的“附近的小程序”界面发现该小程序。

    运维中心

    一共有两个页面,分别用于查询小程序的错误日志和对客户端进行监控。

    推广

    用来自定义小程序推广关键字。

    设置

    设置分类中一共有五个页面,这里只介绍前两个。

    基本设置

    顾名思义,这里主要是用来设置小程序的基本信息。内容包括:

    1. 设定小程序名称,小程序头像;
    2. 取得小程序码;
    3. 取得认证;
    4. 设定主题信息;
    5. 其他省略。

    开发设置

    这个页面主要负责和小程序开发相关的设定信息,内容包括:

    1. 取得小程序 ID。每一个发布的小程序都需要唯一的 ID。
    2. 生成小程序秘钥。
    3. 指定服务器域名。小程序可以访问外部网站,可以上传和下载文件。但是对象服务器不是任意的,需要在这里指定。
    4. 其他省略。

    其他

    在画面的右上角,有两个链接“文档”和“社区”分别可以进入小程序开发文档和社区。在实际的学习过程中可以积极利用。

    安装开发工具

    小程序账号申请成功之后的工作就是准备开发环境。

    早期的版本在首页分类中有开发工具的下载链接,最近不知道为什么变成了访问次数统计画面。但是没有关系,可以直接点击这里,便可打开下面的下载地址页面。

    根据操作系统选择合适的下载链接。

    下载完成后打开安装程序,首先是开始画面。

    按下“下一步”按钮。

    按下“我接受”按钮。

    指定适当的安装目录后按下“安装”按钮。

    安装中……

    完成!

    接下来就可以开始微信小程序的开发之旅啦!

    第03课:微信开发者工具介绍

    第04课:小程序构成介绍——配置文件的形式和内容

    第05课:小程序构成介绍——WXML 和 WXSS

    第06课:小程序构成介绍——事件处理和数据绑定

    第07课:小程序开发实例——指南针(上)

    第08课:小程序开发实例——指南针(下)

    第09课:发布小程序

    点击查看课程全部内容

    展开全文
  • 64位,32位windows上的相同程序,运行效率到底区别有多大? 分别在对应的版本下编译并运行。
  • wd@2x.png", "clas": "#646D7E", "selectedColor": "#4A8CF5" } ] }, 在app.js中 onShow: function() { wx.hideTabBar() }, 如果不放心就在每个tabbar的页面的onshow方法中同样加上这行代码 ...

    话不多说,直接上代码解决问题

    自定义导航栏的时候会定义一个tabbar的页面,如下:(需求不一样代码不一样,大致效果是一样的)

    <view class="tabbar">
    		<view class="tabbar-item" @click="onChange(1)">
    				<image v-if="'pages/index/index' == curretnPage"   src="../../static/btn_gc@2x.png"></image>
    				<image v-else src="../../static/btn_gc1@2x.png"></image>
    				<view :class="'pages/index/index' == curretnPage ? 'tabbar-item-active' : ''">首页</view>
    		</view>
    		<view class="tabbar-item"  @click="onChange(2)">
    				<image v-if="'pages/recommend/recommend' == curretnPage"  src="../../static/btn_tj@2x.png"></image>
    				<image v-else src="../../static/btn_tj1@2x.png"></image>
    				<view :class=" 'pages/recommend/recommend' == curretnPage ? 'tabbar-item-active' : ''">推荐</view>
    		</view>
    		<view class="tabbar-item" @click="onChange(3)" >
    			<image class="tabbar-item-img" src="../../static/btn_fb@2x.png"></image>
    		</view>
    		<view class="tabbar-item" @click="onChange(4)">
    			<image v-if="'pages/message/message' == curretnPage"  src="../../static/btn_XX@2x.png"></image>
    			<image v-else src="../../static/btn_xx1@2x.png"></image>
    			<view :class=" 'pages/message/message' == curretnPage ? 'tabbar-item-active' : ''">消息</view>
    		</view>
    		<view class="tabbar-item" @click="onChange(5)">
    			<image v-if="'pages/center/center' == curretnPage"  src="../../static/btn_wd@2x.png"></image>
    			<image v-else src="../../static/btn_wd1@2x.png"></image>
    			<view :class=" 'pages/center/center' == curretnPage ? 'tabbar-item-active' : ''">我的</view>
    		</view>
    	</view>
    
    
    onChange(index){
    				if(index == 1){
    					wx.switchTab({
    						url:'../../pages/index/index'
    					})
    				}else if(index == 3){
    					this.$emit('releasePopup')
    				}else if(index == 2){
    					wx.switchTab({
    						url:'../../pages/recommend/recommend'
    					})
    				}else if(index == 5){
    					wx.switchTab({
    						url:'../../pages/center/center'
    					})
    				}else if(index == 4){
    					wx.switchTab({
    						url:'../../pages/message/message'
    					})
    				}
    			}
    

    在pages.json中定义tabbar

    "tabBar":{
    		"color": "#646D7E",
    		"selectedColor": "#4A8CF5",
    		"list":[
    			{
    				"pagePath": "pages/index/index",
    				"text": "首页",
    				"iconPath": "/static/btn_gc1@2x.png",
    				"selectedIconPath": "/static/btn_gc@2x.png",
    				"clas": "#646D7E",
    				"selectedColor": "#4A8CF5"
    			},
    			{
    				"pagePath": "pages/recommend/recommend",
    				 "text": "推荐",
    				 "iconPath": "/static/btn_tj1@2x.png",
    				 "selectedIconPath": "/static/btn_tj@2x.png",
    				 "clas": "#646D7E",
    				 "selectedColor": "#4A8CF5"
    			},
    			{
    				"pagePath": "pages/message/message",
    				 "text": "消息",
    				 "iconPath": "/static/btn_xx1@2x.png",
    				 "selectedIconPath": "/static/btn_XX@2x.png",
    				 "clas": "#646D7E",
    				 "selectedColor": "#4A8CF5"
    			},
    			{
    				"pagePath": "pages/center/center",
    				 "text": "我的",
    				 "iconPath": "/static/btn_wd1@2x.png",
    				 "selectedIconPath": "/static/btn_wd@2x.png",
    				 "clas": "#646D7E",
    				 "selectedColor": "#4A8CF5"
    			}
    		]
    	},
    

    在app.js中

    onShow: function() {
    			wx.hideTabBar()
    		},
    

    如果不放心就在每个tabbar的页面的onshow方法中同样加上这行代码

    这样就完美的解决了

    这里面关键的就是跳转的页面的方式是switchTab,但是你没有在pages.json中定义Page.josn里定义tabbar时是不会跳转的,所以必须在page.json里定义tabbar,然后在app.js里将tabbar隐藏掉

    在uniapp里面的时候也是一样的解决办法 就是把wx换成uni

    展开全文
  • Uniapp绘制海报终极解决方案(微信小程序同样适用) 文章目录Uniapp绘制海报终极解决方案(微信小程序同样适用)问题原因与分析解决方案完整代码 问题原因与分析 背景介绍 在微信小程序开发过程中,我们发现分享...

    Uniapp绘制海报终极解决方案(微信小程序同样适用)

    问题原因与分析

    背景介绍

    在微信小程序开发过程中,我们发现分享只能发送给好友,并没有“分享到朋友圈的功能”

    以下是任意小程序点开分享界面的截图

    在这里插入图片描述

    所以我们通常的做法是绘制一个带小程序二维码的海报,然后保存到本地图库

    最后引导用户把该张图片分享至朋友圈,朋友看到后扫码即可进入小程序

    以下是腾讯新闻小程序解决方案——绘制海报

    在这里插入图片描述

    在这里插入图片描述

    今天,我们就要实现将指定图片(网络路径)绘制成为海报并保存到用户本地的功能

    坐稳,我们现在出发:

    我们首先分析下程序中存在的难点痛点

    1. 网络图片需要做本地存储后才能开始绘画
    2. 【重点】网络存在不稳定性,如何保证绘画顺序和期望一致(因为uniapp对大部分接口都做了Promise封装)
    3. 绘制好的图片如何保存至用户本地
    4. 如何处理设备适配问题

    针对以上几点,画出设计思路图

    设计思路图示

    在这里插入图片描述

    解决方案

    万事俱备,撸起袖子开始编码!(以下为编码讲解,文末有完整代码)

    1. 首先编写模板代码

      <template>
      	<view class="content">
      		<canvas canvas-id="myCanvas"></canvas>
      		<button @click="generateImg">点我</button>
      	</view>
      </template>
      

      我们首先定义了一个id为myCanvas的画布,用于绘制我们的海报

    2. 设计绘图队列以及数据结构

      data() {
          return {
              drawQueue: //画图队列
              [
                  {
                      path: 'https://zftsw-oss.oss-cn-hangzhou.aliyuncs.com/5c354e4a710461580958674035.jpg',
                      x: 0,
                      y: 0,
                      width: 600,
                      height: 300,
                      type: 'image',
                  },
                  {
                      path: 'https://zftsw-oss.oss-cn-hangzhou.aliyuncs.com/tmp_cb726c3d5765754dc08ba01c6fa8fa522dff4b08c3aad6d4.jpg',
                      x: 520,
                      y: 20,
                      width: 60,
                      height: 60,
                      type: 'image',
                  },
                  {
                      text: '我是文章标题',
                      size: 32,
                      x: 50,
                      y: 365,
                      type: 'text',
                  },
                  {
                      text: '扫码关注我哟',
                      size: 24,
                      x: 300,
                      y: 365,
                      type: 'text',
                  },
      
              ],
              ctx: null, //画布上下文
              counter: -1, //计数器
              drawPathQueue: [], //画图路径队列
          }
      },computed: {
              myPx() {
                  return this.screenWidth / 750
              },
          }
      

      这里简单说一下:drawQueue为待绘制队列,其中path是图片网络路径,xy为坐标,type为区分是绘制图片还是文字,drawPathQueue为处理害的绘图队列,其中每个元素会以index标注绘制顺序

    3. 在App.vue应用加载时获取当前屏幕宽度(也可以使用uniapp内置api:upx2px)

      <script>
      	import Vue from 'vue'
      	export default {
      		onLaunch: function() {
      			console.log('App Launch')
      			uni.getSystemInfo({
      				success: (res)=> {
      					Vue.prototype.screenWidth = res.screenWidth
      				}
      			})
      		},
      		onShow: function() {
      			console.log('App Show')
      		},
      		onHide: function() {
      			console.log('App Hide')
      		}
      	}
      </script>
      
      <style>
      	/*每个页面公共css */
      </style>
      
    4. 在页面初始化时加载canvas实例

      onLoad() {
          this.ctx = uni.createCanvasContext('myCanvas', this)
      }
      
    5. 写两个监听器,分别监听处理后的队列生成进度和绘制进度

      watch: {
          drawPathQueue(newVal, oldVal) {
              /* 所有元素入队则开始绘制 */
              if (newVal.length === this.drawQueue.length) {
                  console.log('生成的队列:'+JSON.stringify(newVal));
                  console.log('开始绘制...')
                  for (let i = 0; i < this.drawPathQueue.length; i++) {
                      for (let j = 0; j < this.drawPathQueue.length; j++) {
                          let current = this.drawPathQueue[j]
                          /* 按顺序绘制 */
                          if (current.index === i) {
                              /* 文本绘制 */
                              if (current.type === 'text') {
                                  console.log('绘制文本:' + current.text);
                                  this.ctx.setFillStyle('#000')
                                  this.ctx.setFontSize(current.size * this.myPx)
                                  this.ctx.fillText(current.text, current.x * this.myPx, current.y * this.myPx)
                                  this.counter--
                              }
                              /* 图片绘制 */
                              if (current.type === 'image') {
                                  console.log('绘制图片:' + current.path);
                                  this.ctx.drawImage(current.path, current.x * this.myPx, current.y * this.myPx, current.width * this.myPx,
                                                     current.height * this.myPx)
                                  this.counter--
                              }
                          }
                      }
                  }
                  console.log('final counter', this.counter);
              }
          },
              counter(newVal, oldVal) {
                  if (newVal === 0) {
                      this.ctx.draw()
                      /* draw完不能立刻转存,需要等待一段时间 */
                      setTimeout(() => {
                          uni.canvasToTempFilePath({
                              canvasId: 'myCanvas',
                              success: (res) => {
                                  console.log('in canvasToTempFilePath');
                                  // 在H5平台下,tempFilePath 为 base64
                                  console.log('图片已保存至本地:', res.tempFilePath)
                                  uni.saveFile({
                                      tempFilePath: res.tempFilePath,
                                      success: function(res) {
                                          console.log('本地保存路径为',res.savedFilePath);
                                      }
                                  });
                              }
                          })
                      }, 1000)
                  }
              }
      },
      
    6. 最后添加生成点击事件

      generateImg() {
          this.counter = this.drawQueue.length
          this.drawPathQueue = []
          /* 将图片路径取出放入绘图队列 */
          for (let i = 0; i < this.drawQueue.length; i++) {
              let current = this.drawQueue[i]
              current.index = i
              /* 如果是文本直接放入队列 */
              if (current.type === 'text') {
                  this.drawPathQueue.push(current)
                  continue
              }
              /* 图片需获取本地缓存path放入队列 */
              uni.getImageInfo({
                  src: current.path,
                  success: (res) => {
                      current.path = res.path
                      this.drawPathQueue.push(current)
                  }
              })
          }
          /* 
      				setTimeout(()=>{
      					console.log(JSON.stringify(this.drawPathQueue));
      				},10000) */
      }
      
    7. 调整样式并测试

      <style lang="scss">
      	page {
      		.content {
      			canvas {
      				width: 600rpx;
      				height: 450rpx;
      				border: 1px solid black;
      				margin: 0 auto;
      			}
      		}
      	}
      </style>
      
    8. 效果图

      在这里插入图片描述

    在这里插入图片描述

    因为只是demo,图片没有认真找,随意放了几张图片,只要将队列中的图片换成自己想要的图片和小程序二维码即可

    完整代码

    以下是本示例index.vue下的完整代码

    <template>
    <view class="content">
        <canvas canvas-id="myCanvas"></canvas>
        <button @click="generateImg">点我</button>
        </view>
    </template>
    
    <script>
        export default {
            data() {
                return {
                    drawQueue: //画图队列
                    [
                        {
                            path: 'https://zftsw-oss.oss-cn-hangzhou.aliyuncs.com/5c354e4a710461580958674035.jpg',
                            x: 0,
                            y: 0,
                            width: 600,
                            height: 300,
                            type: 'image',
                        },
                        {
                            path: 'https://zftsw-oss.oss-cn-hangzhou.aliyuncs.com/tmp_cb726c3d5765754dc08ba01c6fa8fa522dff4b08c3aad6d4.jpg',
                            x: 520,
                            y: 20,
                            width: 60,
                            height: 60,
                            type: 'image',
                        },
                        {
                            text: '我是文章标题',
                            size: 32,
                            x: 50,
                            y: 365,
                            type: 'text',
                        },
                        {
                            text: '扫码关注我哟',
                            size: 24,
                            x: 300,
                            y: 365,
                            type: 'text',
                        },
    
                    ],
                    ctx: null, //画布上下文
                    counter: -1, //计数器
                    drawPathQueue: [], //画图路径队列
                }
            },
            computed: {
                myPx() {
                    return this.screenWidth / 750
                },
            },
            onLoad() {
                this.ctx = uni.createCanvasContext('myCanvas', this)
            },
            watch: {
                drawPathQueue(newVal, oldVal) {
                    /* 所有元素入队则开始绘制 */
                    if (newVal.length === this.drawQueue.length) {
                        console.log('生成的队列:'+JSON.stringify(newVal));
                        console.log('开始绘制...')
                        for (let i = 0; i < this.drawPathQueue.length; i++) {
                            for (let j = 0; j < this.drawPathQueue.length; j++) {
                                let current = this.drawPathQueue[j]
                                /* 按顺序绘制 */
                                if (current.index === i) {
                                    /* 文本绘制 */
                                    if (current.type === 'text') {
                                        console.log('绘制文本:' + current.text);
                                        this.ctx.setFillStyle('#000')
                                        this.ctx.setFontSize(current.size * this.myPx)
                                        this.ctx.fillText(current.text, current.x * this.myPx, current.y * this.myPx)
                                        this.counter--
                                    }
                                    /* 图片绘制 */
                                    if (current.type === 'image') {
                                        console.log('绘制图片:' + current.path);
                                        this.ctx.drawImage(current.path, current.x * this.myPx, current.y * this.myPx, current.width * this.myPx,
                                                           current.height * this.myPx)
                                        this.counter--
                                    }
                                }
                            }
                        }
                        console.log('final counter', this.counter);
                    }
                },
                counter(newVal, oldVal) {
                    if (newVal === 0) {
                        this.ctx.draw()
                        /* draw完不能立刻转存,需要等待一段时间 */
                        setTimeout(() => {
                            uni.canvasToTempFilePath({
                                canvasId: 'myCanvas',
                                success: (res) => {
                                    console.log('in canvasToTempFilePath');
                                    // 在H5平台下,tempFilePath 为 base64
                                    console.log('图片已保存至本地:', res.tempFilePath)
                                    uni.saveFile({
                                        tempFilePath: res.tempFilePath,
                                        success: function(res) {
                                            console.log('本地保存路径为',res.savedFilePath);
                                        }
                                    });
                                }
                            })
                        }, 1000)
                    }
                }
            },
            methods: {
                generateImg() {
                    this.counter = this.drawQueue.length
                    this.drawPathQueue = []
                    /* 将图片路径取出放入绘图队列 */
                    for (let i = 0; i < this.drawQueue.length; i++) {
                        let current = this.drawQueue[i]
                        current.index = i
                        /* 如果是文本直接放入队列 */
                        if (current.type === 'text') {
                            this.drawPathQueue.push(current)
                            continue
                        }
                        /* 图片需获取本地缓存path放入队列 */
                        uni.getImageInfo({
                            src: current.path,
                            success: (res) => {
                                current.path = res.path
                                this.drawPathQueue.push(current)
                            }
                        })
                    }
                    /* 
    				setTimeout(()=>{
    					console.log(JSON.stringify(this.drawPathQueue));
    				},10000) */
                }
            }
        }
    </script>
    
    <style lang="scss">
        page {
            .content {
                canvas {
                    width: 600rpx;
                    height: 450rpx;
                    border: 1px solid black;
                    margin: 0 auto;
                }
            }
        }
    </style>
    
    
    展开全文
  • 微信小程序如何测试?

    千次阅读 2022-03-07 10:02:22
    不需要安装,只要在微信里找到这个小程序打开即可使用,由于小程序的便捷,如今越来越多的平台开发方都纷纷推出自身的小程序应用。 那我们该如何进行微信小程序测试呢? 1、功能测试 功能测试以需求文档和...
  • 前端云原生——微信小程序云服务配置

    千次阅读 多人点赞 2022-05-02 15:39:00
    如今云原生已经非常火热,很多伙伴说我们前端领域涉及到云原生么?当然了!今天就来为大家介绍我们最直白的涉及到的云原生,就是我们微信小程序开发中的云函数云存储
  • 微信抽奖小程序怎么做怎么弄?微信抽奖小程序制作方法详细介绍 很多商家朋友不知道微信抽奖小程序怎么做怎么弄?下面小编详细的介绍一下微信抽奖小程序制作方法。 想要微信小程序上实现抽奖这个功能,就必须要编写小...
  • 今天碰到了个问题,就是我的sql语句在数据库查询的结果是空的,但是我吧语句赋值出来。直接去数据库查询确可以查询到数据 如下: ==> Preparing: SELECT top 300 Id, FullName,MethodName,Message FROM [dbo]....
  • 零基础入门微信小程序开发 (2020 版)

    万次阅读 多人点赞 2020-02-19 23:30:02
    就算你完全没有开发过微信小程序,甚至没有接触过小程序的相关技术(XML、JSON、JavaScript 等)也可以轻松入门! 涵盖开发全周期,助你尽快完成自己的小程序: 麻雀虽小,五脏俱全。专栏通过 9 篇文章覆盖从开发...
  • 《微信小程序开发文档》使用指南

    热门讨论 2016-11-30 18:56:36
    这份微信小程序开发者文档是微信公众平台官方团队发布,由W3Cschool编辑整理完成,方便开发者查阅学习,并添加拓展了《微信小程序设计规范》等相关知识,使该文档内容更加丰富。
  • 微信小程序使用lottie

    千次阅读 热门讨论 2019-10-22 23:32:48
    喜大普奔~~微信小程序官方已经宣布支持lottie了。 一、通过npm安装lottie npm install --save lottie-miniprogram 二、微信小程序npm构建 npm init npminit执行之后,一直按回车即可。 一直按回车,出现ok...
  • 程序 与 App 与 H5 之间的区别

    万次阅读 多人点赞 2018-11-21 11:35:18
    程序的实现原理 根据微信官方的说明,微信小程序的运行环境有 3 个平台,iOS 的 WebKit(苹果开源的浏览器内核),Android 的 X5 (QQ 浏览器内核),开发时用的 nw.js(C++ 实现的 web 转桌面应用)。 平台 ...
  • 如何快速开发一个自己的微信小程序

    万次阅读 多人点赞 2018-07-18 01:15:24
    1.为什么要学小程序开发? &nbsp; &nbsp; 对于前端开发而言,微信小程序因为其简单快速、开发成本低、用户流量巨大等特点,也就成了前端开发工程师必会的一个技能。 &nbsp; 2.先看看小程序效果 (1...
  • PC端浏览器如何访问微信小程序

    千次阅读 2022-04-02 14:58:18
    程序通过扫描二维码可以在手机浏览器打开,但用电脑浏览器访问同样的url却不能正常访问。 解决方案 通过F12打开 开发调试工具,点击toggle device toolbar(如下图)即可。 ====================================...
  • 微信小程序集成ESLint + Preitter

    万次阅读 2021-12-31 12:37:53
    当写React、Vue等大项目、或者使用框架搭建小程序时,为了便于多人协作开发,常常...对于原生小程序项目,或许不需要使用webpack等模块打包工具,但同样可以配置合适的ESlint规范和Preitter规范,来处理统一代码风格。
  • 前段使用的是wx.navigateToMiniProgram(Object object),方法,前期使用的时候功能是是正常的,突然昨天用户提出跳转到美团页面时出现白屏,神奇的时用户使用同样的小程序再去跳转到美团小程序时也是出现白屏,...
  • 微信小程序中实现人脸识别认证

    万次阅读 多人点赞 2021-01-03 21:56:29
    回顾2020年,最有意思的事情就是用微信小程序实现了人脸识别认证功能,期间也遇到一些问题。希望通过本文让大家了解在微信小程序中如何实现人脸识别认证功能以及如何解决遇到的问题。 一、开发准备 1、前提条件 目前...
  • 最近在写一个JavaWeb项目的时候遇到了一个问题就是,同样的sql语句在数据库中可以查询出结果,但是在程序中确无法查询出结果,今天给大家带来解决方案 如图所示,这是我在navicat中测试好的sql语句,但是在这里查询...
  • mPaaS 则是一整套的应用开发的解决方案(不仅限于小程序),涵盖了原生 App 开发、H5 开发、小程序开发的“一条龙”式的服务,同样的其对于 H5 的开发、小程序的开发也都有管理平台,可以进行 H5、小程序包的更新和...
  • 微信小程序用户登录和登录态维护

    万次阅读 多人点赞 2020-07-22 11:11:10
    让用户登录,标识用户和获取用户信息,以用户为核心提供服务,是大部分小程序都会做的事情。我们今天就来了解下在小程序中,如何做用户登录,以及如何去维护这个登录后的会话(Session)状态。 在微信小程序中,...
  • 文章目录《python语言程序设计基础》嵩天著-第4章程序部分练习题答案程序练习题 3.1 重量计算程序练习题 3.2 天天向上续篇1程序练习题 3.3 天天向上续篇2程序练习题 3.4 回文数判断程序练习题 3.5 田字格的输出实例4...
  • 用keil软件如何编写单片机程序

    千次阅读 2021-05-19 13:28:42
    在一些应用场合,人们不需要计算机完成十分复杂的运算,但却希望计算机...单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为CPU可以执行的机器码有两种方法,一种是手工汇编,另一种是机器...
  • 为此, 人们给计算机设计了一种特殊语言,这就是程序设计语言。程序设计语言是 一种形式语言。语言和基本单位是语句,而语句又是由确定的字符串和一些 用来组织它们成为有确定意义的组合规则所组成。程序设计语言是...
  • 微信小程序订阅消息失败

    千次阅读 2021-08-30 11:30:37
    之前测试微信小程序订阅消息都是正常的,并且支持开发工具的调试,但是同样的方法换到另一个页面通过表单提交触发就没有效果。调试之后发现报错信息,errMsg: "requestSubscribeMessage:fail can only be invoked by...
  • 用uni-app进行小程序的开发

    万次阅读 2020-10-10 20:10:10
    登录后找到设置模块,在这里你可以设置一些小程序的主题信息,比较重要的就是这个AppID(小程序ID),唯一的,相当于微信小程序的敲门砖 三、选框架,安装开发工具 工具安装: 微信开发者工具 HBuilderX 工具安装好...
  • 微信小程序的架构

    千次阅读 2019-12-27 17:56:18
    1、什么是小程序程序是介于web网页应用和原生应用的一种产物;小程序类web,但不是HTML5;即用即走,随手可得;拥有离线能力;基于微信跨平台。 2、小程序架构 (1)小程序主要模块构成 小程序自身分为两个主要...
  • 不知道大家有没有经常遇到这样的一个困扰,为什么同样的算法,你的程序却一直超时?大家用的都是暴力大法,为什么别人的能过所有数据,而你的却只能过前几个样例;同样都是使用dp,为什么你的比别人的慢了那么多,有...
  • 问题:搭建好的交叉编译宿主机,传入文件到开发板,运行段错误,但是之前同样程序编译出来传送是没问题的。      经过排插,是因为filezllla使用了文本传输,而不是二进制传输。 ...
  • 浅谈微信小程序的发展

    万次阅读 2020-05-06 17:24:56
    入门微信小程序的第一课: 很多人对微信小程序只是停留在使用的阶段,或者是停留在阅读文档和简单的开发阶段,实际上,作为一个开发者,你应该是对小程序有一个全面的了解,比如运营角度,开发角度,用户角度。那么...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,902,481
精华内容 760,992
关键字:

同样的程序