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

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

3天内不再提示

在鸿蒙系统的撸引导页代码的经验

OpenHarmony技术社区 来源:中软国际 作者:焦俊盈 2021-09-06 09:25 次阅读

手机 APP 的引导页是一个常见的功能,今天和大家一起分享在鸿蒙系统的撸引导页代码的经验。

应用引导页的功能

①为什么要做应用的引导功能?

几乎所有的 App 都会有做一些界面引导,有的是页面交互的引导,有的是为了介绍新功能。

②通用的功能性引导大概分哪些呢?

主功能引导、新功能引导和功能转移或改名引导。

③通用的应用引导,需要注意哪些?

引导的内容文字不宜太长,适当加入一些图案可以方便用户理解。言归正传吧,开始咱们今天的主题,如何实现应用的引导功能吧!

实现应用的引导功能

具体步骤如下:

首先来看看讨论的引导功能的效果吧!点击引导页,向上滑动过程,第一个界面图案和文字渐变消失的过程。

而第二页界面的图片和文字渐渐清晰可见。底部 Next 图标会下滑隐藏再弹出的动画效果。

开发准备

搭建鸿蒙开发环境,这里就不做介绍了,如果没有环境没有搭建好的同学可以进入学习安装环境, 安装好环境以后接下来我们就可以进行开发工作了。

①设计思路

首先我们做的是公用的组件,我们需要使用组件化思想去搭建我们的项目框架,接下来根据组件的需求我们先去设计一下界面。

设计好之后我们需要对页面添加数据,添加完数据之后组件的大体界面已经展示给我们,下来就是在滑动 page 的时候添加底部 button 的回弹动画,并且在此时我们需要操作 page 的子 view。最后我们要去使用我们的组件。

②设计步骤

(1)设计界面

根据我们要实现的功能,我们可以使用 PageSlider 控件去实现界面布局文件,实现代码为:

《PageSlider

ohos:id=“$+id:vertical_view_pager”

ohos:width=“match_parent”

ohos:height=“match_parent” 》《/PageSlider》

添加数据、初始化数据:

public void setData() {

super.setData();

pageColors = new ArrayList《》();

pageColors.add(getString(ResourceTable.Color_colorAccent));

pageColors.add(getString(ResourceTable.Color_color2));

pageColors.add(getString(ResourceTable.Color_colorPrimary));

pageColors.add(getString(ResourceTable.Color_color3));

pageMoudles = getData();

}

private List《PageMoudle》 getData() {

String textValue = “Lorem Ipsum is simply dummy text of the printing and typesetting industry.”;

PageMoudle pageMoudleOne = new PageMoudle();

pageMoudleOne.setRecoureId(ResourceTable.Graphic_intro_second_vector);

pageMoudleOne.setBackGroudRgbColor(RgbColor.fromArgbInt(Color.getIntColor(pageColors.get(0))));

pageMoudleOne.setTitle(“Lorem Ipsum Lorem Ipsum”);

pageMoudleOne.setText(textValue + textValue + textValue);

pageMoudleOne.setTitleSize(17);

pageMoudleOne.setTextSize(14);

List《PageMoudle》 datas = new ArrayList《》();

datas.add(pageMoudleOne);

PageMoudle pageMoudleTwo = new PageMoudle();

pageMoudleTwo.setRecoureId(ResourceTable.Graphic_four);

pageMoudleTwo.setBackGroudRgbColor(RgbColor.fromArgbInt(Color.getIntColor(pageColors.get(1))));

pageMoudleTwo.setTitle(“Lorem Ipsum Lorem Ipsum ”);

pageMoudleTwo.setText(textValue + textValue);

datas.add(pageMoudleTwo);

PageMoudle pageMoudleThree = new PageMoudle();

pageMoudleThree.setRecoureId(ResourceTable.Graphic_ohos);

pageMoudleThree.setBackGroudRgbColor(RgbColor.fromArgbInt(Color.getIntColor(pageColors.get(2))));

pageMoudleThree.setTitle(“Lorem Ipsum”);

pageMoudleThree.setText(textValue);

datas.add(pageMoudleThree);

PageMoudle pageMoudleFour = new PageMoudle();

pageMoudleFour.setRecoureId(ResourceTable.Media_new_intro);

pageMoudleFour.setBackGroudRgbColor(RgbColor.fromArgbInt(Color.getIntColor(pageColors.get(3))));

pageMoudleFour.setTitle(“Lorem Ipsum”);

pageMoudleFour.setText(textValue + textValue + textValue);

datas.add(pageMoudleFour);

return datas;

}

设置 provider:

pageSlider = (PageSlider) findComponentById(ResourceTable.Id_vertical_view_pager);

pageSlider.setOrientation(Component.VERTICAL);

pageSlider.addPageChangedListener(this);

pageSlider.setTouchEventListener(this::onTouchEvent);

adapter = new VerticalIntroPagerAdapter(this, pageMoudles);

pageSlider.setProvider(adapter);

(2)添加动画

这里我们使用属性动画去完成底部 button 的上弹和下弹操作,上弹和下弹是和我们手指滑动的方向是有关系的。

所以这里我们必须实现手指的触摸事件,在触摸事件中获取我们手机滑动的距离,如果距离大于 0 则是下滑,如果小于 0 则是下滑。

获取是上滑还是下滑代码如下:

@Override

public boolean onTouchEvent(Component component, TouchEvent touchEvent) {

int action = touchEvent.getAction();

switch (action) {

case TouchEvent.PRIMARY_POINT_DOWN:

pageSlider.setSlidingPossible(true);

startPointY = getTouchY(touchEvent, 0, component);

return true;

case TouchEvent.POINT_MOVE:

movePointY = getTouchY(touchEvent, touchEvent.getIndex(), component) - startPointY;

if (page != 0 && movePointY 》 0) {

WindowManager.getInstance().getTopWindow().get().setStatusBarColor(getColorByString(pageColors.get(page - 1)));

}

return true;

case TouchEvent.PRIMARY_POINT_UP:

return true;

default:

}

return false;

}

获取到上滑还是下滑后,接下来就去给底部 button 设置动画。动画用的是属性动画,属性动画大体实现是初始化动画,设置动画持续时间,实现动画属性值变化监听事件,最后启动动画。

大体代码如下:

private void startChangeButtonBg(int direction, int duration) {

if (animatorValue == null) {

animatorValue = new AnimatorValue();

}

animatorValue.setCurveType(Animator.CurveType.LINEAR);

animatorValue.setDuration(duration);

animatorValue.setValueUpdateListener(new AnimatorValue.ValueUpdateListener() {

@Override

public void onUpdate(AnimatorValue animatorValue, float v) {

if (direction 《= 0) {

double value = ((1 - (double)v) * nextHeight) * direction;

next.setMarginBottom((int) value);

} else {

float value = -(v * nextHeight);

next.setMarginBottom((int) value);

if (v 》 0.9) {

if (page == 3) {

skip.setVisibility(Component.INVISIBLE);

next.setText(“DONE”);

next.setNormalColor(pageColors.get(1));

} else {

skip.setVisibility(Component.VISIBLE);

next.setText(“NEXT”);

next.setNormalColor(pageColors.get(page + 1));

}

next.setMarginBottom(0);

}

}

}

});

setAnimStateChangeList(direction);

animatorValue.start();

}

private void setAnimStateChangeList(int direction) {

animatorValue.setStateChangedListener(new Animator.StateChangedListener() {

@Override

public void onStart(Animator animator) {

if (direction 《= 0) {

if (page == 3) {

skip.setVisibility(Component.INVISIBLE);

next.setText(“DONE”);

next.setNormalColor(pageColors.get(1));

} else {

skip.setVisibility(Component.VISIBLE);

next.setText(“NEXT”);

next.setNormalColor(pageColors.get(page + 1));

}

}

}

@Override

public void onStop(Animator animator) {

}

@Override

public void onCancel(Animator animator) {

}

@Override

public void onEnd(Animator animator) {

movePointY = 0;

}

@Override

public void onPause(Animator animator) {

}

@Override

public void onResume(Animator animator) {

}

});

}

(3)操作子 view

如何去操作子 view 呢?首先我们先去看看 PageSlider 是否有子 view 的操作监听接口,查看 api 后没有这样的接口获取方法,那就得我们自己去考虑怎么实现呢。

我这里的实现思路是在 PageSlider 设置 provider 的时候保存所有的子 view 对象,然后再使用的时候拿出子 view 再进行操作。

我们这里例子是改变子 view 的透明度。代码实现如下:

保存子 view:

public class VerticalIntroPagerAdapter extends PageSliderProvider {

LinkedHashMap《Integer, Component》 pageComonents;

public VerticalIntroPagerAdapter(Context context, List《PageMoudle》 datas) {

this.context = context;

this.datas = datas;

pageComonent = new ArrayList《》();

// 初始化用来添加子view的集合,注意这里是一个有序集合

pageComonents = new LinkedHashMap《Integer, Component》();

}

//添加子view

@Override

public Object createPageInContainer(ComponentContainer componentContainer, int i) {

if (!pageComonents.containsValue(component)) {

pageComonents.put(i, component);

}

}

}

操作子 view:

private void setPageApale(int currentPage, int targetPage, float offset) {

if (adapter.pageComonents != null && adapter.pageComonents.get(currentPage) != null

&& adapter.pageComonents.get(targetPage) != null) {

float alpha = new BigDecimal(1.0f).subtract(new BigDecimal(offset).multiply(new BigDecimal(2))).floatValue();

if (offset 》= 0.4 && offset 《= 0.9) {

offset = new BigDecimal(offset).subtract(new BigDecimal( 0.4f)).floatValue();

} else if (offset 《 0.4) {

offset = 0.0f;

} else {

offset = 1.0f;

}

setApale(currentPage, targetPage, alpha, offset);

}

}

到这里我们的竖直引导工具组件就已经封装好了。

(4)使用组件

如何去使用我们的组件呢?这里我们用的是组件化思想。所以我们呢只需要在我们的项目中引入我们的组件,然后在我们的 ablity 中集成我们封装好的 VerticalIntroSlice 对象就行。

最后我们再把封装一个添加数据的接口,把我们的数据变成动态添加的就行。

结语

到此我们的整个设计流程就完了,通过上面的操作,相信小伙伴们就可以实现应用引导功能了。

责任编辑:haq

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

    关注

    33

    文章

    1529

    浏览量

    71623
  • 鸿蒙系统
    +关注

    关注

    183

    文章

    2605

    浏览量

    65264
  • HarmonyOS
    +关注

    关注

    79

    文章

    1802

    浏览量

    29254

原文标题:在鸿蒙手机上撸一个APP引导页!

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

收藏 人收藏

    评论

    相关推荐

    鸿蒙系统三防平板怎么样

    鸿蒙系统三防平板采用了高强度金属材质和防水防尘设计,使其具备出色的抗压能力和耐候性能。恶劣环境下,这款平板电脑能够抵御风雨、沙尘等自然因素的侵袭,保证设备的正常运行。同时,其坚固耐用的外壳也能有
    发表于 04-12 14:26

    鸿蒙这么大声势,为何迟迟看不见岗位?最新数据来了

    。 话不多说,我们直接看详细资料鸿蒙(OpenHarmony )学习手册(共计1236)与鸿蒙(OpenHarmony )开发入门教学视频,帮助大家技术的道路上更进一步。 可+ m
    发表于 02-29 20:53

    纯血鸿蒙系统,拿什么与安卓、iOS比?

    、数码、车载等等一系列生态闭环。 而华为鸿蒙是全栈自研底座,从AI大模型、AI框架、安全隐私、集成开发环境、设计系统、编程框体、编译器、编程语言和文件系统,到操作系统内核。去掉了传统
    发表于 02-21 21:04

    鸿蒙开发者预览版如何?

    Linux内核以及AOSP代码,采用的鸿蒙内核以及代码,HarmonyOS NEXT系统仅支持鸿蒙内核和
    发表于 02-17 21:54

    那些杠鸿蒙的现在怎么样了?

    别杠,要杠就是你对。 一个纯血鸿蒙就已经打了那些杠精的嘴,以前是套壳Android,大家纷纷喷鸿蒙。现在鸿蒙已经全栈自研,并且已经展开各大企业生态合作。不管什么独立系统,都是一定要走一
    发表于 02-16 22:03

    【年度精选】2023年度top5榜单——鸿蒙开发经验

    这些经验帖是2023年最受鸿蒙爱好者喜爱的开发经验分享,内容涵盖了鸿蒙系统开发的各个方面。无论是初学者还是资深开发者,都能从中获得有益的启示
    发表于 01-10 17:19

    嵌入式系统Nor Flash引导存储器和固件存储有何关系?

    嵌入式系统需要可靠且快速的引导存储器来在系统启动期间加载初始引导代码和操作系统
    的头像 发表于 12-05 14:08 337次阅读

    华为鸿蒙系统

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

    鸿蒙 OS 应用开发初体验

    Package 的缩写)。是鸿蒙操作系统设计的应用程序包格式。 .hap 文件包含了应用程序的代码、资源和元数据等信息,用于 HarmonyOS 设备上安装和运行应用程序。 整
    发表于 11-02 19:38

    鸿蒙操作系统的前世今生

    研发鸿蒙操作系统的号角。 2019年8月9号,华为正式发布了HarmonyOS 1.0,该系统率先部署智慧屏上。2019年8月10日,(原)荣耀正式发布荣耀智慧屏、荣耀智慧屏Pro,
    发表于 10-08 19:55

    ARMv8-A处理器的裸机引导代码

    硬件验证工程师经常运行裸机测试来验证片上系统(SoC)中与内核相关的功能。 然而,没有对ARM体系结构上的软件开发有基本了解的情况下,为裸机系统编写引导
    发表于 08-23 06:20

    10.2.431.6 LPe16000-series固件和引导代码版本

    电子发烧友网站提供《10.2.431.6 LPe16000-series固件和引导代码版本.zip》资料免费下载
    发表于 08-15 10:48 0次下载
    10.2.431.6 LPe16000-series固件和<b class='flag-5'>引导</b><b class='flag-5'>代码</b>版本

    10.0.803.19 OCe11000-Series固件和引导代码版本

    电子发烧友网站提供《10.0.803.19 OCe11000-Series固件和引导代码版本.zip》资料免费下载
    发表于 08-09 15:10 0次下载
    10.0.803.19 OCe11000-Series固件和<b class='flag-5'>引导</b><b class='flag-5'>代码</b>版本

    固件和10.2.370.15引导代码版本

    电子发烧友网站提供《固件和10.2.370.15引导代码版本.zip》资料免费下载
    发表于 07-29 10:34 0次下载
    固件和10.2.370.15<b class='flag-5'>引导</b><b class='flag-5'>代码</b>版本

    10.2.370.19 OCe14000-Series固件和引导代码版本

    电子发烧友网站提供《10.2.370.19 OCe14000-Series固件和引导代码版本.zip》资料免费下载
    发表于 07-28 15:02 0次下载
    10.2.370.19 OCe14000-Series固件和<b class='flag-5'>引导</b><b class='flag-5'>代码</b>版本