免费国产欧美国日产_少妇AV一区二区三区无码_蜜桃精品av无码喷奶水小说_jk18禁网站视频_精产国品一二三级产品区别_被夫の上司に犯波多野结衣_78m成人手机免费看_最爽最刺激18禁视频_偷偷色噜狠狠狠狠的777米奇

易優(yōu)GEO 重磅上線 ~ 一站式GEO優(yōu)化工具,讓豆包、文心一言、DeepSeek 在回答中主動推薦你的品牌,搶占AI流量入口!  點擊查看

小程序模板網(wǎng)

github精選:實戰(zhàn)教程:搖出微笑,animation,搖一搖

發(fā)布時間:2017-11-27 17:30 所屬欄目:小程序開發(fā)教程

搖出微笑是一款功能非常簡潔的小程序,非常適合用來作為新手入門的第一個實戰(zhàn)項目。主要涉及到的功能有:小程序動畫接口 ...

 
 
 

介紹

搖出微笑是一款功能非常簡潔的小程序,非常適合用來作為新手入門的第一個實戰(zhàn)項目。

主要涉及到的功能有:

  • 小程序動畫接口 wx.createAnimation,
  • 搖一搖,基于 重力感應(yīng)接口( wx.onAccelerometerChange )實現(xiàn)
  • 列表渲染
  • 其他

結(jié)構(gòu)

  • 首頁
  • 列表
  • 個人

首頁

首頁涉及兩部分主要功能,一個是動畫,一個是用搖一搖的功能。
在這里就說一說實現(xiàn)思路,有興趣的同學(xué)可以去看源代碼,這樣比較直觀。

動畫

動畫是使用微信提供的 wx.createAnimation 接口來實現(xiàn)的,也是想了解一下這個動畫接口的完善度。

通過觀察渲染出來的Wxml文件,可以發(fā)現(xiàn) wx.craeteAnimation 設(shè)置的一些動畫方法會在 view 標簽中多處來的 style 中體現(xiàn)出來。

大概說一下實現(xiàn)首頁動畫的思路吧

由于三個框的旋轉(zhuǎn)角度不一樣,所以我創(chuàng)建了三個動畫實例

var createAnimation = function() {
  return wx.createAnimation({
    duration: 400,
    timingFunction: 'ease-out',
    transformOrigin: "0% 0%",
  })
}

var animationItem0 = createAnimation()
var animationItem1 = createAnimation()
var animationItem2 = createAnimation()

然后用 AnimationData0 ,AnimationData1,AnimationData2 來分別存儲 動畫數(shù)據(jù),用 arrAnimation 來存儲這是三個 動畫數(shù)據(jù)。

Page({
	data: {
	  AnimationData0: {},
	  AnimationData1: {},
	  AnimationData2: {},
	  arrAnimation: [],
	  ...
	},
	...
})

setAnimationData: function() {

  this.setData({
    AnimationData0: animationItem0.export(),
    AnimationData1: animationItem1.export(),
    AnimationData2: animationItem2.export()
  })

  var data1 = this.data.AnimationData0 
  var data2 = this.data.AnimationData1
  var data3 = this.data.AnimationData2
  
  var arr = [data1, data2, data3]

  this.setData({arrAnimation: arr})
}

考慮到 Wxml 我是用 for循環(huán) 渲染出來的(其實也許直接用三個 view 實現(xiàn)邏輯會更簡單),所以就需要動態(tài)綁定每一個元素的ID,這樣才能知道哪個框是哪個動畫,點擊的又是哪個框。

<view  catchtouchend = "touchEnd">
  <block wx:for="{{filterTips}}" wx:key="{{index}}">
    <view id="item_{{index}}" 
        animation="{{arrAnimation[index]}}"
        data-index="{{index}}"
        class="item  {{activeIndex == index ? 'touched' : 'untouched'  }} " >
      {{item.text}}
    </view>
  </block>
</view>

搖一搖

至于搖一搖功能,因為微信沒有提供具體的搖一搖接口,但是提供了重力感應(yīng)接口 wx.onAccelerometerChange,我們?nèi)绻胍褂脫u一搖功能,就得基于此來實現(xiàn)。

關(guān)于重力感應(yīng)有個問題就是,官方?jīng)]有提供停止監(jiān)聽重力感覺的接口,所以會導(dǎo)致一個情況就是:用戶在其他頁面時,重力感應(yīng)依然在監(jiān)聽。一個不怎么好的解決方案時利用 頁面生命周期的 onHide ()函數(shù)。

通過這種方式,起碼用戶不會在其他頁面觸發(fā)搖一搖功能。

onHide: function() {
  //當前頁面處于onHide狀態(tài)
  this.setData({onHide: true})
},

wx.onAccelerometerChange((res) => {
  if(this.data.onHide === true) {
    return
  }
}

關(guān)于搖一搖的實現(xiàn),其本質(zhì)無非就是記錄一段時間內(nèi),重力感應(yīng)返回的三個方向的值變化有多大,如果超過某個閥值,則認為用戶觸發(fā)了搖一搖事件。

wx.onAccelerometerChange((res) => { 

  if(this.data.onHide === true) {
    return
  }
  var currentTime = new Date().getTime()
  var SHAKE_THRESHOLD = app.globalData.sensitivity;
  var lastUpdate = this.data.lastUpdate
  if ((currentTime - lastUpdate) > 100) {
    var diffTime = currentTime - lastUpdate;
    var speed = Math.abs(res.x + res.y + res.z - this.data.lastX - this.data.lastY - this.data.lastZ) / diffTime * 10000;

    if(speed > SHAKE_THRESHOLD && tag) {
      tag = false
      //用戶搖一搖后的代碼邏輯
      //...
      setTimeout(() => {
        tag = true;
      }, 800)
    }
  }
  this.setData({
    lastX: res.x,
    lastY: res.y,
    lastZ: res.z,
    lastUpdate: currentTime   
  })
})

列表

作為列表頁,主要涉及的就是 列表渲染,可滾動視圖區(qū)域(scroll-view),上拉加載更多。

在 scroll-view 中 無法觸發(fā) onPullDownRefresh,也就是不支持下拉刷新。

若要使用下拉刷新,請使用頁面的滾動,而不是 scroll-view ,這樣也能通過點擊頂部狀態(tài)欄回到頁面頂部

這里涉及到一個思想,就是一個函數(shù)盡量做一件事。

具體來說,比如獲取列表的網(wǎng)絡(luò)請求我們就封裝成一個函數(shù),然后因為請求資源列表時涉及到 per(一頁多少個) 和 page(第幾頁) 參數(shù),所以我們可以把 per 和 page 的值放在 data 中。

這樣就有一個好處。比如實現(xiàn)加載更多這個功能的時候,只需要把 page + 1,然后再去獲取資源列表就可以了。

看代碼

loadMore: function() {
  this.setData({page: this.data.page + 1})
  this.getList()
},

getList: function() {

  var page = this.data.page;
  var per = this.data.per;


  wx.request({
    url: 'https://xxxxx.com/',
    data: {
      page: page,
      per: per
    },
    method: 'GET',
    success: (res) => {
      this.setData({listLi: this.data.listLi.concat(res.data)})
    }
  })
},

wxml的內(nèi)容就很簡單了,主要用到了微信提供的 列表渲染 功能

<view>
  <view>
    <scroll-view class="scroll" scroll-top="{{scrollTop}}" style="height:{{windowHeight}}px;" scroll-y="true" bindscroll="bindScrollHandel"   bindscrolltolower="loadMore">
      <view class="block" wx:for="{{listLi}}" wx:key="{{index}}" >
        <text>{{item.text}}</text>
      </view>    
    </scroll-view>
  </view>
  <view class="top" hidden="{{hiddenIcon}}" catchtap="goTop">?</view>
</view>

個人

個人頁面在獲取用戶信息的時候用到了回調(diào)函數(shù),就重點說一下這個吧。

先看 app.js 這段代碼。

定義 getUserInfo 函數(shù),該函數(shù)接受一個 回調(diào)函數(shù) 作為參數(shù),邏輯是:如果 globalData 中有 userInfo 的值,就把該 userInfo 的值作為參數(shù)給這個回調(diào)函數(shù),反之,則調(diào)用 wx.login 和 wx.getUserInfo 獲取 userInfo,然后 賦值給 globalData.userInfo,并同樣的作為參數(shù)給這個回調(diào)函數(shù)。

getUserInfo: function(cb){
  var that = this
  if(this.globalData.userInfo){
    typeof cb == "function" && cb(this.globalData.userInfo)
  }else{
    //調(diào)用登錄接口
    wx.login({
      success: function (res) {
        wx.getUserInfo({
          success: function (res) {
            that.globalData.userInfo = res.userInfo
            typeof cb == "function" && cb(that.globalData.userInfo)
          }
        })
      }
    })
  }
},

個人頁面,調(diào)用 getUserInfo()以一個函數(shù)作為參數(shù),然后該函數(shù)的參數(shù)就有 userInfo 的值

onLoad: function () {
  var that = this
  //調(diào)用應(yīng)用實例的方法獲取全局數(shù)據(jù)
  app.getUserInfo(function(userInfo){
    //更新數(shù)據(jù)
    that.setData({
      userInfo:userInfo
    })
  })
}

想一想,如果用戶是第一次使用,那么 globalData 中肯定沒有 userInfo 的值,這時候會從微信服務(wù)器中獲取,而如果 globalData 中 userInfo的值,那么就不從服務(wù)器中獲取,直接從globalData中取值即可。

后記

這是我第一次寫教程,個人感覺寫的并不是很好,一方面是因為沒有寫教程的經(jīng)驗,另一方面則是因為真的很忙,所以在這里跟大家說一說抱歉!然后附上這個小程序的源碼地址

如果你看了代碼后覺得有什么地方想找我探討的,可以來問我,我非常樂意跟你交流。

如果你看了代碼后愿意給我一些好的批評或者建議,我會非常開心。

源碼地址:https://github.com/wardenger/shakeTips(歡迎點star)

源碼下載:shakeTips-master.zip



易優(yōu)小程序(企業(yè)版)+靈活api+前后代碼開源 碼云倉庫:starfork
本文地址:http://www.szcjxy.com/wxmini/doc/course/17951.html 復(fù)制鏈接 如需定制請聯(lián)系易優(yōu)客服咨詢: 點擊咨詢
在線客服