vivo官方技术团队 发表于 2020-7-17 17:14:49

快应用实现滑动刷屏

本帖最后由 vivo官方技术团队 于 2020-7-20 14:48 编辑

背景
考虑到部分短视频快应用的开发者,需要实现滑动刷屏的效果,这里使用快应用的list组件,简单实现一个仿抖音的滑动刷屏demo,可供感兴趣的同学参考。
<template>
<tabs class="wrap" index='1'>
    <tab-bar class="title">
      <text class="nav">关注</text>
      <text class="nav">推荐</text>
    </tab-bar>
    <tab-content>
      <div class="video-item"><text>关注</text></div>
      <list @scroll="scroll" id="list">
      <block for="list">
          <list-item @appear="appear($idx)" class="video-item" type="video">
            <video autoplay="true" src="{{$item.src}}" controls="false"></video>
            <div class="mask" id="mask{{$idx}}">
            <text class="name">{{$item.name}}</text>
            <text class="desc">{{$item.desc}}</text>
            </div>
          </list-item>
      </block>
      </list>
    </tab-content>
</tabs>
</template>
主要思路及关键代码
1.list-item的appear事件,判断下一个list-item的出现时机,定义变量currentIndex来存放当前出现的list-item的index;
appear(index) {
    this.currentIndex = index
}

2.使用list的scroll事件,判断用户滑动屏幕时的状态。返回的参数stateValue有下列三种状态:

[*]0: list 停止滑动
[*]1: list 正在通过用户的手势滑动
[*]2: list 正在滑动,用户已松手


3.当stateValue为2或0时,获取list元素并调用scrollTo方法,让当前list-item直接展示到当前页
scroll(e) {
   if (e.scrollState === 2 || e.scrollState === 0) {
       this.$element('list').scrollTo({ index: this.currentIndex , smooth: true })
   }
}

效果展示


测试用的在线视频地址参考:https://www.jianshu.com/p/34ce7f9b469a





脚本侠 发表于 2020-7-17 17:53:56

最近想开发一个瀑布流展示图片的快应用,楼主可以也提供一个简单demo吗?

脚本侠 发表于 2020-7-17 17:54:57

最近想开发一个瀑布流展示图片的快应用,楼主可以也提供一个简单demo吗?

vivo官方技术团队 发表于 2020-7-17 18:14:25

脚本侠 发表于 2020-7-17 17:54
最近想开发一个瀑布流展示图片的快应用,楼主可以也提供一个简单demo吗?

可以的

vivo官方技术团队 发表于 2021-4-6 11:59:30

补充解决滑动视频时,视频不播放的问题,给video加上id,调用start方法播放视频:
<video id="video-{{$idx}}" autoplay="true" src="{{$item.src}}" controls="false"></video>

appear(index) {
this.currentIndex = index
this.$element(`video-${index}`).start()
}

参考快应用官方文档-video

vivo官方技术团队 发表于 2021-4-7 18:38:44

补充【设置延时滚动】避免快速滚动时,一次滚动过多item

1.定义一个变量控制延时:
data:{
timeFlag:false
}
2.在视频【连接成功】和【播放失败】时,设置延时滚动:
timeoutHandler() {   
this.timeFlag = false
setTimeout(() => {      
this.timeFlag= true   
}, 1000);
}
3.在appear事件里判断是否要滚动到下一个video,若timeFlag为true,则改变当前index为next index:
appear(index) {   
if (this.timeOut) {      
this.currentIndex = index      this.$element(`video-${index}`).start()   
}
}


参考 快应用官方文档-video-事件

daiwei 发表于 2023-8-23 10:36:57

视频向下滑动一半然后又向上滑,按理说应该还是原视频,这个bug有啥思路不
页: [1]
查看完整版本: 快应用实现滑动刷屏