鸿蒙Next开发实战教程—电影app

news/2025/2/25 13:28:49/文章来源:https://www.cnblogs.com/youlanjihua/p/18565453

最近忙忙活活写了不少教程,但是总感觉千篇一律,没什么意思,大家如果有感兴趣的项目可以私信给幽蓝君写一写。

今天分享一个电影App。

图片

这个项目也比较简单,主要是一些简单页面的开发和本地视频的播放以及横竖屏切换。

页面搭建以首页为例,很明显这是一个List页面,不过每一个部分都可以左右滑动,顶部banner部分是支持翻页的,所以使用Swiper组件实现,其他部分均使用Scroll组件实现。相关代码如下:

build() {  List(){    ListItem(){      Swiper(){        Image($r('app.media.headimg'))          .width('100%')          .height(380)          .objectFit(ImageFit.Fill)          .onClick(()=>{            router.pushUrl({              url:'pages/Info'            })          })      }    }    ListItemGroup({header:this.ListHeader('分类',false)}){      ListItem(){        Scroll(){          Row(){            ForEach(this.types,(str:string,index)=>{              Text(str)                .fontSize(15)                .fontColor(Color.White)                .padding({top:8,bottom:8,left:22,right:22})                .borderRadius(15)                .backgroundColor(this.currentType == index ? '#6152FF':'rgb(6,4,31)')                .onClick(()=>{                  router.pushUrl({                    url:'pages/MovieList'                  })                })            })          }        }        .scrollable(ScrollDirection.Horizontal)        .scrollBar(BarState.Off)        .width('100%')      }    }    .padding({left:12,right:12})    ListItemGroup({header:this.ListHeader('最受欢迎',true)}){      ListItem(){        Scroll(){          Row({space:10}){            ForEach(this.popularMovies,(img:Resource,index)=>{              Image(img)                .width(124)                .height(180)                .objectFit(ImageFit.Contain)                .borderRadius(10)                .onClick(()=>{                  router.pushUrl({                    url:'pages/Info'                  })                })            })          }        }        .scrollable(ScrollDirection.Horizontal)        .scrollBar(BarState.Off)        .width('100%')      }    }    .padding({left:12,right:12})    ListItemGroup({header:this.ListHeader('最新电影',true)}){      ListItem(){        Scroll(){          Row({space:10}){            ForEach(this.popularMovies,(img:Resource,index)=>{              Image(img)                .width(124)                .height(180)                .objectFit(ImageFit.Contain)                .borderRadius(10)                .onClick(()=>{                  router.pushUrl({                    url:'pages/Info'                  })                })            })          }        }        .scrollable(ScrollDirection.Horizontal)        .scrollBar(BarState.Off)        .width('100%')      }    }    .padding({left:12,right:12})  }  .width('100%')  .height('100%')  .backgroundColor('rgb(6,4,31)')}@Builder ListHeader(title:string,isRight:boolean){  Row(){    Text(title)      .fontColor(Color.White)      .fontSize(15)    if(isRight){      Text('查看全部')        .fontColor(Color.White)        .fontSize(11)    }  }  .alignItems(VerticalAlign.Center)  .width('100%')  .height(40)  .justifyContent(FlexAlign.SpaceBetween)  .onClick(()=>{    router.pushUrl({      url:'pages/MovieList'    })  })}

页面开发就说这么多,下面进入视频处理部分,这里使用的本地视频,首先把视频文件拖进rawfile文件夹中,然后使用video组件播放视频:

Video({  src: $rawfile('movie.mp4'),  controller: this.controller})  
.width('100%')  
.height(this.isLandscapeStart?'100%':this.screen_width * 9 / 16)  
.autoPlay(true)  
.controls(false)  
.objectFit(ImageFit.Cover)  
.loop(false)

Video组件提供了工具栏和全屏方法,不过效果不好,非常丑陋,实际项目中我们通常需要自定义工具栏,全屏也通过设置组件的宽高尺寸来实现,我这里就简单添加一个全屏按钮,下面演示一下如何对视频进行横竖屏切换。

设置横屏,也就是全屏模式的步骤分别是先获取到当前窗口,然后将状态栏、导航栏隐藏,再将窗口横屏,相关代码如下:

changeOrientation() {  // 获取UIAbility实例的上下文信息  let context = getContext(this);  // 调用该接口手动改变设备横竖屏状态(设置全屏模式,先强制横屏,再加上传感器模式)  window.getLastWindow(context).then((lastWindow) => {    if (this.isLandscapeStart) {      // 设置窗口的布局是否为沉浸式布局      lastWindow.setWindowLayoutFullScreen(true).then(() => {        // 设置窗口全屏模式时导航栏、状态栏的可见模式        lastWindow.setWindowSystemBarEnable([]);        // 设置窗口的显示方向属性,AUTO_ROTATION_LANDSCAPE表示传感器自动横向旋转模式        lastWindow.setPreferredOrientation(window.Orientation.AUTO_ROTATION_LANDSCAPE, () => {          this.isLandscape = !this.isLandscape;        });      });    } });}

退出全屏时将上面代码反向操作就行了。

大家可以发送‘电影项目’获取本项目源码。

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

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

相关文章

担心360度评估结果隐私泄露怎么办?

当场惊呆!我们有个客户企业的hr反馈,公司内有领导的360评估结果分数比较垃垮。然后向下属施加淫威,从他们手里强制夺去手机看下面人给他的打分情况,毫无底线和节操。 古有邹忌讽齐王纳谏,今有360度评估,面对下属的反馈建议亦或批评,是打击报复还是接受批评与自我批评,…

.NET9 - 新功能体验(三)

.NET9和C#13引入Linq新方法CountBy和AggregateBy、序列化加强、Task.WhenEach方法、TimeSpan新重载、内置Swagger替换为Scalar,提升开发效率和代码可读性。书接上回,我们继续来聊聊.NET9和C#13带来的新变化。01、Linq新方法 CountBy 和 AggregateBy 引入了新的方法 CountBy 和…

用星球助手下载帖子的手把手教程

当我们想要把星球里的帖子和附件下载到本地电脑上慢慢学习时, 一篇一篇下载太麻烦了, 耗时且无聊. 用星球助手就非常方便啦. 打开软件后, 就是这样的界面.点击"新增", 输入星球名字和网页链接. 就像这样.最后, 就是点击"启动"开启一键下载了.帖子, 图片, 附…

通过学习先验增强基于流的生成超分辨率模型

通过学习先验增强基于流的生成超分辨率模型基于流的超分辨率(SR)模型在生成高质量图像方面表现出了惊人的能力。然而,这些方法在图像生成过程中遇到了一些挑战,例如网格伪影、爆炸反转以及由于采样温度不稳定而导致的次优结果。为了克服这些问题,这项工作在基于流的SR模型…

读数据质量管理:数据可靠性与数据质量问题解决之道13数据沿袭

数据沿袭1. 数据沿袭 1.1. MyDoom的病毒 1.2. 现在,许多团队甚至整个公司都在使用数据,这要求数据管理的方式要更便于合作,同时也更不容许发生错误 1.3. 从采用dbt和Apache Airflow等开源工具来实现数据转换和编排,到使用Snowflake和Databricks等云端数据仓库和数据湖 1.4.…

【开源系列】insightlake:免费使用的商业化数据安全平台

什么是 InsightLake 数据安全? 如今,企业将大量数据存储在数据湖和数据存储中以获取洞察力。同时,GDPR、萨班斯-奥克斯利法案、健康保险隐私及责任法案、巴塞尔协议 III 等法规也迫使企业保护敏感数据集并进行定期审计。不合规可能导致法律诉讼、声誉受损和业务损失。 这对企…

msiscan:一款针对msi文件的漏洞检测与识别工具

关于msiscan msiscan是一款针对Microsoft Windows *.msi 安装程序文件的漏洞检测与识别工具,该工具基于Python开发,可以用于获取安装程序的概述并识别潜在的安全问题。 需要注意的是,当前版本的msiscan正处于积极开发中,可能会存在假阳性和假阴性问题。 工具要求 Pythonter…

【python安全】python沙箱绕过的一些知识

python程序中有时候过滤了一些命令执行的关键字我们怎么去绕过呢? 最原始的方法(python3.7以下可以用魔术方法绕过) python2.7以下: .__class__.__mro__[-1].__subclasses__()[71].__init__.__globals__[os].system(ls)python3.7以下: .__class__.__mro__[-1].__subclasse…

python 出图中文显示问题

增加一句 import matplotlib # 设置字体为系统中的中文字体(这里以SimHei为例,适用于Windows) matplotlib.rcParams[font.sans-serif] = [SimHei]import matplotlib.pyplot as pltimport matplotlib # 设置字体为系统中的中文字体(这里以SimHei为例,适用于Windows) matpl…

Jenkins实现CICD之钉钉告警

作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 目录一.Jenkins配置钉钉机器人并测试1.确保是否安装了DingTalk插件2.进入钉钉的配置页面3.配置通知时机4.新增机器人5.填写钉钉的webhook及关键字信息二.配置钉钉告警1.获取钉钉告警的通知函数2.编写Jenkinsf…

2024-2025-1 20241408陈烨南《计算机基础与程序设计》第九周学习总结

2024-2025-1 20241408陈烨南《计算机基础与程序设计》第九周学习总结这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK09这个作业的目标 操作系统责任、内存与进程管理、分时系统、CPU调度、文…