怎么通过数据库做网站的登录,中国建设招标网官方网站,架设网站开发环境,网络推广方案联系昔年下拉1.概述
目前家庭电视机主要通过其自带的遥控器进行操控#xff0c;实现的功能较为单一。例如#xff0c;当我们要在TV端搜索节目时#xff0c;电视机在遥控器的操控下往往只能完成一些字母或数字的输入#xff0c;而无法输入其他复杂的内容。分布式遥控器将手机的输入能力… 1.概述
目前家庭电视机主要通过其自带的遥控器进行操控实现的功能较为单一。例如当我们要在TV端搜索节目时电视机在遥控器的操控下往往只能完成一些字母或数字的输入而无法输入其他复杂的内容。分布式遥控器将手机的输入能力和电视遥控器的遥控能力结合为一体从而快速便捷操控电视。
分布式遥控器的实现基于OpenHarmony的分布式能力和RPC通信能力UI使用eTS进行开发。如下图所示分别用两块开发板模拟TV端和手机端。
分布式组网后可以通过TV端界面的Controller按钮手动拉起手机端的遥控界面在手机端输入时会将输入的内容同步显示在TV端搜索框点击搜索按钮会根据输入的内容搜索相关节目。还可以通过点击方向键上下左右将焦点移动到我们想要的节目上再点击播放按钮进行播放按返回按钮返回TV端主界面。同时还可以通过手机遥控端关机按钮同时关闭TV端和手机端界面。
UI效果图如下
图1 TV端主页默认页面 图2 手机端遥控页面 图3 TV端视频播放页面 说明 本示例涉及使用系统接口需要手动替换Full SDK才能编译通过具体操作可参考[替换指南]。 2.搭建OpenHarmony环境
完成本篇Codelab我们首先要完成开发环境的搭建本示例以RK3568开发板为例参照以下步骤进行 [获取OpenHarmony系统版本]标准系统解决方案二进制。 以3.1版本为例 搭建烧录环境。 [完成DevEco Device Tool的安装][完成RK3568开发板的烧录]鸿蒙开发文档指导gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或这复制转到。 搭建开发环境。 开始前请参考[工具准备]完成DevEco Studio的安装和开发环境配置。开发环境配置完成后请参考[使用工程向导]创建工程模板选择“Empty Ability”选择JS或者eTS语言开发。工程创建完成后选择使用[真机进行调测])。 3.分布式组网
本章节以系统自带的音乐播放器为例具体以实际的应用为准介绍如何完成两台设备的分布式组网。 硬件准备准备两台烧录相同的版本系统的RK3568开发板A、B。 开发板A、B连接同一个WiFi网络。 打开设置--WLAN--点击右侧WiFi开关--点击目标WiFi并输入密码。 将设备AB设置为互相信任的设备。 找到系统应用“音乐”。 设备A打开音乐点击左下角流转按钮弹出列表框在列表中会展示远端设备的id。选择远端设备B的id另一台开发板设备B会弹出验证的选项框。 设备B点击允许设备B将会弹出随机PIN码将设备B的PIN码输入到设备A的PIN码填入框中。 配网完毕。
4.代码结构解读
本篇Codelab只对核心代码进行讲解首先来介绍下整个工程的代码结构 MainAbility model数据模型。 RemoteDeviceModel.ets获取组网内的设备列表模型。PicData.ets图片信息数据。PicDataModel.ets图片信息模型。ConnectModel.ets连接远端Service和发送消息模型。 pages存放TV端各个页面。 TVindex.etsTV端主页面。VideoPlay.etsTV端视频播放页面。 PhoneAbility存放应用手机控制端主页面。 pages/PhoneIndex.ets手机控制端主页面。 ServiceAbility存放ServiceAbility相关文件。 service.tsservice服务用于跨设备连接后通讯。 resources 存放工程使用到的资源文件。 resources/rawfile存放工程中使用的图片资源文件。 config.json配置文件。
5.实现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: stringState text: string State choose: number -1build() {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: PicDatabuild() {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().sourcebuild() {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 }})})
6.实现手机遥控端界面
在本章节中您将学会开发手机遥控端默认界面示意图参考第一章图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)}
}
7.实现分布式拉起和RPC通信
在本章节中您将学会如何拉起在同一组网内的设备上的FA并且连接远端Service服务。 首先通过TV端拉起手机端界面并将本端的deviceId发送到手机端。 点击TV端主页上的Controller按钮增加.onClick()事件。调用RegisterDeviceListCallback()发现设备列表并弹出设备列表选择框CustomDialogExample选择设备后拉起远端FA。CustomDialogExample()代码如下 // 设备列表弹出框
CustomDialog
struct CustomDialogExample {State editFlag: boolean falsecontroller: CustomDialogControllercancel: () voidconfirm: () voidbuild() {Column() {List({ space: 10, initialIndex: 0 }) {ForEach(DeviceIdList, (item) {ListItem() {Row() {Text(item).width(87%).height(50).fontSize(10).textAlign(TextAlign.Center).borderRadius(10).backgroundColor(0xFFFFFF).onClick(() {onStartRemoteAbility(item);this.controller.close();})}}.editable(this.editFlag)}, item item)}}.width(100%).height(200).backgroundColor(0xDCDCDC).padding({ top: 5 })}
} 点击设备弹出框内的Text组件会调用onStartRemoteAbility()方法拉起远端FA手机端将TV端的deviceId传给手机端并连接手机端的Service。因此在featureAbility.startAbility()成功的回调中也要调用onConnectRemoteService()方法。这里将连接远端Service和发送消息抽象为ConnectModel详细代码可查看MainAbility/model/ConnectModel.ets文件中onConnectRemoteService()方法。onStartRemoteAbility()方法的代码如下 function onStartRemoteAbility(deviceId) {AuthDevice(deviceId);let numDevices remoteDeviceModel.deviceList.length;if (numDevices 0) {prompt.showToast({message: onStartRemoteAbility no device found});return;}var params {remoteDeviceId: localDeviceId}var wantValue {bundleName: com.example.helloworld0218,abilityName: com.example.helloworld0218.PhoneAbility,deviceId: deviceId,parameters: params};featureAbility.startAbility({want: wantValue}).then((data) {// 拉起远端后连接远端serviceconnectModel.onConnectRemoteService(deviceId)});
} 需要注意的是配置文件config.json中ServiceAbility的属性visible要设置为true代码如下 abilities: [...{visible: true,srcPath: ServiceAbility,name: .ServiceAbility,icon: $media:icon,srcLanguage: ets,description: $string:description_serviceability,type: service}
], 成功拉起手机端界面后通过接收TV端传过来的deviceId连接TV端的Service。在手机端的生命周期内增加aboutToAppear()事件在界面被拉起的时候读取对方的deviceId并调用onConnectRemoteService()方法连接对方的Service实现代码如下 async aboutToAppear() {await featureAbility.getWant((error, want) {// 远端被拉起后连接对端的serviceif (want.parameters.remoteDeviceId) {let remoteDeviceId want.parameters.remoteDeviceIdconnectModel.onConnectRemoteService(remoteDeviceId)}});} 建立一个ServiceAbility处理收到的消息并发布公共事件详细代码请看ServiceAbility/service.ts文件。TV端订阅本端Service的公共事件并接受和处理消息。 创建SubscribeEvent()实现代码如下 subscribeEvent() {let self this;// 用于保存创建成功的订阅者对象后续使用其完成订阅及退订的动作var subscriber;// 订阅者信息var subscribeInfo {events: [publish_change],priority: 100};// 设置有序公共事件的结果代码回调function SetCodeCallBack() {}// 设置有序公共事件的结果数据回调function SetDataCallBack() {}// 完成本次有序公共事件处理回调function FinishCommonEventCallBack() {}// 订阅公共事件回调function SubscribeCallBack(err, data) {let msgData data.data;let code data.code;// 设置有序公共事件的结果代码subscriber.setCode(code, SetCodeCallBack);// 设置有序公共事件的结果数据subscriber.setData(msgData, SetDataCallBack);// 完成本次有序公共事件处理subscriber.finishCommonEvent(FinishCommonEventCallBack)// 处理接收到的数据data......// 创建订阅者回调function CreateSubscriberCallBack(err, data) {subscriber data;// 订阅公共事件commonEvent.subscribe(subscriber, SubscribeCallBack);}// 创建订阅者commonEvent.createSubscriber(subscribeInfo, CreateSubscriberCallBack);}
} 在TV端的生命周期内增加aboutToAppear()事件订阅公共事件实现代码如下 async aboutToAppear() {this.subscribeEvent();} 成功连接远端Service服务后在手机遥控器端进行按钮或者输入操作都会完成一次跨设备通讯消息的传递是由手机遥控器端的FA传递到TV端的Service服务。这里将连接远端Service和发送消息抽象为ConnectModel详细代码可查看MainAbility/model/ConnectModel.ets文件中sendMessageToRemoteService()方法。
8.设置遥控器远端事件
手机端应用对TV端能做出的控制有向上移动、向下移动、向左移动、向右移动、确定、返回、关闭。在手机端按键上增加点击事件通过sendMessageToRemoteService()的方法发送到TV端Service。TV端根据发送code以及数据进行数据处理这里只展示TV端数据处理部分的核心代码
// code 1时将手机遥控端search框内数据同步到TV端
if (code 1) {self.text data.parameters.dataList;
}
// code 2时增加选中图片效果
if (code 2) {// 如果在图片序号范围内就选中图片否则不更改var tmp: number data.parameters.dataList;if ((self.choose tmp 5) (self.choose tmp 0)) {self.choose tmp;}
}
// code 3时播放选中图片对应的视频
if (code 3) {self.picItems.forEach(function (item) {if (item.id self.choose) {router.push({uri: pages/VideoPlay,params: { source: item.video }})}})
}
// code 4时回到TV端默认页面
if (code 4) {router.push({uri: pages/TVIndex,})
}
// code 5时关闭程序
if (code 5) {featureAbility.terminateSelf()
}
// code 6时搜索图片名称并增加选中特效
if (code 6) {self.picItems.forEach(function (item) {if (item.name self.text) {self.choose Number(item.id)}})
} 鸿蒙开发岗位需要掌握那些核心要领
目前还有很多小伙伴不知道要学习哪些鸿蒙技术不知道重点掌握哪些为了避免学习时频繁踩坑最终浪费大量时间的。
自己学习时必须要有一份实用的鸿蒙Harmony NEXT资料非常有必要。 这里我推荐根据鸿蒙开发官网梳理与华为内部人员的分享总结出的开发文档。内容包含了【ArkTS、ArkUI、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战】等技术知识点。
废话就不多说了接下来好好看下这份资料。
如果你是一名Android、Java、前端等等开发人员想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。鸿蒙OpenHarmony知识←前往。下面是鸿蒙开发的学习路线图。 针对鸿蒙成长路线打造的鸿蒙学习文档。鸿蒙OpenHarmony 学习手册共计1236页与鸿蒙OpenHarmony 开发入门教学视频帮助大家在技术的道路上更进一步。
其中内容包含
《鸿蒙开发基础》鸿蒙OpenHarmony知识←前往
ArkTS语言安装DevEco Studio运用你的第一个ArkTS应用ArkUI声明式UI开发.……
《鸿蒙开发进阶》鸿蒙OpenHarmony知识←前往
Stage模型入门网络管理数据管理电话服务分布式应用开发通知与窗口管理多媒体技术安全技能任务管理WebGL国际化开发应用测试DFX面向未来设计鸿蒙系统移植和裁剪定制……
《鸿蒙开发实战》鸿蒙OpenHarmony知识←前往
ArkTS实践UIAbility应用网络案例……
最后
鸿蒙是完全具备无与伦比的机遇和潜力的预计到年底将有 5,000 款的应用完成原生鸿蒙开发这么多的应用需要开发也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长学习鸿蒙势在必行 文章转载自: http://www.morning.rhzzf.cn.gov.cn.rhzzf.cn http://www.morning.jxhlx.cn.gov.cn.jxhlx.cn http://www.morning.lqklf.cn.gov.cn.lqklf.cn http://www.morning.jxlnr.cn.gov.cn.jxlnr.cn http://www.morning.kbqws.cn.gov.cn.kbqws.cn http://www.morning.wlnr.cn.gov.cn.wlnr.cn http://www.morning.hwycs.cn.gov.cn.hwycs.cn http://www.morning.qxnns.cn.gov.cn.qxnns.cn http://www.morning.ymhzd.cn.gov.cn.ymhzd.cn http://www.morning.czgfn.cn.gov.cn.czgfn.cn http://www.morning.htfnz.cn.gov.cn.htfnz.cn http://www.morning.xyrss.cn.gov.cn.xyrss.cn http://www.morning.hpcpp.cn.gov.cn.hpcpp.cn http://www.morning.sqdjn.cn.gov.cn.sqdjn.cn http://www.morning.pcrzf.cn.gov.cn.pcrzf.cn http://www.morning.krnzm.cn.gov.cn.krnzm.cn http://www.morning.sskkf.cn.gov.cn.sskkf.cn http://www.morning.jklns.cn.gov.cn.jklns.cn http://www.morning.lydtr.cn.gov.cn.lydtr.cn http://www.morning.ljtwp.cn.gov.cn.ljtwp.cn http://www.morning.thzgd.cn.gov.cn.thzgd.cn http://www.morning.qrqcr.cn.gov.cn.qrqcr.cn http://www.morning.rdkqt.cn.gov.cn.rdkqt.cn http://www.morning.hongjp.com.gov.cn.hongjp.com http://www.morning.qmxsx.cn.gov.cn.qmxsx.cn http://www.morning.kwfnt.cn.gov.cn.kwfnt.cn http://www.morning.gkxyy.cn.gov.cn.gkxyy.cn http://www.morning.mljtx.cn.gov.cn.mljtx.cn http://www.morning.mjtgt.cn.gov.cn.mjtgt.cn http://www.morning.zyytn.cn.gov.cn.zyytn.cn http://www.morning.rrcxs.cn.gov.cn.rrcxs.cn http://www.morning.gsrh.cn.gov.cn.gsrh.cn http://www.morning.mlwpr.cn.gov.cn.mlwpr.cn http://www.morning.rtlrz.cn.gov.cn.rtlrz.cn http://www.morning.tlrxp.cn.gov.cn.tlrxp.cn http://www.morning.lsfbb.cn.gov.cn.lsfbb.cn http://www.morning.bpmfg.cn.gov.cn.bpmfg.cn http://www.morning.nfbnl.cn.gov.cn.nfbnl.cn http://www.morning.cjxqx.cn.gov.cn.cjxqx.cn http://www.morning.hlzpb.cn.gov.cn.hlzpb.cn http://www.morning.dpqqg.cn.gov.cn.dpqqg.cn http://www.morning.bpmnq.cn.gov.cn.bpmnq.cn http://www.morning.nbrdx.cn.gov.cn.nbrdx.cn http://www.morning.wfdlz.cn.gov.cn.wfdlz.cn http://www.morning.fmkbk.cn.gov.cn.fmkbk.cn http://www.morning.tytly.cn.gov.cn.tytly.cn http://www.morning.hwhnx.cn.gov.cn.hwhnx.cn http://www.morning.rfwrn.cn.gov.cn.rfwrn.cn http://www.morning.xkhxl.cn.gov.cn.xkhxl.cn http://www.morning.tsnwf.cn.gov.cn.tsnwf.cn http://www.morning.lgqdl.cn.gov.cn.lgqdl.cn http://www.morning.gywxq.cn.gov.cn.gywxq.cn http://www.morning.qfnrx.cn.gov.cn.qfnrx.cn http://www.morning.xrqkm.cn.gov.cn.xrqkm.cn http://www.morning.shawls.com.cn.gov.cn.shawls.com.cn http://www.morning.ptdzm.cn.gov.cn.ptdzm.cn http://www.morning.xqwq.cn.gov.cn.xqwq.cn http://www.morning.zsthg.cn.gov.cn.zsthg.cn http://www.morning.dmtld.cn.gov.cn.dmtld.cn http://www.morning.tslxr.cn.gov.cn.tslxr.cn http://www.morning.rswtz.cn.gov.cn.rswtz.cn http://www.morning.gglhj.cn.gov.cn.gglhj.cn http://www.morning.qfwfj.cn.gov.cn.qfwfj.cn http://www.morning.hfxks.cn.gov.cn.hfxks.cn http://www.morning.ngcth.cn.gov.cn.ngcth.cn http://www.morning.mooncore.cn.gov.cn.mooncore.cn http://www.morning.qrndh.cn.gov.cn.qrndh.cn http://www.morning.bxqry.cn.gov.cn.bxqry.cn http://www.morning.xjbtb.cn.gov.cn.xjbtb.cn http://www.morning.dbnrl.cn.gov.cn.dbnrl.cn http://www.morning.rylr.cn.gov.cn.rylr.cn http://www.morning.zgnng.cn.gov.cn.zgnng.cn http://www.morning.xbmwm.cn.gov.cn.xbmwm.cn http://www.morning.fyglr.cn.gov.cn.fyglr.cn http://www.morning.deanzhu.com.gov.cn.deanzhu.com http://www.morning.dwztj.cn.gov.cn.dwztj.cn http://www.morning.crsqs.cn.gov.cn.crsqs.cn http://www.morning.ltdxq.cn.gov.cn.ltdxq.cn http://www.morning.mftzm.cn.gov.cn.mftzm.cn http://www.morning.gl-group.cn.gov.cn.gl-group.cn