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

    文章

    815

    浏览量

    64242
  • 电视机
    +关注

    关注

    7

    文章

    389

    浏览量

    43571
  • OpenHarmony
    +关注

    关注

    23

    文章

    3284

    浏览量

    15159

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

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

收藏 人收藏

    评论

    相关推荐

    led显示频播放控制界面

    led显示频播放控制界面通过PC上位机界面控制单片机来控制LED的变化 最好能跑出视频 效果
    发表于 01-14 18:44

    通过蓝牙通讯,在手机做个控制界面该学些什么?

    控制界面,就像是遥控一样能够控制飞行器飞,我该学些什么?问题二:电脑上做个控制的上位机,我需要学会什么?如果这个上位机还得包括使用谷歌地图定位呢?又得学习啥?问题三:通过购买韦东山的LINUX的开发板,我能学到 上面所需要的技能
    发表于 04-29 06:36

    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

    万能遥控器的带约束动态界面布局的研究

    在未来的智能家居中,用户可以使用万能遥控器来操纵家中所有的信息家电;本文介绍了万能遥控器的概念及其作用,提出了万能遥控界面的设计目标,阐述了其带约束的动态
    发表于 09-09 15:47 26次下载

    H2TV双图旅行者3D界面地图数据

    H2TV双图旅行者3D界面地图数据:一共有325MB。
    发表于 04-25 18:30 35次下载

    Linux字符界面转图形界面

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

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

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

    亚马逊在9月发布了新的Fire TV界面

    查找也是Fire TV用户界面的新增功能。顾名思义,此工具旨在帮助您轻松找到要在Fire TV上观看的电影和电视节目。您可以按热门类别搜索不同的内容,包括电影,电视节目,免费内容和体育节目。
    的头像 发表于 12-13 10:46 1204次阅读

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

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

    SkinMagic界面开发控件下载

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

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

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

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

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