1. 程式人生 > >《React-Native系列》21、 解決RN在Android下不支援gif問題

《React-Native系列》21、 解決RN在Android下不支援gif問題

由於RN在Android平臺上不支援gif格式的圖片,今天介紹下我們是怎麼處理這個問題的。

先來看看我們需要實現的效果,這是一張gif圖片,當我們列表上拉載入下一頁的時候需要使用這個效果,如下圖:


我們的解決方案是:將gif切成15張png的圖片,暫且命名為loading1、loading2.... loading15

然後迴圈的setState修改圖片,就像看電影一樣,達到動畫的效果。

1、在構造方法中初始化圖片陣列

//圖片陣列
var loading_imgs = new Array();
//最大圖片張數
const imageLength = 15;
//動畫使用的陣列下標
const imageIndex = 0;


  constructor(props) {
      super(props);
      this.state = {
          dataSource: new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2,}),	
          ….
          imageIndex:imageIndex,
      };
      
//組裝圖片陣列   共15張圖片  loading1  -> loading15
      for( i=1;i<= imageLength;i++){
        let loadingUri = "loading" + i;
        let img = <Image source={{uri:loadingUri}} key={i} style={{width:20,height:20}}/>;
        loading_imgs.push(img);
      }
  }

2、預載入圖片陣列

為什麼要預載入?

剛開始我們做的時候,也沒有預載入,只是在構造方法中定義了圖片陣列loading_imgs,但是在真機上看的時候,發現圖片播放的時候第一次會很卡頓,這是因為圖片載入到記憶體需要時間,當我們輪播圖片的時候圖片還沒有載入完畢,在視覺上造成卡頓的效果。

我們是把圖片陣列初始化在螢幕外面(絕對定位),這種方式不太好。

  render() {
    return (
        <View style={styles.container}>
            <View style={{position:'absolute', top:-1000}}>
              {
                loading_imgs.map((item,i)=> loading_imgs[i])
              }
            </View>
       </View>
  )};

3、輪播圖片

定義圖片輪播函式_loop

每隔100毫秒切換一張圖片

當資料載入完畢,清楚定時任務,並且將圖片置為第一張

 圖片輪播函式
  _loop() {
    this.loopCount++;
    if (this.loopCount < loading_imgs.length) {
        this.setState({
            imageIndex: this.loopCount,
        });
    }else {
        this.loopCount = -1;
    }
}

//輪播圖片
this.timerPic = setInterval(this._loop.bind(this), 100);

//清除圖片輪播效果
this.timer1 && clearInterval(this.timer1);
this.loopCount = -1;

這樣我們就實現上gif的效果。

在我們做的過程中也發現了一個RN的元件ActivityIndicator的bug,

<ActivityIndicator
                animating={true}
                size="small"
              />

當我們給ActivityIndicator設定color的時候,在錘子手機上預設color是灰色,當設定為red時,動畫效果沒有。

在meizu手機上,預設是綠色,設定為red時,效果正常。

在Android平臺上,RN的坑不是一點點啊。