1. 程式人生 > >【微信小程式】動畫實現字幕滾動

【微信小程式】動畫實現字幕滾動

需求:

實現框內的文字自下而上的自動迴圈滾動。

解決方案:

第一種方法:

經查詢,最一開始實現字幕滾動是使用的微信小程式的swiper元件,後來發現,使用swiper元件實現的效果類似於輪播圖,不符合需求。

<swiper class="swiper_container" vertical="true" autoplay="true" circular="true" interval="2000">
  <view class='list'>
    <view wx:for="{{List}}" wx:key="index">
      <swiper-item>
        <text class='txt-light'>{{item.checkTime}}</text> {{item.content}}
      </swiper-item>
    </view>
  </view>
</swiper>

第二種方法:

使用微信小程式的動畫來來實現字幕滾動。

思路:

1.當list底部到container框的頂部時,即,內容全部走出了框外。結束字幕滾動,重新開始下一輪的滾動。

2.計算container框的高度list的高度。一個框中的內容顯示時長為 1500(暫定),通過list的高度除以container框的高度來判斷顯示時長(求整數並加1(+1是為了顯示最後一個空白框))。

實現:

wxml

<view class="container">
  <view class='list' animation="{{animationData}}">
    <view>
      <text class="txt-light">09:08</text> 很多人的一生,基本都是自己跟別人較勁,比如別人對自己的期待,比如把別人看得太重把自己看得太輕。其實一個人最應該考慮的問題是,自己如何與自己相處,比如人去樓空的時候如何照顧好自己的孤獨,比如夜深人靜的時候如何跟心靈溝通。自己跟自己能和諧共處,自己跟別人就能相安無事。
    </view>
    <view>
      <text class="txt-light">19:08</text> 平和是待人處事的一種態度,也是做人酌一種美德。平和既是一種修養,又是一種工作方法。平和的人,從不被忙碌所縈繞,閒時吃緊,忙裡悠閒。待人不嚴,教人勿高。寬嚴得宜,分寸得體。身心自在,能享受生活之樂趣。平和的人生,是和諧的人生,健康的人生。
    </view>
  </view>
</view>

wxss

.container {
   background-color: #ccc;
  height:150rpx;
   margin: 20rpx 20rpx 20rpx 20rpx; 
  overflow:auto;
}
.txt-light {
  color:#acadbe;
}

js

Page({

  /**
   * 頁面的初始資料
   */
  data: {
  
  },

  /**
   * 生命週期函式--監聽頁面載入
   */
  onLoad: function (options) {
  
  },

  /**
   * 生命週期函式--監聽頁面初次渲染完成
   */
  onReady: function () {
  
  },

  /**
   * 生命週期函式--監聽頁面顯示
   */
  onShow: function () {
    // this.util();
    this.getHeight();
  },
  util: function (obj) {
    console.log(obj);
    console.log(-obj.list);
    var continueTime = (parseInt(obj.list / obj.container) + 1) * 1500;
    var setIntervalTime = 50 + continueTime;

    var animation = wx.createAnimation({
      duration: 200,  //動畫時長
      timingFunction: "linear", //線性
      delay: 0  //0則不延遲
    });
    this.animation = animation;
    animation.translateY(obj.container).step({ duration: 50, timingFunction: 'step-start' }).translateY(-obj.list).step({ duration: continueTime });
    this.setData({
      animationData: animation.export()
    })
     setInterval(() => {
       animation.translateY(obj.container).step({ duration: 50, timingFunction: 'step-start' }).translateY(-obj.list).step({ duration: continueTime });
      this.setData({
        animationData: animation.export()
      })
     }, setIntervalTime)
    // setInterval(() => {
    //   animation.translateY(50).step({ duration: 50, timingFunction: 'step-start' }).translateY(-250).step({ duration: 5000 });
    //   this.setData({
    //     animationData: animation.export()
    //   })
    // }, 6000)
  },
  getHeight() {
    var obj = new Object();
    //建立節點選擇器
    var query = wx.createSelectorQuery();
    query.select('.container').boundingClientRect()
    query.select('.list').boundingClientRect()
    query.exec((res) => {
      obj.container = res[0].height; // 框的height
      obj.list = res[1].height; // list的height
      // return obj;
      this.util(obj);
    })
  }
})

20180712更新:

1.框設定為禁止滑動,即

.container {
  overflow: hidden;
}

防止手動滑動動畫,從而影響setinterval的執行。

2.設定setinterval的執行時間>動畫執行時間,防止setinterval執行卡頓。