08-自然壁纸实战教程-视频列表-云

08-自然壁纸实战教程-视频列表

前言

视频列表页面本质上也是一个数据展示的列表,不同之处在于之前是是展示壁纸,Image组件负责渲染,这里展示的是视频,使用Video组件,另外视频页面也实现了下载的基本功能,由于视频往往比图片要大,所以这里的下载是比较耗时的,因此使用了多线程技术taskpool实现了视频的下载,并且保存到相册。

image-20250701081028571

视频搜索

image-20250701081116823

这个模块其实是老模块了,这里直接提供代码

  // 顶部搜索栏Row() {TextInput({ placeholder: '搜索视频...', text: $$this.videoViewModel.searchText }).width('80%').height(40).backgroundColor('#F5F5F5').borderRadius(20).padding({ left: 15, right: 15 }).onChange((text) => {this.videoViewModel.params.q = text}).onSubmit(async () => {await this.videoViewModel.search()})Button('搜索').width('18%').height(40).margin({ left: 8 }).borderRadius(20).backgroundColor('#3366CC').onClick(async () => {await this.videoViewModel.search()})}.width('100%').padding(10).margin({ top: 6 })

视频分类

image-20250701081239094

视频分类页面也是一个常规的分类滚动结构,可以出用Scroll组件完成基本结构

  Row() {Text('类型:').fontSize(16).fontWeight(FontWeight.Medium).margin({ right: 10 })// 使用Scroll实现横向滚动Scroll() {Row() {// 使用categories数据源ForEach(LocalData.CategoryData, (item: ICategory) => {Button({ type: ButtonType.Capsule }) {Text(item.text).fontSize(16).fontColor(this.videoViewModel.selectedCategory === item.value ? '#FFFFFF' : '#333333').padding({ left: 5, right: 5 })}.backgroundColor(this.videoViewModel.selectedCategory === item.value ? '#3366CC' : '#F0F0F0').margin({ right: 12 }).height(40).width('auto').padding({ left: 15, right: 15 }).onClick(() => {this.videoViewModel.selectCategory(item.value)})})}.width('auto')}.scrollable(ScrollDirection.Horizontal).scrollBar(BarState.Off).width('80%').layoutWeight(1)}.width('100%').padding({ left: 10, right: 10, bottom: 10 }).alignItems(VerticalAlign.Center)

LocalData.CategoryData 数据源

  static readonly CategoryData: ICategory[] = [{"id": 0,"text": "背景","value": "backgrounds","icon": "🌅"},{"id": 1,"text": "时尚","value": "fashion","icon": "👔"},{"id": 2,"text": "自然","value": "nature","icon": "🌲"},{"id": 3,"text": "科学","value": "science","icon": "🔬"},{"id": 4,"text": "教育","value": "education","icon": "📚"},{"id": 5,"text": "感情","value": "feelings","icon": "❤️"},{"id": 6,"text": "健康","value": "health","icon": "🏥"},{"id": 7,"text": "人","value": "people","icon": "👥"},{"id": 8,"text": "宗教","value": "religion","icon": "🙏"},{"id": 9,"text": "地方","value": "places","icon": "🌆"},{"id": 10,"text": "动物","value": "animals","icon": "🐱"},{"id": 11,"text": "工业","value": "industry","icon": "🏭"},{"id": 12,"text": "计算机","value": "computer","icon": "💻"},{"id": 13,"text": "食品","value": "food","icon": "🍜"},{"id": 14,"text": "体育","value": "sports","icon": "🏃"},{"id": 15,"text": "交通","value": "transportation","icon": "🚗"},{"id": 16,"text": "旅行","value": "travel","icon": "✈️"},{"id": 17,"text": "建筑物","value": "buildings","icon": "🏢"},{"id": 18,"text": "商业","value": "business","icon": "💼"},{"id": 19,"text": "音乐","value": "music","icon": "🎵"}]

视频列表

image-20250701081326639

这里是视频列表,我们发送请求获取到视频数据后,使用 LazyForEach 结合 List 实现的视频列表渲染

      // 视频列表if (this.videoViewModel.videoList.totalCount() > 0) {List() {LazyForEach(this.videoViewModel.videoList, (video: VideoData, index: number) => {ListItem() {Column() {// 视频缩略图Stack() {Image(video.videos?.medium?.thumbnail || '').width('100%').height(200).borderRadius(8).objectFit(ImageFit.Cover)// 播放时长if (video.duration) {Text(CommonUtils.formatDuration(video.duration)).fontSize(12).fontColor($r('sys.color.comp_background_list_card')).backgroundColor('rgba(0, 0, 0, 0.6)').borderRadius(4).padding({left: 6,right: 6,top: 2,bottom: 2})}}.width('100%').alignContent(Alignment.BottomEnd)// 视频信息Row() {Column() {Text(video.tags.split(',')[0] || '未知标题').fontSize(16).fontWeight(FontWeight.Bold).margin({ top: 8, bottom: 4 }).maxLines(1).textOverflow({ overflow: TextOverflow.Ellipsis })Row() {Text(`${video.views || 0} 次观看`).fontSize(12).fontColor('#666666')Text(`${video.likes || 0}`).fontSize(12).fontColor('#666666').margin({ left: 10 })}}.alignItems(HorizontalAlign.Start).layoutWeight(1)}.width('100%').padding({left: 4,right: 4,top: 4,bottom: 8})}.width('100%').borderRadius(8).backgroundColor($r('sys.color.comp_background_list_card')).margin({ bottom: 12 })}.onAppear(() => {if (index == (this.videoViewModel.videoList.totalCount() - 5)) {this.videoViewModel.loadMore()}}).onClick(() => {NavigationUtils.getInstance().navigatePush(NavigationConst.Video_Player_View, video)})}, (video: VideoData, index: number) => video.id.toString())}.width('100%').layoutWeight(1).padding({ left: 10, right: 10 }).cachedCount(10)}

视频详情

视频详情是通过点击视频卡片,然后通过Navigation跳转实现的

 NavigationUtils.getInstance().navigatePush(NavigationConst.Video_Player_View, video)

关于我们

关于青蓝逐码组织

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88882.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88882.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SCI特刊征稿

我们团队联合北京工业大学研究团队在SCI源刊CMC组织了特刊SI: Advanced Edge Computing and Artificial Intelligence in Smart Environment,主要收录边缘计算和人工智能方向的文章,欢迎领域专家和学者投稿,网址https://www.techscience.com/cmc/special…

DO,VO,DTO.....

在 Java 项目里(尤其是 Spring、MyBatis 这类框架),经常会看到一堆以 O 结尾的类:VO、DO、DTO、BO、POJO……它们本质上都是普通的 Java Bean(即 POJO),但职责和出现的位置不同。下面用“用户下…

数据结构之并查集和LRUCache

系列文章目录 数据结构之ArrayList_arraylist o(1) o(n)-CSDN博客 数据结构之LinkedList-CSDN博客 数据结构之栈_栈有什么方法-CSDN博客 数据结构之队列-CSDN博客 数据结构之二叉树-CSDN博客 数据结构之优先级队列-CSDN博客 常见的排序方法-CSDN博客 数据结构之Map和Se…

UE5多人MOBA+GAS 21、给升龙添加连段攻击,从角色的按下事件中传递事件给GA

文章目录给升龙制作可连段缓存下一连段用普攻键来触发升龙后续的连段在角色中发送按下普攻标签事件在升龙中接收按下事件,触发连段以及伤害和力量的传递最后在蓝图中设置一下升龙技能的完整代码给升龙制作可连段 给升龙技能添加一些连段 缓存下一连段 缓存下一连…

基于光栅传感器+FPGA+ARM的测量控制解决方案

基于光栅传感器结合FPGA与ARM的测量控制解决方案,通过硬件协同分工实现高精度、实时性及多场景适应性:⚙️ ‌一、系统架构分工‌‌传感层(光栅传感器)‌采用光栅尺输出正交脉冲信号,分辨率达0.5μm,精度1μ…

NW831NW910美光固态闪存NW887NW888

美光固态闪存深度解析:NW831、NW910、NW887、NW888系列全方位评测一、技术根基与架构创新美光NW系列固态闪存的技术突破源于其先进的G9 NAND架构,该架构采用5纳米制程工艺和多层3D堆叠技术,在单位面积内实现了高达256层的存储单元堆叠&#x…

reasense api 文档

API 架构 英特尔实感(Intel RealSense™)API 提供对深度摄像头流数据的配置、控制和访问功能。该 API 支持通过高层级 API 快速启用摄像头基础功能,或通过底层级 API 全面控制所有摄像头设置。请根据需求选择合适的 API: 高层级 P…

ArkTs实现骰子布局

Entry Component struct workA {// 定义6种颜色数组,使用ResourceColor类型确保颜色值合法性State color: ResourceColor[] [#ef2816, #f0a200, #6ab002, #005868, #41192e, #141411]// 定义公共样式装饰器,避免重复样式代码Stylesys() {// 白色圆形基础…

c语言内存函数以及数据在内存中的存储

代码见:登录 - Gitee.com 1. memcpy使用和模拟实现 strcpy,strncpy是拷贝字符串的,有局限性 函数原型: void * memcpy ( void * destination, const void * source, size_t num ); 功能: memcpy 是完成内存块拷⻉的…

Codeforces Round 787 (Div. 3)(A,B,C,D,E,F,G)

Codeforces Round 787 (Div. 3) - Codeforces A. Food for Animals 题意 有a袋狗粮,b袋猫粮,c袋通用粮食,问现在有x只狗y只猫,每一个动物都要吃一袋粮食,问粮食够不够吃 思路 首先肯定考虑猫吃猫粮,狗吃狗粮。然后再考虑如果不够吃的话才会去吃通用…

LLaMA-Factory的webui快速入门

一、webui的启动方式 LLaMA-Factory 支持通过 WebUI 零代码微调大语言模型。 在完成安装 后,您可以通过以下指令进入 WebUI: llamafactory-cli webui 使用上面命令启动服务后,即可使用默认7860端口进行访问。访问地址:http://ip:7860,截止…

【第四节】ubuntu server安装docker

首先更新软件源 sudo apt update sudo apt upgrade安装docker 下载 Docker 官方 GPG 密钥 # 1. 下载 Docker 官方 GPG 密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg再次更新软件源…

Kubernetes的微服务

用控制器来完成集群的工作负载,那么应用如何暴漏出去?需要通过微服务暴漏出去后才能被访问Service是一组提供相同服务的Pod对外开放的接口。借助Service,应用可以实现服务发现和负载均衡。service默认只支持4层负载均衡能力,没有7…

退出登录后头像还在?这个缓存问题坑过多少前端!

目录 1. 为什么退出登录后头像还在? ① 缓存没清理干净 ② 头像URL没更新 ③ 后端会话失效,但静态资源可访问 2. 怎么解决?5种常见方案 ✅ 方案1:强制刷新页面(简单粗暴) ✅ 方案2:给头像…

Windows下白嫖ClaudeCode

我的邀请链接:https://anyrouter.top/register?afffMJn 我的邀请链接:https://anyrouter.top/register?afffMJn 我的邀请链接:https://anyrouter.top/register?afffMJn 兄弟们,交个朋友啊!一定要用我的呀&#xff0…

windows在anaconda中下载安装fasttext

windows在anaconda中下载安装fasttext 1.访问fasttext-wheel,点击对应链接,下载对应Python版本、操作系统类型 的.whl文件: 链接地址:https://pypi.org/project/fasttext-wheel/#files 打开anaconda终端,切换到上面的…

mysql5.7系列-索引下推(cover_index)

什么是索引下推 ICP(Index Condition Pushdown)是在MySQL 5.6版本上推出的查询优化策略,把本来由Server层做的索引条件检查下推给存储引擎层来做,以降低回表和访问存储引擎的次数,提高查询效率。 回顾下mysql的架构分…

计算机网络(基础概念)

计算机网络(基础概念)1 初识协议1.1 协议分层2 OSI七层模型2.1 物理层2.2 数据链路层2.3 网络层2.4 传输层2.5 应用层3 TCP/IP协议族3.1 什么是TCP/IP协议?3.1.1 OS与网络关系4 网络传输的基本流程4.1 局域网4.2 MAC地址5 跨网络传输5.1 IP地址6 Socket…

专题 JavaScript 函数基础

你将知道:函数声明和表达式函数声明和表达式之间的区别什么是匿名函数什么是 IIFE命名函数表达式this 关键字函数是调用该函数时执行的代码块 。函数声明和表达式让我们回顾一下它的语法:functionfunctionName(param1, param2, ..., paramN) {// Functio…

数据结构——优先队列(priority_queue)的巧妙运用

优先队列是一种相对高级的数据结构,它的底层原理是二叉堆。然而本篇不会执着于深挖其背后的原理,更主要的是理一下它在题目中的一些实用方法,帮助你更快的上手使用。 优先队列(priority_queue) 优先队列的特别之处就在于它可以自动进行排序&…