0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

开发TV端默认界面和视频播放界面以及手机遥控端默认界面

电子发烧友开源社区 来源:HarmonyOS官方合作社区 作者:HarmonyOS官方合作社 2022-05-26 11:06 次阅读

概述

目前家庭电视机主要通过其自带的遥控器进行操控,实现的功能较为单一。例如,当我们要在TV端搜索节目时,电视机在遥控器的操控下往往只能完成一些字母或数字的输入,而无法输入其他复杂的内容。分布式遥控器将手机的输入能力和电视遥控器的遥控能力结合为一体,从而快速便捷操控电视。

分布式遥控器的实现基于OpenHarmony的分布式能力和RPC通信能力,UI使用eTS进行开发。如下图所示,分别用两块开发板模拟TV端和手机端。

分布式组网后可以通过TV端界面的Controller按钮手动拉起手机端的遥控界面,在手机端输入时会将输入的内容同步显示在TV端搜索框,点击搜索按钮会根据输入的内容搜索相关节目。

还可以通过点击方向键(上下左右)将焦点移动到我们想要的节目上,再点击播放按钮进行播放,按返回按钮返回TV端主界面。

同时还可以通过手机遥控端关机按钮同时关闭TV端和手机端界面。

实现TV端界面

在本章节中,您将学会开发TV端默认界面和TV端视频播放界面,示意图参考第一章图1和图3所示。

建立数据模型,将图片ID、图片源、图片名称和视频源绑定成一个数据模型。详情代码可以查看MainAbility/model/PicData.ets和MainAbility/model/PicDataModel.ets两个文件。

实现TV端默认页面布局和样式,在MainAbility/pages/TVIndex.ets 主界面文件中添加入口组件。页面布局代码如下:

// 入口组件

@Entry

@Component

struct Index {

private letters: string[] = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

private source: string

@State text: string = ''

@State choose: number = -1

build() {

Flex({ direction: FlexDirection.Column }) {

TextInput({text: this.text, placeholder: 'Search' })

.onChange((value: string) => {

this.text = value

})

Row({space: 30}) {

Text('Clear')

.fontSize(16)

.backgroundColor('#ABB0BA')

.textAlign(TextAlign.Center)

.onClick(() => {

this.text = ''

})

.clip(true)

.borderRadius(10)

Text('Backspace')

.fontSize(16)

.backgroundColor('#ABB0BA')

.textAlign(TextAlign.Center)

.onClick(() => {

this.text = this.text.substring(0, this.text.length - 1)

})

.clip(true)

.borderRadius(10)

Text('Controller')

.fontSize(16)

.backgroundColor('#ABB0BA')

.textAlign(TextAlign.Center)

.onClick(() => {

......

})

.clip(true)

.borderRadius(10)

}

Grid() {

ForEach(this.letters, (item) => {

GridItem() {

Text(item)

.fontSize(20)

.backgroundColor('#FFFFFF')

.textAlign(TextAlign.Center)

.onClick(() => {

this.text += item

})

.clip(true)

.borderRadius(5)

}

}, item => item)

}

.rowsTemplate('1fr 1fr 1fr 1fr')

.columnsTemplate('1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr')

.columnsGap(8)

.rowsGap(8)

.width('75%')

.height('25%')

.margin(5)

.backgroundColor('#D2D3D8')

.clip(true)

.borderRadius(10)

Grid() {

ForEach(this.picItems, (item: PicData) => {

GridItem() {

PicGridItem({ picItem: item })

}

}, (item: PicData) => item.id.toString())

}

.rowsTemplate('1fr 1fr 1fr')

.columnsTemplate('1fr 1fr')

.columnsGap(5)

.rowsGap(8)

.width('90%')

.height('58%')

.backgroundColor('#FFFFFF')

.margin(5)

}

.width('98%')

.backgroundColor('#FFFFFF')

}

}

(左右移动查看全部内容)

其中PicGridItem将PicItem的图片源和图片名称绑定,实现代码如下:

// 九宮格拼图组件

@Component

struct PicGridItem {

private picItem: PicData

build() {

Column() {

Image(this.picItem.image)

.objectFit(ImageFit.Contain)

.height('85%')

.width('100%')

.onClick(() => {

......

})

})

Text(this.picItem.name)

.fontSize(20)

.fontColor('#000000')

}

.height('100%')

.width('90%')

}

}

(左右移动查看全部内容)

实现TV端视频播放界面,在MainAbility/pages/VideoPlay.ets 文件中添加组件。页面布局代码如下:


import router from '@system.router'

@Entry

@Component

struct Play {

// 取到Index页面跳转来时携带的source对应的数据。

private source: string = router.getParams().source

build() {

Column() {

Video({

src: this.source,

})

.width('100%')

.height('100%')

.autoPlay(true)

.controls(true)

}

}

}

(左右移动查看全部内容)

在MainAbility/pages/TVIndex.ets中,给PicGridItem的图片添加点击事件,点击图片即可播放PicItem的视频源。实现代码如下:

Image(this.picItem.image)

......

.onClick(() => {

router.push({

uri: 'pages/VideoPlay',

params: { source: this.picItem.video }

})

})

(左右移动查看全部内容)

实现手机遥控端界面

在本章节中,您将学会开发手机遥控端默认界面,示意图参考第一章图2所示。

PhoneAbility/pages/PhoneIndex.ets 主界面文件中添加入口组件。页面布局代码如下:


@Entry

@Component

struct Index {

build() {

Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center }) {

Row() {

Image($rawfile('TV.png'))

.width(25)

.height(25)

Text('华为智慧屏').fontSize(20).margin(10)

}

// 文字搜索框

TextInput({ placeholder: 'Search' })

.margin(20)

.onChange((value: string) => {

if (connectModel.mRemote){

......

}

})

Grid() {

GridItem() {

// 向上箭头

Button({ type: ButtonType.Circle, stateEffect: true }) {

Image($rawfile('up.png')).width(80).height(80)

}

.onClick(() => {

......

})

.width(80)

.height(80)

.backgroundColor('#FFFFFF')

}

.columnStart(1)

.columnEnd(5)

GridItem() {

// 向左箭头

Button({ type: ButtonType.Circle, stateEffect: true }) {

Image($rawfile('left.png')).width(80).height(80)

}

.onClick(() => {

......

})

.width(80)

.height(80)

.backgroundColor('#FFFFFF')

}

GridItem() {

// 播放键

Button({ type: ButtonType.Circle, stateEffect: true }) {

Image($rawfile('play.png')).width(60).height(60)

}

.onClick(() => {

......

})

.width(80)

.height(80)

.backgroundColor('#FFFFFF')

}

GridItem() {

// 向右箭头

Button({ type: ButtonType.Circle, stateEffect: true }) {

Image($rawfile('right.png')).width(70).height(70)

}

.onClick(() => {

......

})

.width(80)

.height(80)

.backgroundColor('#FFFFFF')

}

GridItem() {

// 向下箭头

Button({ type: ButtonType.Circle, stateEffect: true }) {

Image($rawfile('down.png')).width(70).height(70)

}

.onClick(() => {

......

})

.width(80)

.height(80)

.backgroundColor('#FFFFFF')

}

.columnStart(1)

.columnEnd(5)

}

.rowsTemplate('1fr 1fr 1fr')

.columnsTemplate('1fr 1fr 1fr')

.backgroundColor('#FFFFFF')

.margin(10)

.clip(new Circle({ width: 325, height: 325 }))

.width(350)

.height(350)

Row({ space:100 }) {

// 返回键

Button({ type: ButtonType.Circle, stateEffect: true }) {

Image($rawfile('return.png')).width(40).height(40)

}

.onClick(() => {

......

})

.width(100)

.height(100)

.backgroundColor('#FFFFFF')

// 关机键

Button({ type: ButtonType.Circle, stateEffect: true }) {

Image($rawfile('off.png')).width(40).height(40)

}

.onClick(() => {

......

})

.width(100)

.height(100)

.backgroundColor('#FFFFFF')

// 搜索键

Button({ type: ButtonType.Circle, stateEffect: true }) {

Image($rawfile('search.png')).width(40).height(40)

}

.onClick(() => {

......

})

.width(100)

.height(100)

.backgroundColor('#FFFFFF')

}

.padding({ left:100 })

}

.backgroundColor('#E3E3E3')

}

}

(左右移动查看全部内容)

原文标题:OpenHarmony 实例:DAYU200 分布式遥控器

文章出处:【微信公众号:HarmonyOS官方合作社区】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 遥控器
    +关注

    关注

    18

    文章

    831

    浏览量

    66011
  • 电视机
    +关注

    关注

    7

    文章

    394

    浏览量

    44035
  • OpenHarmony
    +关注

    关注

    25

    文章

    3682

    浏览量

    16183

原文标题:OpenHarmony 实例:DAYU200 分布式遥控器

文章出处:【微信号:HarmonyOS_Community,微信公众号:电子发烧友开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Ubuntu界面开发

    原网址传送门手动分割线手动分割线手动分割线手动分割线手动分割线手动分割线正片开始在ROS librviz 人机交互软件开发系列教程中我们实现了Ubuntu界面开发。但是很多小伙伴问
    发表于 08-18 08:09

    HarmonyOS教程—基于分布式能力,将手机作为智慧屏的虚拟控制器,控制文字输入和遥控播放

    、实现类以及代理。service:RemoteService为TVservice,供手机远程调用。slice:MainAbilitySl
    发表于 09-08 10:39

    DistributedVideoPlayer分布式视频播放器的设计资料

    和电视之间传输视频.应用分为手机(entry)和TV(entrytv),以及一个依赖模块(c
    发表于 03-22 11:55

    DAYU200 | 分布式遥控

    主页默认页面图2 手机遥控页面图3 TV视频播放
    发表于 05-25 15:47

    VxWorks下图形用户界面开发

    VxWorks下图形用户界面开发
    发表于 03-25 10:45 19次下载

    基于LABVIEW的数字电源控制界面开发

    基于LABVIEW的数字电源控制界面开发详解
    发表于 11-10 16:50 124次下载
    基于LABVIEW的数字电源控制<b class='flag-5'>界面</b><b class='flag-5'>开发</b>

    Linux字符界面转图形界面

    视频主要详细介绍了Linux字符界面转图形界面的操作教程,具体的跟随小编一起来了解一下。
    的头像 发表于 03-02 14:14 7301次阅读

    pc是什么意思_PC与移动区别

    PC是和移动终端相对应的名词,就是指网络世界里可以连接到电脑主机的那个端口,是基于电脑的界面体系,它有别于移动手机界面体系。
    发表于 05-08 10:28 6.4w次阅读

    YouTub正在为某些平台推出经过改进的界面

    在过去几周左右的时间里,Android TV和Fire TV上都提供了YouTube应用的服务器更改。目前,视频播放器用户
    的头像 发表于 09-30 10:25 1993次阅读

    亚马逊新的Fire TV用户界面即将揭晓

    据外媒消息,亚马逊将于下个月推出新的Fire TV用户界面,以支持Fire TV Stick 4K和Fire TV Cube。根据一份新报告,亚马逊的新Fire
    的头像 发表于 02-19 15:30 1834次阅读

    HarmonyOS UI界面活动可实现不同屏幕的界面适配能力

    HarmonyOS的界面设计/组件设计需要拥有良好的自适应能力,可快速进行不同尺寸屏幕的开发。其次,界面中的元素设计以及交互方式保持一致,减少了用户的学习成本。
    的头像 发表于 12-23 09:50 1795次阅读

    SkinMagic界面开发控件下载

    SkinMagic   界面开发控件
    发表于 02-15 10:28 1次下载

    如何在CubeMx配置界面将DMA中断的默认使能关闭

    能不能在CubeMx配置界面将DMA中断的默认使能关闭? 这里再顺便分享一个跟CubeMx配置有关的话题。目前来看,我相信对不少人还是有帮助的! 我们在使用CubeMx对STM32芯片做初始化配置
    的头像 发表于 09-09 16:01 1587次阅读
    如何在CubeMx配置<b class='flag-5'>界面</b>将DMA中断的<b class='flag-5'>默认</b>使能关闭

    【AWTK开源智能串口屏方案】设计UI界面并上传到串口屏

    本篇文章将介绍如何使用AWStudio设计串口屏的UI界面和添加绑定规则,以及怎么将资源文件上传到串口屏。引言:AWTK-HMI是基于AWTK与AWTK-MVVM
    的头像 发表于 02-22 08:24 680次阅读
    【AWTK开源智能串口屏方案】设计UI<b class='flag-5'>界面</b>并上传到串口屏

    HarmonyOS开发案例:【视频播放器】

    使用ArkTS语言实现视频播放器,主要包括主界面视频播放界面
    的头像 发表于 04-23 17:25 660次阅读
    HarmonyOS<b class='flag-5'>开发</b>案例:【<b class='flag-5'>视频</b><b class='flag-5'>播放</b>器】