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

    文章

    2903

    浏览量

    102928
  • 鸿蒙系统
    +关注

    关注

    183

    文章

    2603

    浏览量

    65220
  • HarmonyOS
    +关注

    关注

    79

    文章

    1762

    浏览量

    29223

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

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

收藏 人收藏

    评论

    相关推荐

    未来从事鸿蒙开发?是否会有前景?

    应届毕业生:有一定Java编程基础,系统学习鸿蒙应用开发 想转行/跨行人员:求职、转行,希望赶上时代风口并弯道超车 IT相关工作者:工作遇上瓶颈,想提升技能,升职加薪
    发表于 02-19 21:31

    java后端能转鸿蒙app开发

    java后端转鸿蒙app开发好。 还是前端呢
    发表于 01-29 18:15

    鸿蒙OS 分布式任务调度

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

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

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

    鸿蒙原生应用开发——分布式数据对象

    分布式数据对象保存 6、分布式数据对象订阅(数据变更,上下线) 7、分布式数据对象加入、退出分布式组网 03、前提准备 1、开发工具:De
    发表于 12-08 10:01

    分布式系统硬件资源池原理和接入实践

    提供更好的服务体验。 图 3 鸿蒙硬件资源池支持各类消费者场景 2.2 开发者场景 对于开发者来说,由于分布式硬件资源池将跨设备硬件调用的复杂度都封装在了
    发表于 12-06 10:02

    Java手写分布式锁的实现

    随着互联网业务的发展,原本单机部署的系统演化成如今的分布式集群系统后,由于分布式系统多线程
    的头像 发表于 11-17 15:51 234次阅读
    <b class='flag-5'>Java</b>手写<b class='flag-5'>分布式</b>锁的实现

    HarmonyOS分布式文件系统开发指导

    各个设备结点提供一个全局一致的访问视图,支持开发者通过基础文件系统接口进行读写访问,具有高性能、低延时等优点。 分布式文件系统架构 ● distributedfile_daemon:
    发表于 11-14 17:14

    华为鸿蒙系统

    华为鸿蒙系统(HUAWEI Harmony OS),是华为公司在2019年8月9日于东莞举行的华为开发者大会(HDC.2019)上正式发布的操作系统。 华为
    发表于 11-02 19:39

    鸿蒙 OS 应用开发初体验

    什么是 HarmonyOS? HarmonyOS(鸿蒙操作系统)是华为公司开发的一款基于微内核的分布式操作系统。它是一个面向物联网(IoT)
    发表于 11-02 19:38

    鸿蒙操作系统的前世今生

    能力整合,可以实现不同终端设备之间的快速连接、能力互助、资源共享,匹配合适的设备、提供流畅的全场景体验。 对应用开发者而言, 鸿蒙操作系统采用了多种分布式技术,使应用程序的
    发表于 10-08 19:55

    鸿蒙应用ui布局

    请问,在用java开发鸿蒙应用布局UI时,怎么才能全屏布局(不显示labelb标题)
    发表于 09-20 22:09

    基于ZigBee的分布式井盖监控系统

    随着我国现代经济发展水平的不断提高,城市井盖数目逐渐增加。由于较多井盖被盗,致使路面形成陷阱,危害到过往车辆和行人安全。本文提出了一种基于 ZigBee无线网络的智能安全监控系统,解决分布式布控困难
    发表于 09-18 08:46

    OpenHarmony 分布式硬件关键技术

    OpenHarmony技术峰会——生态与互联分论坛 ​ 正 文 内 容 OpenHarmony是一款面向未来万物互联场景的操作系统,其设计采用了分布式架构。那么OpenHarmony相比于传统操作系统
    发表于 08-24 17:25

    #分布式数据

    分布式数据
    未来加油dz
    发布于 :2023年07月03日 22:58:32