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

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

3天内不再提示

鸿蒙系统中用Java UI开发分布式仿抖音应用

OpenHarmony技术社区 来源:鸿蒙技术社区 作者:开鸿HOS小鸿 2021-11-01 14:49 次阅读

本文使用 Java UI 开发分布式仿抖音应用,上下滑动切换视频,评论功能,设备迁移功能:记录播放的视频页和进度、评论数据。

效果演示

①上下滑动切换视频、点击迁移图标,弹框选择在线的设备,完成视频数据的迁移。

点击评论图标查看评论,编辑评论内容并发送。点击迁移图标,弹框选择在线的设备,完成评论数据的迁移。

项目结构

如下图:

d2044b64-3ac4-11ec-82a9-dac502259ad0.png

主要代码

①上下滑动页面

页面切换用到系统组件PageSlider:

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-java-component-pageslider-0000001091933258

默认左右切换,设置为上下方向:setOrientation(Component.VERTICAL);

importohos.aafwk.ability.AbilitySlice;
importohos.aafwk.content.Intent;
importohos.agp.components.*;

importjava.util.ArrayList;
importjava.util.List;

publicclassMainAbilitySliceextendsAbilitySlice{
@Override
publicvoidonStart(Intentintent){
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
//查找滑动页面组件
PageSliderpageSlider=(PageSlider)findComponentById(ResourceTable.Id_pageSlider);
//设置滑动方向为上下滑动
pageSlider.setOrientation(Component.VERTICAL);
//集合测试数据
ListlistData=newArrayList<>();
listData.add("第一页");
listData.add("第二页");
listData.add("第三页");

//设置页面适配器
pageSlider.setProvider(newPageSliderProvider(){
/**
*获取当前适配器中可用视图的数量
*/
@Override
publicintgetCount(){
returnlistData.size();
}
/**
*创建页面
*/
@Override
publicObjectcreatePageInContainer(ComponentContainercontainer,intposition){
//查找布局
Componentcomponent=LayoutScatter.getInstance(getContext()).parse(ResourceTable.Layout_item_page,null,false);
TexttextContent=(Text)component.findComponentById(ResourceTable.Id_text_item_page_content);
//设置数据
textContent.setText(listData.get(position));
//添加到容器中
container.addComponent(component);
returncomponent;
}
/**
*销毁页面
*/
@Override
publicvoiddestroyPageFromContainer(ComponentContainercontainer,intposition,Objectobject){
//从容器中移除
container.removeComponent((Component)object);
}
/**
*检查页面是否与对象匹配
*/
@Override
publicbooleanisPageMatchToObject(Componentpage,Objectobject){
returntrue;
}
});

//添加页面改变监听器
pageSlider.addPageChangedListener(newPageSlider.PageChangedListener(){
/**
*页面滑动时调用
*/
@Override
publicvoidonPageSliding(intitemPos,floatitemPosOffset,intitemPosOffsetPixels){}
/**
*当页面滑动状态改变时调用
*/
@Override
publicvoidonPageSlideStateChanged(intstate){}
/**
*选择新页面时回调
*/
@Override
publicvoidonPageChosen(intitemPos){
//在此方法下,切换页面获取当前页面的视频源,进行播放
Stringdata=listData.get(itemPos);
}
});
}
}

②播放视频

视频播放使用Player:

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/media-video-player-0000000000044178

视频画面窗口显示使用SurfaceProvider:

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/faq-media-0000001124842486#section0235506211
importohos.aafwk.ability.AbilitySlice;
importohos.aafwk.content.Intent;
importohos.agp.components.surfaceprovider.SurfaceProvider;
importohos.agp.graphics.SurfaceOps;
importohos.global.resource.RawFileDescriptor;
importohos.media.common.Source;
importohos.media.player.Player;

importjava.io.IOException;

publicclassMainAbilitySliceextendsAbilitySlice{
//视频路径
privatefinalStringvideoPath="resources/rawfile/HarmonyOS.mp4";
//播放器
privatePlayermPlayer;

@Override
publicvoidonStart(Intentintent){
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
//初始化播放器
mPlayer=newPlayer(getContext());
//查找视频窗口组件
SurfaceProvidersurfaceProvider=(SurfaceProvider)findComponentById(ResourceTable.Id_surfaceProvider);
//设置视频窗口在顶层
surfaceProvider.pinToZTop(true);
//设置视频窗口操作监听
if(surfaceProvider.getSurfaceOps().isPresent()){
surfaceProvider.getSurfaceOps().get().addCallback(newSurfaceOps.Callback(){
/**
*创建视频窗口
*/
@Override
publicvoidsurfaceCreated(SurfaceOpsholder){
try{
RawFileDescriptorfileDescriptor=getResourceManager().getRawFileEntry(videoPath).openRawFileDescriptor();
Sourcesource=newSource(fileDescriptor.getFileDescriptor(),
fileDescriptor.getStartPosition(),
fileDescriptor.getFileSize()
);
//设置媒体文件
mPlayer.setSource(source);
//设置播放窗口
mPlayer.setVideoSurface(holder.getSurface());
//循环播放
mPlayer.enableSingleLooping(true);
//准备播放环境并缓冲媒体数据
mPlayer.prepare();
//开始播放
mPlayer.play();
}catch(IOExceptione){
e.printStackTrace();
}

}
/**
*视频窗口改变
*/
@Override
publicvoidsurfaceChanged(SurfaceOpsholder,intformat,intwidth,intheight){}
/**
*视频窗口销毁
*/
@Override
publicvoidsurfaceDestroyed(SurfaceOpsholder){}
});
}
}

@Override
protectedvoidonStop(){
super.onStop();
//页面销毁,释放播放器
if(mPlayer!=null){
mPlayer.stop();
mPlayer.release();
}
}
}

③跨设备迁移示例

跨设备迁移使用IAbilityContinuation 接口

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ability-page-cross-device-0000001051072880

在 entry 下的 config.json 配置权限:

"reqPermissions":[
{
"name":"ohos.permission.DISTRIBUTED_DATASYNC"
},
{
"name":"ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"
},
{
"name":"ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE"
}
]

实现 IAbilityContinuation 接口,说明:一个应用可能包含多个 Page,仅需要在支持迁移的 Page 中通过以下方法实现 IAbilityContinuation 接口。

同时,此 Page 所包含的所有 AbilitySlice 也需要实现此接口。

importohos.aafwk.ability.AbilitySlice;
importohos.aafwk.ability.IAbilityContinuation;
importohos.aafwk.content.Intent;
importohos.aafwk.content.IntentParams;
importohos.agp.components.Button;
importohos.agp.components.Text;
importohos.bundle.IBundleManager;
importohos.distributedschedule.interwork.DeviceInfo;
importohos.distributedschedule.interwork.DeviceManager;

importjava.util.List;

publicclassMainAbilitySliceextendsAbilitySliceimplementsIAbilityContinuation{
privateStringdata="";
StringPERMISSION="ohos.permission.DISTRIBUTED_DATASYNC";

@Override
publicvoidonStart(Intentintent){
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
//申请权限
if(verifySelfPermission(PERMISSION)!=IBundleManager.PERMISSION_GRANTED){
requestPermissionsFromUser(newString[]{PERMISSION},0);
}
Buttonbutton=(Button)findComponentById(ResourceTable.Id_button);
Texttext=(Text)findComponentById(ResourceTable.Id_text);

//点击迁移
button.setClickedListener(component->{
//查询分布式网络中所有在线设备(不包括本地设备)的信息。
ListdeviceList=DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);
if(deviceList.size()>0){
//启动迁移,指定的设备ID
continueAbility(deviceList.get(0).getDeviceId());
}
});
//显示迁移的数据
text.setText("迁移的数据:"+data);
}
/**
*启动迁移时首次调用此方法
*@return是否进行迁移
*/
@Override
publicbooleanonStartContinuation(){
returntrue;
}
/**
*迁移时存入数据
*/
@Override
publicbooleanonSaveData(IntentParamsintentParams){
intentParams.setParam("data","测试数据");
returntrue;
}
/**
*获取迁移存入的数据,在生命周期的onStart之前执行
*/
@Override
publicbooleanonRestoreData(IntentParamsintentParams){
data=(String)intentParams.getParam("data");
returntrue;
}
/**
*迁移完成
*/
@Override
publicvoidonCompleteContinuation(inti){}
}

根据上面的核心代码示例,了解实现原理,接下来便可以结合实际需求完善功能了。

责任编辑:haq

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

    关注

    19

    文章

    2966

    浏览量

    104703
  • 鸿蒙系统
    +关注

    关注

    183

    文章

    2634

    浏览量

    66308
  • HarmonyOS
    +关注

    关注

    79

    文章

    1974

    浏览量

    30146

原文标题:开发一个鸿蒙版“抖音”,So easy!

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony技术社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【书籍评测活动NO.53】鸿蒙操作系统设计原理与架构

    的底层设计逻辑出发,针对不同关键子系统的目标功能和实现路径做实际分析解读,帮助开发者理解鸿蒙操作系统的底层逻辑,开发更适合
    发表于 12-16 15:10

    鸿蒙开发管理:ohos.account.distributedAccount 分布式帐号管理

    获取分布式帐号单实例对象。
    的头像 发表于 07-08 10:03 240次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b>管理:ohos.account.distributedAccount <b class='flag-5'>分布式</b>帐号管理

    鸿蒙ArkTS声明开发:跨平台支持列表【分布式迁移标识】 通用属性

    组件的分布式迁移标识,指明了该组件在分布式迁移场景下可以将特定状态恢复到对端设备。
    的头像 发表于 06-07 21:15 394次阅读

    分布式SCADA系统的特点的组成

    在工业自动化和能源管理领域,SCADA(Supervisory Control And Data Acquisition)系统扮演着至关重要的角色。其中,分布式SCADA系统凭借其独特的结构和功能
    的头像 发表于 06-07 14:43 535次阅读

    鸿蒙开发接口数据管理:【@ohos.data.distributedData (分布式数据管理)】

    分布式数据管理为应用程序提供不同设备间数据库的分布式协同能力。通过调用分布式数据各个接口,应用程序可将数据保存到分布式数据库中,并可对分布式
    的头像 发表于 06-07 09:30 971次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b>接口数据管理:【@ohos.data.distributedData (<b class='flag-5'>分布式</b>数据管理)】

    鸿蒙ArkUI:【从代码到UI显示的整体渲染流程】

    方舟开发框架(简称ArkUI)是鸿蒙开发UI框架,提供如下两种开发范式,我们 **只学声明
    的头像 发表于 05-13 16:06 904次阅读
    <b class='flag-5'>鸿蒙</b>ArkUI:【从代码到<b class='flag-5'>UI</b>显示的整体渲染流程】

    HarmonyOS开发实例:【分布式数据服务】

    分布式数据服务(Distributed Data Service,DDS)为应用程序提供不同设备间数据分布式的能力。
    的头像 发表于 04-18 10:18 708次阅读
    HarmonyOS<b class='flag-5'>开发</b>实例:【<b class='flag-5'>分布式</b>数据服务】

    HarmonyOS开发实例:【分布式新闻客户端】

    基于栅格布局、设备管理和多端协同,实现一次开发,多端部署的分布式新闻客户端页面。
    的头像 发表于 04-17 15:57 869次阅读
    HarmonyOS<b class='flag-5'>开发</b>实例:【<b class='flag-5'>分布式</b>新闻客户端】

    HarmonyOS开发实例:【分布式邮件】

    基于TS扩展的声明开发范式编程语言编写的一个分布式邮件系统,可以由一台设备拉起另一台设备,每次改动邮件内容,都会同步更新两台设备的信息
    的头像 发表于 04-17 10:29 759次阅读
    HarmonyOS<b class='flag-5'>开发</b>实例:【<b class='flag-5'>分布式</b>邮件】

    OpenHarmony南向开发案例:【分布式画板】

    使用OpenHarmony3.1-Release开发的应用。通过OpenHarmony的分布式技术,使多人能够一起画画。
    的头像 发表于 04-12 14:40 1036次阅读
    OpenHarmony南向<b class='flag-5'>开发</b>案例:【<b class='flag-5'>分布式</b>画板】

    鸿蒙HarmonyOS开发实战:【分布式音乐播放】

    本示例使用fileIo获取指定音频文件,并通过AudioPlayer完成了音乐的播放完成了基本的音乐播放、暂停、上一曲、下一曲功能;并使用DeviceManager完成了分布式设备列表的显示和分布式能力完成了音乐播放状态的跨设备分享。
    的头像 发表于 04-10 17:51 867次阅读
    <b class='flag-5'>鸿蒙</b>HarmonyOS<b class='flag-5'>开发</b>实战:【<b class='flag-5'>分布式</b>音乐播放】

    鸿蒙OS 分布式任务调度

    鸿蒙OS 分布式任务调度概述 在 HarmonyO S中,分布式任务调度平台对搭载 HarmonyOS 的多设备构筑的“超级虚拟终端”提供统一的组件管理能力,为应用定义统一的能力基线、接口
    的头像 发表于 01-29 16:50 489次阅读

    什么是分布式架构?

    分布式架构是指将一个系统或应用拆分成多个独立的节点,这些节点通过网络连接进行通信和协作,以实现共同完成任务的一种架构模式。这种架构模式旨在提高系统的可扩展性、可靠性和性能表现。 一、分布式
    的头像 发表于 01-12 15:04 1229次阅读
    什么是<b class='flag-5'>分布式</b>架构?

    鸿蒙千帆起】《开心消消乐》完成鸿蒙原生应用开发,创新多端联动用户体验

    加强游戏与玩家之间交互的提醒,用户不需要频繁打开游戏就能接收到游戏中的关键信息,比如精力恢复、新关卡开放、活动信息提醒等,给玩家提供了更加便捷的游戏体验。 同时,HarmonyOS 特有的分布式软总线
    发表于 01-03 10:22

    分布式锁的三种实现方式

    分布式锁的三种实现方式  分布式锁是在分布式系统中用于实现对共享资源进行访问控制的一种机制。分布式
    的头像 发表于 12-28 10:01 895次阅读