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

news/2025/3/19 14:43:22/

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

今天分享一个电影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.ppmy.cn/news/1580339.html

相关文章

Flink Cdc TiDB详解

1. 什么是 Flink TiDB CDC? 简单说就是用 Flink 实时抓取 TiDB 数据库的数据变化(比如新增、修改、删除),并将这些变化数据以流的形式处理,用于实时分析、同步到其他系统等场景。 TiDB 本身是分布式数据库&#xff0c…

基于 MATLAB GUI 环境下的语音分析处理平台的设计与实现示例

以下是一个简单的基于 MATLAB GUI 环境下的语音分析处理平台的设计与实现示例。该平台可以实现语音的读取、播放、绘制波形图和频谱图等基本功能。 function speech_analysis_gui% 创建主窗口fig = uifigure(Name, 语音分析处理平台, Position, [100 100 800

奇安信全流量(天眼)面试题

一、全流量设备(天眼)的部署架构 天眼系统采用旁路部署模式,通过流量镜像实现非侵入式监测,核心组件包括流量传感器、分析平台和文件威胁鉴定器,具体部署架构如下: 传感器部署 关键节点覆盖:在…

K8S学习之基础三十六:node-exporter部署

Prometheus v2.2.1 ​ 编写yaml文件,包含创建ns、configmap、deployment、service # 创建monitoring空间 vi prometheus-ns.yaml apiVersion: v1 kind: Namespace metadata:name: monitoring# 创建SA并绑定权限 kubectl create serviceaccount monitor -n monito…

第一个vue项目

项目目录 启动vue项目 npm run serve 1.vue.config.js文件 (CLI通过vue-cli-serve启动项目,解析配置配置文件vue-condig-js) // vue.config.js //引入path板块,这是Node.js的一个内置模块,用于处理文件路径,这里引用…

如何利用物理按键控制LVGL控件的大小与状态

​ lvgl可以利用物理按键控制控件的选择和状态,演示视频如下: 单物理按键控制LVGL控件的选择和状态 移植方法如下:1 在注册设备中,填写对应的变量和初始化函数。这里我们以移keypad为例,因为keypad的功能很多。 ![请添…

SpringMVC-登录校验

文章目录 1.会话技术1.1 Cookie1.2 Session1.3 JWT1.3.1 JWT简介1.3.2 JWT结构1.3.3 使用JWT 2.拦截技术2.1 过滤器(Filter)2.1.1 快速上手2.1.2 执行流程2.1.3 拦截路径2.1.4 过滤器链 2.2 拦截器(Interceptor)2.2.1 快速上手2.2…

【JavaScript】三、数据类型

文章目录 1、数据类型1.1 基本数据类型:数字型number1.2 基本数据类型:字符串类型1.3 基本数据类型:布尔类型1.4 基本数据类型:未定义undefined1.5 基本数据类型:空类型null 2、查看数据类型2.1 从控制台看2.2 typeof …