搜尋
首頁微信小程式小程式開發分享一個本人的小程式開發心得

微信小程式也已經出來有一段時間了,最近寫了幾款微信小程式項目,今天來說說感受。

首先開發一款微信小程序,最主要的就是針對於公司來運營的,因為,在申請appid(微信小程序ID號)時候,需要填寫相關的公司認證資訊如,營業執照等等

再次就是用一個未曾開通過公眾號的QQ號或微訊號來註冊一個微信小程式號碼。

最後,下載微信小程式開發工具。

由於這裡,我們更多的關注如何去開發一些app,而不是科譜微信小程序,故在此不在過多的解釋,詳細的說明,可以去官網幫助文檔。

首先,我們拿自己的專案在一步一步的說明並開發吧,下面是一個微信app的截圖

 

在看到上圖,小夥伴們大致上有一個了解,這個是調試工具中的,一些效果沒有在真機上好看。

由於在開發中,本以為畫面不是很流利,實際上完全出乎我的意料,動畫效果很流暢,可以與ios,andriod app相媲美,以後有時間講講開發其它app的相關例子。

在介紹這篇文章前,假設使用者都已經看過微信小程式的相關文件。

這個項目基本上是按照微信原有的文件結構來的,並沒有額外的去添加特別多的文件結構,因為微信小程序規定,項目文件大小不能超過1M,要求我們盡可能的壓縮小程式程式碼或其它圖片檔案等,以下是微信app檔案結構整體截圖

1.app.js 主要是全域公共的js方法宣告及呼叫所在的文件

2.app.json 是小程式整個的設定文件,所以有的頁面都在要此註冊,不然不允許存取(如下圖所示)

3.app.wxss 是小程式全域的css文件,公共css寫在此最好不過的了

4.pages下是對應著所有頁面,每個頁面,可以添加四種類型的文件,.json,.wxss,.wxml,.js (如下圖所示)

#5.utils 是我們公共的js存放的地方,因為微信小程式要求,每個js文件裡的方法不可以直接引用或調用,必須用module.exports方法導出,這樣pages 下的.js檔案才可以調用到我們在此寫的js方法。這點特別要注意

1)app.json頁面設定及註冊:

##2)pages頁面結構:

 

下面我們開始詳細的講解每個頁面

一、首頁

首頁分為四個檔案組成,如下圖所示,具體的頁面功能,上面已說過。

 下面來看下,index.wxml效果

# 最上面的「來運吧」標題,在index.json檔案下定義的,每個檔案都可以用不同的.json來定義,當然程式碼也可以動態改變它

很簡單吧,標題就這麼簡單的出現了。

1)接下來看看橫向捲動的banner,

index.wxml這樣來描述

#那麼swiper是什麼東東呢?微信小程式幫助文件這樣說明的 swiper滑桿視圖容器

#屬性名稱類型#預設值 #說明indicator-dots#Booleanfalse是否顯示面板指示點autoplayBooleanfalse是否自動切換current
#################################################################################################################################################。 ###Number######0######目前所在頁面的index#############interval######Number######5000# #####自動切換時間間隔############duration######Number######500######滑動動畫時長##### #######circular######Boolean######false######是否採用銜接滑動###########bindchange###### #EventHandle###### ######current 改變時會觸發change 事件,event.detail = {current: current}############

注意:其中只可放置<swiper-item></swiper-item>元件,其他節點會自動刪除。

swiper-item

僅可放置在<swiper></swiper>元件中,寬高自動設定為100%。

 1 示例代码: 2  3 <swiper indicator-dots="{{indicatorDots}}" 4   autoplay="{{autoplay}}" interval="{{interval}}" duration="{{duration}}"> 5   <block wx:for="{{imgUrls}}"> 6     <swiper-item> 7       <image src="{{item}}" class="slide-image" width="355"    style="max-width:90%"/> 8     </swiper-item> 9   </block>10 </swiper>11 <button bindtap="changeIndicatorDots"> indicator-dots </button>12 <button bindtap="changeAutoplay"> autoplay </button>13 <slider bindchange="intervalChange" show-value min="500" max="2000"/> interval14 <slider bindchange="durationChange" show-value min="1000" max="10000"/> duration15 Page({16   data: {17     imgUrls: [18       &#39;http://img02.tooopen.com/images/20150928/tooopen_sy_143912755726.jpg&#39;,19       &#39;http://img06.tooopen.com/images/20160818/tooopen_sy_175866434296.jpg&#39;,20       &#39;http://img06.tooopen.com/images/20160818/tooopen_sy_175833047715.jpg&#39;21     ],22     indicatorDots: false,23     autoplay: false,24     interval: 5000,25     duration: 100026   },27   changeIndicatorDots: function(e) {28     this.setData({29       indicatorDots: !this.data.indicatorDots30     })31   },32   changeAutoplay: function(e) {33     this.setData({34       autoplay: !this.data.autoplay35     })36   },37   intervalChange: function(e) {38     this.setData({39       interval: e.detail.value40     })41   },42   durationChange: function(e) {43     this.setData({44       duration: e.detail.value45     })46   }47 })

View Code

#看了上面的官方文檔,就可以清楚的知道,這個就是我們類似在寫html裡用到的banner滑動插件一樣,拿過來就可以使用,多麼的方便。

我們的專案中同樣用參數綁定的方式,輸出的相關參數

參數定義在index.js pages({...})方法中

 為什麼要綁定參數?為什麼不直接寫入參數呢?好處太多,圖片我們不可能寫死,從伺服器請求圖片,同時可以方便的控制我們的相關參數來改變swiper的行為等。

至於參數綁定,官網說的也很清楚,這裡不在解釋。

2)城市選擇及切換

這塊看起來很簡單,其實很麻煩,如果對動畫不熟悉的朋友,可以會苦惱一番的。

上面的動畫很流暢,可能是因為抓取工具不太好,這點大可不用關心。

我們點擊中間的「交換圓」的時候,」出發城市「與」到達城市「相互交換,他們不是立即變化,而是中間有一個"位移"效果,同時,那個「交換的圓」也要旋轉180度。

這樣體驗感立刻"高上大"。呵呵,不是嗎?下面我們詳細的來實現它。

我們先來溫習下,官網動畫相關的文檔說明

wx.createAnimation(OBJECT)

建立一個動畫實例animation。呼叫實例的方法來描述動畫。最後透過動畫實例的export方法匯出動畫資料傳遞給元件的animation屬性。

注意: export 方法每次呼叫後會清除先前的動畫操作

OBJECT參數說明:

##參數類型必填說明duration否#否
Integer
動畫持續時間,單位ms,預設值400 timingFunction String
定義動畫的效果,預設值"linear",有效值:"linear","ease","ease-in","ease-in-out","ease-out"," step-start","step-end"

delay

#Integer#否##動畫延遲時間,單位ms,預設值0transformOriginString#否#設定transform-origin,預設為"50% 50% 0"
var animation = wx.createAnimation({
  transformOrigin: "50% 50%",
  duration: 1000,
  timingFunction: "ease",
  delay: 0})
動畫實例可以呼叫以下方法來描述動畫,呼叫結束後會傳回自身,支援鍊式呼叫的寫法。 方法參數#opacityvalue透明度,參數範圍0~1backgroundColorcolor顏色值widthlength長度值,如果傳入Number 則預設使用px,可傳入其他自訂單位的長度值heightlength長度值,如果傳入Number 則預設使用px,可傳入其他自訂單位的長度值
animation
樣式:
##說明
#########top######length######長度值,如果傳入Number 則預設使用px,可傳入其他自訂單位的長度值# ###########left######length######長度值,如果傳入Number 則預設使用px,可傳入其他自訂單位的長度值### #########bottom######length######長度值,若傳入Number 則預設使用px,可傳入其他自訂單位的長度值##### #######right######length######長度值,如果傳入Number 則預設使用px,可傳入其他自訂單位的長度值####### #####

旋轉:

方法 參數 #說明
rotate deg deg的範圍-180~180,從原點順時針旋轉一個deg角度
rotateX deg deg的範圍-180~180,在X軸旋轉一個deg角度
rotateY deg # deg的範圍-180~180,在Y軸旋轉一個deg角度
rotateZ deg deg的範圍-180~180,在Z軸旋轉一個deg角度
rotate3d (x,y,z,deg) 同transform-function rotate3d

縮放:

方法 說明
#scale sx,[sy] 一個參數時,表示在X軸、Y軸同時縮放sx倍數;兩個參數時表示在X軸縮放sx倍數,在Y軸縮放sy倍數
scaleX sx 在X軸縮放sx倍數
scaleY sy 在Y軸縮放sy倍數
scaleZ sz #在Z軸縮放sy倍數
scale3d #(sx,sy,sz) 在X軸縮放sx倍數,在Y軸縮放sy倍數,在Z軸縮放sz倍數

偏移:

##參數說明translatetx,[ty]一個參數時,表示在X軸偏移tx,單位px;兩個參數時,表示在X軸偏移tx,在Y軸偏移ty,單位px。 translateXtx在X軸偏移tx,單位pxtranslateYty在Y軸偏移tx,單位px#translateZtz#在Z軸偏移tx,單位pxtranslate3d(tx,ty,tz)在X軸偏移tx,在Y軸偏移ty ,在Z軸偏移tz,單位px
方法
傾斜:

#參數說明skew#ax,[ay]參數範圍-180~180;一個參數時,Y軸座標不變,X軸座標延順時針傾斜ax度;兩個參數時,分別在X軸傾斜ax度,在Y軸傾斜ay度skewXax參數範圍-180~180;Y軸​​座標不變,X軸座標延順時針傾斜ax度skewY ay參數範圍-180~180;X軸座標不變,Y軸座標延順時針傾斜ay度##矩陣變形:

方法matrix##matrix3d # 同transform-function matrix3d#

动画队列

调用动画操作方法后要调用 step() 来表示一组动画完成,可以在一组动画中调用任意多个动画方法,一组动画中的所有动画会同时开始,一组动画完成后才会进行下一组动画。step 可以传入一个跟 wx.createAnimation() 一样的配置参数用于指定当前组动画的配置。

示例:

 1 <view animation="{{animationData}}"   style="max-width:90%"></view> 2 Page({ 3   data: { 4     animationData: {} 5   }, 6   onShow: function(){ 7     var animation = wx.createAnimation({ 8       duration: 1000, 9         timingFunction: &#39;ease&#39;,10     })11 12     this.animation = animation13 14     animation.scale(2,2).rotate(45).step()15 16     this.setData({17       animationData:animation.export()18     })19 20     setTimeout(function() {21       animation.translate(30).step()22       this.setData({23         animationData:animation.export()24       })25     }.bind(this), 1000)26   },27   rotateAndScale: function () {28     // 旋转同时放大29     this.animation.rotate(45).scale(2, 2).step()30     this.setData({31       animationData: this.animation.export()32     })33   },34   rotateThenScale: function () {35     // 先旋转后放大36     this.animation.rotate(45).step()37     this.animation.scale(2, 2).step()38     this.setData({39       animationData: this.animation.export()40     })41   },42   rotateAndScaleThenTranslate: function () {43     // 先旋转同时放大,然后平移44     this.animation.rotate(45).scale(2, 2).step()45     this.animation.translate(100, 100).step({ duration: 1000 })46     this.setData({47       animationData: this.animation.export()48     })49   }50 })

View Code

这里我并不想一个一个的介绍官方的动画说明文档,因为写的很清楚了,而是我想说下一些关于动画的机制

不管是位移,缩放,旋转,可能都会涉及到三个轴,那就是x,y,z,轴,这三个轴大致这样的如下图

 

x轴是水平的,y轴在垂直方向上,而z轴,是"指向我们的方向"的一个轴,这点必须清楚,不然动画的很多东西,你就没办法理解了。

好了,我们再来回过头来看看官网的几个动画方法。

旋转:1.rotate(deg),2.rotateX(deg),3.rotateY(deg),4.rotateZ(deg),5.rotate3d(x,y,z,deg)

1.rotate表示以原点在顺时针旋转一个度数deg范围在-180~180

假如我们要让一个图片,顺时针旋转90度,以原点为中心

可能刚开始图片这样排列的如下图

 旋转后,由图A顺时针旋转90度至图B,它是在一个X与Y的平面上与Z轴成垂直90度来顺时针旋转的。

由上述可以看出,图片的左上角坐标是(x:0,y:0,z:0);而我们要旋转一个图片,一般不希望在左上角做为旋转点,最多的情况下,就是以图片的中心点为旋转点(x:50%,y:50%,z:0) z坐标是指向我们的坐标,就像css里的z-index一样,我们应该把它设为0,即使你设为任何一个数字,你的视角差也感不到任何不同,因为,图片的z轴是垂直我们视线的,故一般设置为0。

就像下面如图所示,可能是我们希望的旋转效果:

 不好意思呀,用QQ绘图工具绘制,可能效果不太好,但是大致的表达了这种示意图,

上图描述了,由图片A由中心点,旋转90度后的效果,那么如何初始化,让图片的原点由(x:0,y:0,z:0)更换为(x:50%,y:50%,z:0)呢?回过头来看下官网教程的wx.createAnimation(OBJECT)方法

其中属性transformOrigin 已说明,默认为图片的中心点,可能是作者的初衷也这么认为的,旋转应该以”元素“的中心点来操作应用比较多点,这是合情可理的

至此,我们旋转一个图片得了到大致的思路。其它的以X轴,Y轴,Z轴旋转与些类似,不在累述。

animation样式:

 

如何让一个元素从一个位置从A点移到B点呢?可能通过上述的样式属性在改变”元素“的top bottom left right 达到效果,

当然也可以通过其它动画方法来改变,如偏移 translate(x,y,z)。

通过top bottom left right 样式属性来实现动画,前提是,这个”元素“一定是相对定位或者绝对定位的,不然是不出效果的,这和写css里的position:absolute相同的原理。

如果要让一个元素或图片从A点平移至B点,就像下图所以示

假如初始A坐标为(x:10px,y:0px,z:0px)移至B点坐标(x:120px,y:0px,z:0px),那样我们只需改变元素的left或者right即可,

同理,可以用bottom,top来改变y坐标。

好了,到此为止,我们项目的所需动画可能要用到的效果都基本上有了思路。那么下面我们就来实现它。

首先,我们在”出发城市'与"到达城市"以及"旋转图片"定义如下:

 对应的wxml界面:

 

然后,我们为注意到在index.wxss(如下图)里给了绝对定位,目的就是想用left或right来动画交换城市

 

 

这里注意一点,animationsSourceCity初始化的时候,css里用了left, 动画时,必须用它的left来"位移",而不是right

不然会看不到效果,这点,在玩css3动画的时候,就遇到过。同理,下面的animationsDestCity只能用right来"位移"。

为什么有的朋友会想在初始化的时候用left可动画的时候想right的呢?可能考虑到元素的准确的定位原因,毕竟,精确的定位不是一件很容易的事情。 为什么这么说呢?因为考虑到app在其它屏上显示。

 

 

 从上面的截图可以看到,现实中的问题,中间这块,宽与高是用了px,就是说,我们不希望中间这个旋转按扭自适应不同的手机屏,而希望他能够保持不变。这个时候,如果我们仅仅用left来平移"出发城市"至"到达城市"的坐标处,可能不管你用px还是rpx或其它单位,都达不到精确定位了(为什么?)。

这个时候,换个角度来思考下,我们不需要让它精确的位移至“到达城市”,为什么这么说呢?在”出发城市“移至”到达城市“前的一点很短的时间内,我们让它在0s交换城市(也就是复位但文本内容已交换),因为0s互换城市文本内容,估计没有任何人可以发觉到的。这就需要一个“恰当的时间”。

好了,我们来看看代码:

定义三个动画:

 1     animation1 = wx.createAnimation({ 2           duration: 300, 3           timingFunction: &#39;linear&#39;, 4           transformOrigin: "50%,50%" 5         }) 6  7         this.setData({ 8           animationData: animation1.export() 9         })10 11          animation2 = wx.createAnimation({12           duration: 300,13           timingFunction: &#39;linear&#39;14         })15 16         this.setData({17           animationSourceCity: animation2.export()18         })19 20          animation3 = wx.createAnimation({21           duration: 300,22           timingFunction: &#39;linear&#39;23         })24 25         this.setData({26           animationDestCity: animation3.export()27         })

animation1是旋转图片的动画定义(初始化,具体的参数官网说的很清楚,不多说)。

animation2与animation3分别是”出发城市“与”到达城市“定义

下面我们先来说说animation2,animation3

animation2要完成的是从left ”出发城市“水平移动至”到达城市“坐标

我们看看点击旋转图片时事件:

 1 animation2.left(&#39;600rpx&#39;).step() 2         this.setData({ 3         animationSourceCity: animation2.export() 4       }) 5  6       setTimeout(function(){ 7         animation2.left(&#39;30rpx&#39;).step({duration: 0, transformOrigin: "50%,50%",timingFunction: &#39;linear&#39;}) 8         that.setData({ 9            animationSourceCity: animation2.export()10         })11       },285)12 13       animation3.right(&#39;580rpx&#39;).step()14         this.setData({15         animationDestCity: animation3.export()16       })17       18        setTimeout(function(){19         animation3.right(&#39;30rpx&#39;).step({duration: 0, transformOrigin: "50%,50%",timingFunction: &#39;linear&#39;})20         that.setData({21            animationDestCity: animation3.export()22         })23       },285)

我们来分析下上面的代码:

在初始化的时候,设置了动画完成时间duration:300ms,紧接着,点击图片开始水平移动600rpx

animation2.left(&#39;600rpx&#39;).step()
        this.setData({        animationSourceCity: animation2.export()      })

这个时候600rpx只是粗略的计算,并不是真正的精确定位,原因上面我们解释很清楚了,移动600rpx所需时间是300ms,紧接着,如果这样的结束的话,很可能位置会错位,所以我们要写一个"特殊的动画"setTimeout(function(){
<em>        animation2.left(&#39;30rpx&#39;).step({duration: 0, transformOrigin: "50%,50%",timingFunction: &#39;linear&#39;})        that.setData({            animationSourceCity: animation2.export()         })
    },285)<br/><br/>这个动画表示,在285ms后,将要在0s时间完成"复位",在0s时间,估计没有人会查觉得到,呵呵,复位的好处,太多了,如果不复位,意味,我们的元素真的交换了,那样事件也给交换了,给我们带来了<br/>太多的麻烦,<br/>而复位,可以让我们仅仅交换了”城市文本“而不是所有。哈哈~开心,只所以定义285ms,是给一个很短的机会,让人看不到复位的执行,毕竟上面的300ms的水平动画还没有执行完嘛<br/>而真正的换交在下面的一句话</em>
  var tempSourceCity=this.data.sourceCity      var tempDestCity=this.data.destCity      this.setData({
        sourceCity:tempDestCity,
        destCity:tempSourceCity
      })

同理,right也一样来现实,这里不多说了,有兴趣的可以尝试下。

下面我们来说说,交换按扭图片的旋转动画

如果在点击事件rotate里我们这样写入

animation1.rotate(180).step()     
     this.setData({
        animationData: animation1.export()
      })

恩,看起来不错,我们尝试的时候,第一旋转了,然后第二次,第三次。。。并没有旋转。啊呀,愁人的事情又来了。我会不尽的报怨,小程序呀,你的bug又来了。

其实你看官网给出的例子也是如此,旋转一下,再也不旋转了,除非你刷新下页面。

报怨归报怨,纳闷归纳闷,问题还要是解决的。

这是不是我们自己的问题呢?一万个为什么。。。

不是!还记得,在css3动画的时候,确实也这样,我来画图解释下为什么!

图一、旋转前:(注意A点的位置)

图二、旋转180度后(注意A的位置)

图二是点击旋转图片后,自己处于180度状态,此时,再次点击此旋转图片,意味着,让它再次从0度旋转到180度,可是我们的代码是

animation1.rotate(180).step()

 这行代码表示,让它在300ms(初始化创建的时间)内旋转到180度,而是此时已处理180度啦,你点击当然它不会再旋转了。它会不停报怨”我已在180度了呀,你还想怎么样?!...“

所以,此时,我们能不能直接再让旋转360度,那么它不就相对于180度后的状态又转了180度了吗?可是看看官网,旋转的范围是-180~180度,既使没有这么范围限制,那么我们也会折腾死,不是吗?每次都要180*2,180*3...,表示不服!

我想只要问题找到了,其实都很简单了,此时估计都有朋友想到了,就是直接让它归0度嘛,这个归0度的动画时间必须要短,不然就要让人看到了一个”倒旋转的过程“,哇,那多么的难看呀,OK,动画嘛,上面我们都有先例,0s复位到0度,你眼神再好,也查觉不到,嘿嘿。。。

完整的旋转代码如下:

 1 animation1.rotate(180).step() 2       3      this.setData({ 4         animationData: animation1.export() 5       }) 6         7       var that=this; 
 8       setTimeout(function(){ 9         animation1.rotate(0).step({duration: 0, transformOrigin: "50%,50%",timingFunction: &#39;linear&#39;})10         that.setData({11            animationData: animation1.export()12         })13       },300)

意思是,在点击时候,在300ms内旋转180度,同时在300ms后执行一个在0s时间完成新的动画让它复位至0度,下次点击时,它就再次可以旋转了!

animation1.rotate(0).step({duration: 0, transformOrigin: "50%,50%",timingFunction: &#39;linear&#39;})
//归0度”复位“

上面的思想并不难,就是有时候不好发现,或者说,没接触过动画的朋友,一时半时找不出问题所在,写在此,尽可能的让大家少走弯路。

好了,这部分的动画就全部完成了,下面我们还有首页的上下不间断滚动、类似苹果手机ios app的滑动、删除效果,以及https api(基于asp.net mvc)的搭建、交互等等,期待着我们一个一个的解决呢,这些我准备将在后面的文章陆陆续续的写出,敬请关注,谢谢。 

參數 #說明
(a,b,c,d,tx,ty) 同transform-function matrix

以上是分享一個本人的小程式開發心得的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器