溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

在小程序中如何實(shí)現(xiàn)3d裸眼輪播效果

發(fā)布時(shí)間:2022-01-12 18:07:47 來源:億速云 閱讀:182 作者:柒染 欄目:移動開發(fā)

小編今天帶大家了解在小程序中如何實(shí)現(xiàn)3d裸眼輪播效果,文中知識點(diǎn)介紹的非常詳細(xì)。覺得有幫助的朋友可以跟著小編一起瀏覽文章的內(nèi)容,希望能夠幫助更多想解決這個(gè)問題的朋友找到問題的答案,下面跟著小編一起深入學(xué)習(xí)“在小程序中如何實(shí)現(xiàn)3d裸眼輪播效果”的知識吧。

小程序輪播如何實(shí)現(xiàn)3d裸眼效果?下面本篇文章來給大家介紹一下實(shí)現(xiàn)方法,為春節(jié)氣氛添燈加彩,希望對大家有所幫助!

原理

仔細(xì)觀察上面實(shí)現(xiàn)的動態(tài)效果圖,可以看出該banner圖并非常規(guī)的一張圖片,而是采用了一張圖內(nèi)容分層的方式疊加顯示(上文提及的文章有提到,是采用了背景層,前景和中景三個(gè)疊加后呈現(xiàn),可以先移步上文了解),然后監(jiān)聽手機(jī)方向傳感器,根據(jù)方向?qū)η熬昂捅尘斑M(jìn)行移動,造成視覺上的景深效果。

有趣的是,如果你使用的是iPhone手機(jī),相信你應(yīng)該能發(fā)現(xiàn)在首頁狀態(tài)下,隨著手機(jī)不同方向的轉(zhuǎn)動,背景圖會跟著反方向輕微移動,也能給人一種類似的景深效果。

實(shí)戰(zhàn)

翻閱小程序文檔,我們需要用到兩個(gè)API:wx.startDeviceMotionListening 和 wx.onDeviceMotionChange。 這里我們需要重點(diǎn)關(guān)注的是wx.onDeviceMotionChange這個(gè)API返回的內(nèi)容,根據(jù)文檔,該API返回如下三個(gè)值:

如果你是第一次接觸這個(gè)API,相信你看了文檔也是一頭霧水,接下來我將用chrome瀏覽器調(diào)試工具幫你徹底理解這三個(gè)值分別是什么意思。

借助chrome開發(fā)者工具理解API返回值

打開瀏覽器開發(fā)者工具,打開傳感器進(jìn)行調(diào)試

顯示的三個(gè)值剛好與該API返回值對應(yīng)??梢钥吹皆赼lpha=0,beta=90,gamma=0的情況下,代表手機(jī)是垂直立在平面,我門可以點(diǎn)擊選項(xiàng)或者直接在輸入框中修改值,就可以直觀的看到隨著值的變化。

有了上面實(shí)時(shí)模擬的工具:

  • alpha:表示設(shè)備沿 Z 軸旋轉(zhuǎn)的角度,范圍為 0~360;

  • beta:表示設(shè)備在x軸上的旋轉(zhuǎn)角度,范圍為-180~180。它描述的是設(shè)備由前向后旋轉(zhuǎn)的情況;

  • gamma:表示設(shè)備在y軸上的旋轉(zhuǎn)角度,范圍為-90~90。它描述的是設(shè)備由左向右旋轉(zhuǎn)的情況。

代碼

wxml:

<view class="swiper-box">
  <image src="{{item}}" wx:for="{{background}}" class="swiper-bg {{animationStart || current === index ? 'fadeIn' : 'fadeOut'}} "></image>
  <swiper indicator-dots="{{true}}" indicator-active-color="#fff" interval="{{3000}}" autoplay="{{true}}" circular="{{true}}" bindchange="handleChange" bindtransition="handleTransition" bindanimationfinish="handleFinish">
    <block wx:for="{{background}}" wx:key="*this">
      <swiper-item>
        <view class="swiper-item-content" >
          <image class="icon" src="../../images/cloud.png"  style="width: 90px; height: 90px;transform: translate3d({{x}}px, {{y}}px, {{z}}px);" wx:if="{{index === 0}}"></image>
          <image class="icon" src="../../images/firecrackers.png" style="width: 90px; height: 90px;transform: translate3d({{x}}px, {{y}}px, {{z}}px);" wx:else></image>
          <text class="text" wx:if="{{index === 0}}">新年快樂</text>
          <text class="text" wx:else>大吉大利</text>
        </view>
      </swiper-item>
    </block>
  </swiper>
</view>

這里注意的是,由于swiper只能嵌套swiper-item組件,所以需要將背景圖放置于swiper同級,并用定位的方式顯示

js:

// index.js
// 獲取應(yīng)用實(shí)例
const app = getApp()

Page({
  data: {
    background: ['https://cloud-minapp-39237.cloud.ifanrusercontent.com/1n6jtVIbbJ3rnAv7.jpg', 'https://cloud-minapp-39237.cloud.ifanrusercontent.com/1n6mBOvOutOFQ3E8.png',],
    x: 0,
    y: 0,
    z: 0,
    animationFinish: true, // 動畫是否執(zhí)行完成
    animationStart: false, // 是否開始執(zhí)行動畫
    current: 0,
  },
  // 動畫開始執(zhí)行
  handleTransition(e) {
    if (this.data.animationFinish) {
      this.setData({
        animationFinish: false,
        animationStart: true,
      })
    }
  },
  // 動畫執(zhí)行結(jié)束
  handleFinish() {
    this.setData({
      animationFinish: true,
      animationStart: false,
    })
  },
  // current值變化
  handleChange(e) {
    this.setData({
      current: e.detail.current,
    })
  },
  onLoad() {

    const that = this;
    // 監(jiān)聽方向變化
    wx.startDeviceMotionListening({
      success() {
        wx.onDeviceMotionChange(function (res) {
          const {
            alpha, // 0-360
            beta, // -180-180
            gamma // -90- 90
          } = res
       
          const disX = gamma / 90 * 20 
          const disY = beta / 90 * 12
          let z = 0
          if (disX > 0 || disY > 0) {
            z = 20
          } else {
            z = -20
          }
          that.setData({
            x: disX,
            y: disY,
            z
          })
        })
      }
    })
  }
})

這里要做解釋的代碼是

const disY = beta / 90 * 12

正常我們使用手機(jī)是屏幕朝上,所以取相對值一半即可。 根據(jù)計(jì)算得到的偏移x,y后,頁面通過transform: translate3d()改變元素偏移距離。

最終實(shí)現(xiàn)效果

在小程序中如何實(shí)現(xiàn)3d裸眼輪播效果

這里看起來效果不是特別明顯,原因有兩個(gè):

  • 素材圖是我網(wǎng)上找到拼湊而成,總體合成效果并不美觀,想達(dá)到較逼真的效果需要設(shè)計(jì)配合出素材圖;

  • 在偏移至最大值時(shí),未做緩沖動畫,不合符直覺(這里后面有時(shí)間再研究實(shí)現(xiàn));

額外的動畫效果

其實(shí)借助該方向API,我們還可以作為觸發(fā)動畫的觸發(fā)器。例如在手機(jī)翻轉(zhuǎn)到一定角度值時(shí),我們可以播放煙花效果

安裝lottie-miniprogram包

npm i lottie-miniprogram

安裝完之后記得在微信開發(fā)者工具中點(diǎn)擊構(gòu)建npm包

wxml:

<canvas id="canvas" type="2d" style="position: absolute;top: 0;left: 0;width: 300px; height: 200px;z-index: 99;"></canvas>

js:

  onLoad() {
    // 初始化lottie動畫
    wx.createSelectorQuery().select('#canvas').node(res => {
      const canvas = res.node
      const context = canvas.getContext('2d')
      lottie.setup(canvas)
      lottieInstance = lottie.loadAnimation({
        path: 'https://assets10.lottiefiles.com/packages/lf20_1qfekvox.json',
        autoplay: true,
        loop: false,
        rendererSettings:{
          context
        }
      })
    }).exec()
  }

然后在wx.onDeviceMotionChange中調(diào)用

lottieInstance.play()

處理觸發(fā)即可

感謝大家的閱讀,以上就是“在小程序中如何實(shí)現(xiàn)3d裸眼輪播效果”的全部內(nèi)容了,學(xué)會的朋友趕緊操作起來吧。相信億速云小編一定會給大家?guī)砀鼉?yōu)質(zhì)的文章。謝謝大家對億速云網(wǎng)站的支持!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI