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

今天分享一个电影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;
});
});
}
});
}

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

鸿蒙Next开发实战教程—电影app的更多相关文章

  1. Swift游戏开发实战教程(霸内部信息大学)

    Swift游戏开发实战教程(大学霸内部资料) 试读下载地址:http://pan.baidu.com/s/1sj7DvQH 介绍:本教程是国内第一本Swift游戏开发专向资料. 本教程具体解说记忆配对 ...

  2. asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发4- 后台模板html页面创建

    上一篇教程<asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发3-登录模块开发>完成了本项目的登录模块,登录后就需要进入后台管理首页了,需要准备一个后台模 ...

  3. asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发2-Model层建立

    上篇(asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发1-准备工作)文章讲解了开发过程中的准备工作,主要创建了项目数据库及项目,本文主要讲解项目M层的实现,M层这里 ...

  4. 微信小程序-云开发实战教程

    微信小程序-云开发实战教程 云函数,云存储,云数据库,云调用 https://developers.weixin.qq.com/miniprogram/dev/wxcloud/basis/gettin ...

  5. Python开发实战教程(8)-向网页提交获取数据

    来这里找志同道合的小伙伴!↑↑↑ Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知 ...

  6. React Native Android原生模块开发实战|教程|心得|怎样创建React Native Android原生模块

    尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://blog.csdn.net/fengyuzhengfan/article/details/54691503) 告诉大家一个好消息. ...

  7. HTML5 App商业开发实战教程 基于WeX5可视化开发平台

  8. asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发3-登录模块开发

    进行本文之前需要在数据库用户表里面增加一条用户数据,直接手动添加即可,未安全考虑密码一定要使用Md5加密后的,这里提供666666的Md5密文为(c831b04de153469d),本文完成登录模块的 ...

  9. asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发1-准备工作

    /****** Object: 新闻表 Script Date: 2017/9/2 星期六 15:11:12 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENT ...

  10. android开发实战-记账本APP(二)

    继昨天的开发,继续完成今天的内容. (一)开始构建一些业务逻辑,开始构建记账本的添加一笔记账的功能. ①对fab按钮的click时间进行修改,创建一个AlertDialog.Builder对象,因此我 ...

随机推荐

  1. c++经典卡常

    1.展开函数 如下代码: void lowbit(int x) { return x&(-x); } signed main() { cout << lowbit(12345); ...

  2. 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本地AI Agent

    一.天价邀请码VS开源革命:打工人今夜无眠 昨夜科技圈被两个关键词刷屏:​Manus激活码炒至5万元5,7,​GitHub神秘项目OpenManus突然开源6,7.这场戏剧性对决的背后,是一场关于「A ...

  3. CTF-CRYPTO-ECC(2)

    CTF-CRYPTO-ECC(2) 椭圆加密 4.BSGS(小步大步法) [HITCTF 2021 ] task.py #Elliptic Curve: y^2 = x^3 + 7 mod N whi ...

  4. Qt 实现带阴影 无边框的QMessageBox

    Qt 实现带阴影的QMessagebox 在实际项目里面使用到了QMessageBox做一个弹窗,最开始是样式不是需要的样式,就去找了一下QMessageBox的样式表,一般来说可以使用findChi ...

  5. 记录一下 简单udp和sni 代理 done

    由于之前借鉴 Kestrel 了非常多抽象和优化实现,对于后续的扩展非常便利, 实现 简单udp和sni 代理 两个功能比预期快了超多(当然也有偷懒因素) (PS 大家有空的话,能否在 GitHub ...

  6. Arrays工具类教你优雅地管理数组数据

    数组专用工具类指的是 java.util.Arrays 类,基本上常见的数组操作,这个类都提供了静态方法可供直接调用.毕竟数组本身想完成这些操作还是挺麻烦的,有了这层封装,就方便多了. package ...

  7. 1、从DeepSeek API调用到Semantic Kernel集成:深度解析聊天机器人开发全链路

    引言:AI时代下的聊天机器人开发范式演进 在生成式AI技术爆发的当下,基于大语言模型(LLM)的聊天机器人开发已形成标准化技术链路.本文将结合DeepSeek API与微软Semantic Kerne ...

  8. Python字符串前缀u、r、b、f含义(转)

    1.字符串前加 u 例子: u"字符串中有中文" 含义: 前缀u表示该字符串是unicode编码,Python2中用,用在含有中文字符的字符串前,防止因为编码问题,导致中文出现乱码 ...

  9. Win7共享账号切换程序

    服务器共享目录需要多账号登录时,需要重启电脑才可切换不同账号登 为了不重启电脑就可立即切换不同账号登,特意写了此款软件, 下载: 链接:https://pan.baidu.com/s/1g_4SCXl ...

  10. games101 作业4提高部分

    games101 作业4提高部分 作业四中,我们按照实验步骤完成bazier曲线之后,得到的结果有一定的锯齿感: 然后pdf中给出的思路是: 对于一个曲线上的点,不只把它对应于一个像素,你需要根据到像 ...