android scrollview 懒加载图片,详解性能更优越的小程序图片懒加载方式

news/2024/10/23 5:42:15/

意义

懒加载或者可以说是延迟加载,针对非首屏或者用户"看不到"的地方延迟加载,有利于页面首屏加载速度快、节约了流量,用户体验好

实现方式

传统H5的懒加载方式都是通过监听页面的scroll事件来实现的,结合viewport的高度来判断。

小程序也类似,通过监听页面onPageScroll事件获取当前滚动的数据,结合getSystemInfo获取设备信息来判断。由于scroll事件密集发生,计算量很大,经常会造成FPS降低、页面卡顿等问题。

这里说的是通过另外一种方式来实现

createIntersectionObserver

小程序基础库 1.9.3 开始支持,了解下

节点布局交叉状态API可用于监听两个或多个组件节点在布局位置上的相交状态。这一组API常常可以用于推断某些节点是否可以被用户看见、有多大比例可以被用户看见。

API涉及到的概念总共有5个

参照节点:监听的参照节点,取它的布局区域作为参照区域。如果有多个参照节点,则会取它们布局区域的 交集 作为参照区域。页面显示区域也可作为参照区域之一。

目标节点:监听的目标,默认只能是一个节点(使用 selectAll 选项时,可以同时监听多个节点)。

相交区域:目标节点的布局区域与参照区域的相交区域。

相交比例:相交区域占参照区域的比例。

阈值:相交比例如果达到阈值,则会触发监听器的回调函数。阈值可以有多个。

通过以上API和概念的了解,可以获取到图片是否可以被用户看见或者即将被看见,通过回调将图片加载显示出来,然后监听下一组即将被显示的图片,这样就可以达到懒加载图片的方式,以下是代码展示

//index.js

//获取应用实例

const app = getApp()

let lazyload;

Page({

data: {

classNote: 'item-', //循环节点前缀

count: 0, //总共加载到多少张

img: [] //图片列表

},

onReady: function () {

//可以先初始化首屏需要展示的图片

that.setData({

count: 5

})

//开始监听节点,注意需要在onReady才能监听,此时节点才渲染

lazyload.observe();

},

viewPort: function () {

const that = this;

var intersectionObserver = wx.createIntersectionObserver();

//这里bottom:100,是指显示区域以下 100px 时,就会触发回调函数。

intersectionObserver.relativeToViewport({bottom: 100}).observe(this.data.classNote + this.data.count, (res) => {

if(res.boundingClientRect.top > 0){

intersectionObserver.disconnect()

that.setData({

count: that.data.count + 5

})

that.viewPort();

}

})

}

})

//page.wxml

这里有2点需要注意的

监听的节点需要先渲染,也就是说监听这个动作需要在onReady的时候

上述示例监听是依赖循环节点的class,最少需要先渲染一个节点才能监听

每次监听完一个循环节点后,结束监听,然后继续监听下一个节点结果

0b14f821e9139c47b91fcaee261f5da6.gif

无论怎么快速滚动,FPS都能保持在60

总结

H5其实也有一个类似的API,小程序的使用方式跟H5也是很类似,有很多东西都可以参考。针对上述监听的方式,我这边简单封装了一个库来调用,欢迎star。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。


http://www.ppmy.cn/news/414546.html

相关文章

小程序基础

事件绑定 Page 中还可以定义组件事件处理函数。在渲染层的组件中加入事件绑定,当事件被触发时,就会执行 Page 中定义的事件处理函数。需要在事件中绑定此事件 示例:实时获取输入框数据并且可以点击加减来增加减少输入的数字 1 需要给inp…

损坏的二进制文件会导致“程序太大而无法放入内存”

不知道你是否做过这样的小实验:将一个可执行文件的头部写入一些无效的数据,或者将一个根本不是可执行文件的大型文件的扩展名改为”.exe”,然后执行它(警告,请记得先保存好工作文件)。 文件不会如预期般那样执行,你会…

给高考生选择IT相关专业的小tips

以下是针对高考生选择IT相关专业的一些小tips: 了解不同的 IT 相关专业:IT 相关专业涉及的领域很广泛,包括计算机科学、软件工程、网络工程、信息安全等等。在进行选择之前,需要了解不同专业所涉及的方向和课程设置。 看看未来的…

TencentOS Server编译安装nginx(1.22.0)

环境说明 TencentOS 3.1 一、准备工作 切换到root用户: sudo su安装: yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel二、下载nginx 创建nginx安装目录: mkdir -p /usr/local/nginx下载nginx最新稳定版本1.22&…

Spring Cloud Tencent和alibaba备忘

1 Spring Cloud Tencent简介 服务注册与发现 (Spring Cloud Tencent Polaris Discovery) 命名空间服务服务实例 配置中心 (Spring Cloud Tencent Polaris Config) NamespaceFileGroupFile 服务路由 (Spring Cloud Tencent Polaris Router) 元数据路由 业界最主流的做法就是上…

手机里tencent文件夹能删吗_华为手机中的文件夹代表什么,哪些可以删除,看完秒懂-tencent是什么文件夹...

常用华为手机的小伙伴都知道,华为手机里面自带的有文件管理功能,在文件管理功能里面有很多以英文命名的文件夹,因为这些文件夹都是以英文命名的,所以很多人都不知道这些文件夹代表什么意思。 在对手机进行内存清理的时候&#xff…

No module named ‘tencentcloud‘

No module named tencentcloud 安装SDK方式一通过Pip安装方式二 通过pycharm终端安装 安装SDK 方式一通过Pip安装 pip install --upgrade tencentcloud-sdk-python如果出现ERROR: No matching distribution found for tencentcloud: pip install --upgrade tence…

TencentOS tiny 代码目录说明

一级目录二级目录三级目录说明archarm TencentOS tiny适配的IP核架构(含M核中断、调度、tick相关代码)boardTencentOS_tiny_EVB_MX TencentOS tiny 定制开发板demo,包含AT适配框架、MQTT协议、安全组件等componentconnectivityloraWANloRaWAN…