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
    +关注

    关注

    20

    文章

    2997

    浏览量

    115665
  • 鸿蒙系统
    +关注

    关注

    183

    文章

    2642

    浏览量

    69337
  • HarmonyOS
    +关注

    关注

    80

    文章

    2146

    浏览量

    35572

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【节能学院】Acrel-1000DP分布式光伏监控系统在奉贤平高食品 4.4MW 分布式光伏中应用

    摘要:在“双碳”和新型电力系统建设背景下,分布式光伏接入比例不断提高,对配电网电压、调度运行及调峰等环节造成强烈冲击。本文设计包含平台层、设备层二层架构体系的分布式光伏管控平台,以及小容量工商业
    的头像 发表于 08-23 08:04 3306次阅读
    【节能学院】Acrel-1000DP<b class='flag-5'>分布式</b>光伏监控<b class='flag-5'>系统</b>在奉贤平高食品 4.4MW <b class='flag-5'>分布式</b>光伏中应用

    分布式光伏发电监测系统技术方案

    分布式光伏发电监测系统技术方案 柏峰【BF-GFQX】一、系统目标 :分布式光伏发电监测系统旨在通过智能化的监测手段,实现对
    的头像 发表于 08-22 10:51 2883次阅读
    <b class='flag-5'>分布式</b>光伏发电监测<b class='flag-5'>系统</b>技术方案

    电商 API 接口:平台电商活动热度实时监测

    作为全球领先的短视频平台,其电商业务近年来蓬勃发展,吸引了众多商家和消费者。实时监测电商活动热度,对于商家优化营销策略、平台提升用户体验至关重要。电商 API 接口为
    的头像 发表于 08-21 15:30 562次阅读
    <b class='flag-5'>抖</b><b class='flag-5'>音</b>电商 API 接口:<b class='flag-5'>抖</b><b class='flag-5'>音</b>平台电商活动热度实时监测

    揭秘电商 API,让小店粉丝增长有迹可循

    “透明路径”。本文将逐步揭秘电商 API 的使用方法,帮助您实现粉丝增长的可视化与可控化。 一、什么是电商 API?
    的头像 发表于 08-20 15:46 573次阅读
    揭秘<b class='flag-5'>抖</b><b class='flag-5'>音</b>电商 API,让<b class='flag-5'>抖</b><b class='flag-5'>音</b>小店粉丝增长有迹可循

    巧用电商 API,精准分析商品种草效果

    API,结合数据分析,实现精准量化种草效果。文章结构清晰,从基础概念到实践步骤,逐步指导您操作。所有方法基于真实电商场景,确保可靠性和可操作性。 一、电商 API 简介与接入
    的头像 发表于 08-20 15:29 762次阅读
    巧用<b class='flag-5'>抖</b><b class='flag-5'>音</b>电商 API,精准分析<b class='flag-5'>抖</b><b class='flag-5'>音</b>商品种草效果

    电商 API 接口:开启小店直播带货数据新洞察

    深入探讨该 API 如何赋能用户,实现直播带货数据的实时监控、深度分析和决策支持,开启数据驱动的新时代。 一、电商 API 接口的核心功能 电商 API 接口是
    的头像 发表于 08-20 15:20 667次阅读
    <b class='flag-5'>抖</b><b class='flag-5'>音</b>电商 API 接口:开启<b class='flag-5'>抖</b><b class='flag-5'>音</b>小店直播带货数据新洞察

    分布式光伏发运维系统实际应用案例分享

    安科瑞刘鸿鹏 摘 要 分布式光伏发电系统其核心特点是发电设备靠近用电负荷中心,通常安装在屋顶、建筑立面或闲置空地上,截至2025年,分布式光伏发电系统在全球和中国范围内取得了显著发展,
    的头像 发表于 04-09 14:46 991次阅读
    <b class='flag-5'>分布式</b>光伏发运维<b class='flag-5'>系统</b>实际应用案例分享

    浅谈分布式光伏系统在工业企业的设计及应用

    主要对工业厂区屋顶分布式光伏发电系统的设计及应用进行研究,为工业厂区能源供应提供一种全新的解决思路和技术支持。介绍了工业厂区屋顶分布式光伏系统及其优势,分析了工业厂区屋顶
    的头像 发表于 03-21 14:24 726次阅读
    浅谈<b class='flag-5'>分布式</b>光伏<b class='flag-5'>系统</b>在工业企业的设计及应用

    【「鸿蒙操作系统设计原理与架构」阅读体验】02-华为鸿蒙设计理念

    多种不同类型的 HarmonyOS 设备上,大大节省了开发时间和成本 。 分布式 UI 框架是 DevEco Studio 的另一大亮点,它为开发者提供了一套统一的
    发表于 02-23 16:16

    分布式云化数据库有哪些类型

    分布式云化数据库有哪些类型?分布式云化数据库主要类型包括:关系型分布式数据库、非关系型分布式数据库、新SQL分布式数据库、以列方式存储数据、
    的头像 发表于 01-15 09:43 867次阅读

    AIGC入门及鸿蒙入门

    JDK、配置SDK等。 3. 开发实践: 学习鸿蒙系统的架构和API,了解其组件化、分布式等特性。 通过官方文档和社区资源,学习和掌握鸿蒙
    发表于 01-13 10:32

    基于ptp的分布式系统设计

    在现代分布式系统中,精确的时间同步对于确保数据一致性、系统稳定性和性能至关重要。PTP(Precision Time Protocol)是一种网络协议,用于在分布式
    的头像 发表于 12-29 10:09 975次阅读

    HarmonyOS Next 应用元服务开发-分布式数据对象迁移数据文件资产迁移

    提供了async版本供该场景使用。 当前,wantParams中“sessionId”字段在迁移流程中被系统占用,建议开发者在wantParams中定义其他key值存储该分布式数据对象生成的id,避免
    发表于 12-24 10:11

    HarmonyOS Next 应用元服务开发-分布式数据对象迁移数据权限与基础数据

    提供了async版本供该场景使用。 当前,wantParams中“sessionId”字段在迁移流程中被系统占用,建议开发者在wantParams中定义其他key值存储该分布式数据对象生成的id,避免
    发表于 12-24 09:40

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

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