第一个weex任务:图片显示改为串行

2017-03-19  本文已影响543人  勇往直前888

问题

公司接入weex大概也有半年多的时间了,sdk的版本是0.6.4,自定义的组件一大堆。不过image这个组件一直没有自定义。
我们的应用有一个“发现”页面,全部是图片,用weex写的。交互抱怨图片加载后,乱显示的,体验很不好,希望一张一张有顺序地显示。
weex提供的image组件,图片下载要自己实现,demo程序是用SDWebImage做的,所以这边也是依样画葫芦。SDWebImage是用NSOperationQueue实现,默认并发数为3,是并行加载的,要求图片顺序显示,怎么可能?
所以,这个问题从去年底就提出来了,一直没人去管,并且还记下来一个坑:
目前图片加载顺序, 异步随机

方案1:Native层自定义组件

方案2:通过opacity属性,串行显示图片

<template>
    <list>
        <cell class="cell">
            <image class="image" repeat="item in imageList" src="{{item.filePath}}" style="opacity:{{opacitys[$index]}}" onload="imageLoad($index)">                        
            </image>
        </cell>
    </list>
</template>

<style>
    .cell {
        height: 212px;
        flex-direction: row;
        justify-content: space-between;
        align-items: stretch;
        padding-top: 30px;
        padding-left: 24px;
        padding-right: 24px;
    }

    .image {
        width: 223px;
    }
</style>

<script >
    module.exports = {
        data: {
            imageList: [],
            loadFlags:[],
            opacitys:[]
        },
        created: function(){    
            this.onrefresh();
        },
        methods: {
            onrefresh: function(){
                this.displayRefreshing = 'show';
                this.refreshing = true;

                let stream = require("@weex-module/stream");
                var modal = require('@weex-module/modal');
                let self = this;
                stream.fetch({
                    url: "/app/image",
                    indicator: "silent",
                }, function(ret) { 
                    self.refreshing = false;
                    self.displayRefreshing = 'hide';
                    self.imageList = ret.imageList;

                    // 只是添加新的元素,旧的元素不更改。函数onrefresh()可能被反复调用,只要第一次将opacity由0变1,不反复更改
                    var startIndex = self.loadFlags.length;
                    for (var i = startIndex; i < ret.imageList.length; i++) {
                        self.loadFlags[i] = false;
                        self.opacitys.$set(i, 0);
                    }

                    // 设定超时保护(30秒),图片全部显示
                    setTimeout(function() {
                        self.dispalyAllImages()
                    }, 30000);

                }, function(err){
                    self.refreshing = false;
                    self.displayRefreshing = 'hide';
                    modal.toast({'message': '网络不给力,请稍后再试!', 'duration': 2});
                }
                );
            },
            imageLoad: function(index) {
                this.loadFlags[index] = true;
                this.updateImageOpacity();
            },
            updateImageOpacity: function() {
                // 图片顺序展示
                for (var i = 0; i < this.commonLoadFlags.length; i++) {
                    // 还没加载,就不显示; 要求顺序,后面的就不管了
                    if (false == this.commonLoadFlags[i]) {
                        break;
                    }
                    // 如果已经显示,就没必要重复设置
                    if (this.opacitys[i] > 0) {
                        continue;
                    }

                    this.opacitys.$set(i, 1);
                }
            },
            // 超时函数;加载状态不更新;但是显示状态全部设置为显示
            dispalyAllImages: function() {
                for (var i = 0; i < this.opacitys.length; i++) {
                    // 如果已经显示,就没必要重复设置
                    if (this.opacitys[i] > 0) {
                        continue;
                    }
                    this.opacitys.$set(i, 1);
                }
            }
        }
    }
</script>
  • imageList: [], 存放图片的信息,比如url就是其中的filePath属性
上一篇下一篇

猜你喜欢

热点阅读