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

    文章

    3005

    浏览量

    116812
  • 鸿蒙系统
    +关注

    关注

    183

    文章

    2642

    浏览量

    70106
  • HarmonyOS
    +关注

    关注

    80

    文章

    2156

    浏览量

    36277

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    2022全新版!Java分布式架构设计与开发实战(完结)

    2022全新版!Java分布式架构设计与开发实战(完结) 分库分表实战:Java海量数据存储架构设计 在现代互联网应用中,随着业务规模的指数级增长,数据库性能瓶颈已成为制约
    发表于 03-30 15:20

    分布式迭代求解策略:分布式混合电推进系统飞发一体化设计与能量管理协同优化方法

    随着全球航空业对绿色环保要求的不断提高,分布式混合电推进系统作为传统航空动力向全电飞行器过渡的关键技术,展现出巨大的发展潜力。本文围绕半涡电分布式推进系统的动态实时建模与控制方法展开
    的头像 发表于 03-27 08:54 179次阅读
    <b class='flag-5'>分布式</b>迭代求解策略:<b class='flag-5'>分布式</b>混合电推进<b class='flag-5'>系统</b>飞发一体化设计与能量管理协同优化方法

    SC-3568HA:解锁鸿蒙全权限API与分布式能力的工业控制平台

    传统嵌入式开发面临硬件碎片化、高权限功能缺失、分布式协同复杂及自动化测试不足等痛点。SC-3568HA开发板基于鸿蒙系统,通过统一内核抽象层
    的头像 发表于 12-18 11:27 7510次阅读
    SC-3568HA:解锁<b class='flag-5'>鸿蒙</b>全权限API与<b class='flag-5'>分布式</b>能力的工业控制平台

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

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

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

    作为全球领先的短视频平台,其电商业务近年来蓬勃发展,吸引了众多商家和消费者。实时监测电商活动热度,对于商家优化营销策略、平台提升用户体验至关重要。电商 API 接口为
    的头像 发表于 08-21 15:30 912次阅读
    <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 1007次阅读
    揭秘<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 1334次阅读
    巧用<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 1342次阅读
    <b class='flag-5'>抖</b><b class='flag-5'>音</b>电商 API 接口:开启<b class='flag-5'>抖</b><b class='flag-5'>音</b>小店直播带货数据新洞察

    分布式光伏总出问题?安科瑞分布式光伏监控系统来“救场”

    一、分布式光伏的痛点大揭秘 在 “双碳” 目标的大力推动下,分布式光伏作为绿色能源领域的重要力量,正以前所未有的速度蓬勃发展,越来越多的企业和家庭选择安装分布式光伏系统。然而,随着
    的头像 发表于 07-16 16:50 937次阅读
    <b class='flag-5'>分布式</b>光伏总出问题?安科瑞<b class='flag-5'>分布式</b>光伏监控<b class='flag-5'>系统</b>来“救场”

    Ceph分布式存储系统解析

    在当今数据爆炸的时代,企业对存储系统的需求日益增长,传统的集中式存储已经无法满足大规模数据处理的要求。分布式存储系统应运而生,而Ceph作为开源分布式存储
    的头像 发表于 07-14 11:15 1188次阅读

    分布式光伏发电监控系统

    对高、低压并网分布式光伏电站的升压系统、光伏逆变器等设备进行全面监控,采集微机保护装置、自动控制设备、电能质量监测装置、光伏逆变器、一体化电源等设备数据,并提供有功功率控制(AGC)、电压无功综合
    的头像 发表于 06-25 13:41 1122次阅读
    <b class='flag-5'>分布式</b>光伏发电监控<b class='flag-5'>系统</b>

    双电机分布式驱动汽车高速稳定性机电耦合控制

    摘要:为了利用所设计的双电机防滑差速驱动系统来提高分布式驱动汽车的动力学性能,在前期同轴耦合驱动控制理论研究的基础上,开展该车的高速稳定性机电耦合控制研究。建立并验证包含所设计驱动系统在内的
    发表于 06-18 16:37

    分布式光伏监测难?并网型分布式光伏系统光伏功率预测方案

    一、分布式光伏发电系统   安科瑞 邹玉丽   分布式光伏发电系统的基本设备包括光伏电池组件、光伏方阵支架、直流汇流箱、直流配电柜、并网逆变器、交流配电柜等设备,另外还有供电
    的头像 发表于 05-20 10:17 1410次阅读
    <b class='flag-5'>分布式</b>光伏监测难?并网型<b class='flag-5'>分布式</b>光伏<b class='flag-5'>系统</b>光伏功率预测方案

    多通道电源管理芯片在分布式能源系统中的优化策略

    摘要: 随着分布式能源系统的广泛应用,对电源管理芯片的性能要求日益提升。本文深入探讨了多通道电源管理芯片在分布式能源系统中的优化策略,以国科安芯的ASP4644芯片为例,从电气特性、工
    的头像 发表于 05-16 15:22 1071次阅读