更多信息请访问:https://harmonyos.51cto.comHarmonyos.51cto.com手机APP引导页面为通用功能。今天和大家分享一下鸿蒙系统中引导页的代码体验。一、申请指南页面的功能1.1为什么需要申请指南功能?几乎所有的App都会提供一些界面指南,有的是页面交互指南,有的是介绍新功能的。1.2一般功能指导有哪些?主要功能指导、新功能指导和功能转移或更名指导。1.3.一般申请指导要注意什么?引导内容的文字不宜过长,可适当增加一些花样,方便用户理解。言归正传,开始今天的主题,如何实现应用的引导功能!2.实现应用引导功能的具体步骤:首先我们来看看讨论的引导功能的效果!点击引导页,向上滑动过程,第一个界面图案和文字渐变消失的过程。第二页界面的图片和文字渐渐可见。底部的Next图标下滑隐藏再弹出的动画效果。开发准备搭建鸿蒙开发环境,这里就不介绍了。如果没有环境也没有设置,可以进入学习安装环境。环境安装好后,我们就可以开始开发工作了。2.1设计思路首先我们做的是公共组件。我们需要使用组件思维来构建我们的项目框架。接下来,我们将根据组件的需求来设计界面。设计完成后,我们需要给页面添加数据。添加完数据后,组件的大致界面已经展现在我们面前了。接下来就是添加滑动页面时底部按钮的回弹动画,这时候我们需要对页面的子视图进行操作。最后我们要使用我们的组件。2.2设计步骤2.2.1设计界面根据我们要实现的功能,可以使用PageSlider控件来实现界面布局文件。实现代码为:(1)添加数据,初始化数据publicvoidsetData(){super.setData();pageColors=newArrayList<>();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();}privateListgetData(){StringtextValue="LoremIpsumissimsimplydummytextoftheprintingandtypesettingindustry.";PageMoudlepageMoudleOne=newPageMoudle();pageMoudleOne.setRecoureId(ResourceTable.Graphic_intro_second_vector);pageMoudleOne。setBackGroudRgbColor(RgbColor.fromArgbInt(Color.getIntColor(pageColors.get(0))));pageMoudleOne.setTitle("LoremIpsumLoremIpsum");pageMoudleOne.setText(textValue+textValue+textValue);pageMoudleOne.setTitleSize(17);pageMoudleOne.setTextSize(14);Listdatas=newArrayList<>();datas.add(pageMoudleOne);PageMoudlepageMoudleTwo=newPageMoudle();pageMoudleTwo。setRecoureId(ResourceTable.Graphic_four);pageMoudleTwo.setBackGroudRgbColor(RgbColor.fromArgbInt(Color.getIntColor(pageColors.get(1))));pageMoudleTwo.setTitle("LoremIpsumLoremIpsum");pageMoudleTwo.setText(textValue+textValue);datas.add(pageMoudleTwo);PageMoudlepageMoudleThree=newPageMoudle();pageMoudleThree.setRecoureId(ResourceTable.Graphic_ohos);pageMoudleThree.setBackGroudRgbColor(RgbColor.fromArgbInt(Color.getIntColor(pageColors.get(2))));pageMoudleThree.setTitle("LoremIpsum"pageMoudleThree.setText(textValue);datas.add(pageMoudleThree);PageMoudlepageMoudleFour=newPageMoudle();pageMoudleFour.setRecoureId(ResourceTable.Media_new_intro);pageMoudleFour.setBackGroudRgbColor(RgbColor.fromArgbInt(Color.getIntColor(pageColors.get(3)));pageMoudleFour.setTitle("LoremIpsum");pageMoudleFour.setText(textValue+textValue+textValue);datas.add(pageMoudleFour);returndatas;}(2)setproviderpageSlider=(PageSlider)findComponentById(ResourceTable.Id_vertical_view_pager);pageSlider.setOrientation(Component.VERTICAL);pageSlider.addPageChangedListener(this);pageSlider.setTouchEventListener(this::onTouchEvent);adapter=newVerticalIntroPagerAdapter(this,pageMoudles);pageSlider.setProvider(apterProvider)2.2.2添加动画这里我们使用属性动画来完成底部按钮的上下操作。上下与我们手指滑动的方向有关,所以这里要实现手指的触摸事件。获取我们手机在触摸事件中的滑动距离。如果距离大于0,它将向下滑动。如果小于0,它将向下滑动。(1)获取是否向上滑动或向下滑动的代码如下:@OverridepublicbooleanonTouchEvent(Componentcomponent,TouchEventtouchEvent){intaction=touchEvent.getAction();switch(action){caseTouchEvent.PRIMARY_POINT_DOWN:pageSlider.setSlidingPossible(true);startPointY=getTouchY(touchEvent,0,component);returntrue;caseTouchEvent.POINT_MOVE:movePointY=getTouchY(touchEvent,touchEvent.getIndex(),component)-startPointY;if(page!=0&&movePointY>0){WindowManager.getInstance().getTopWindow().get().setStatusBarColor(getColorByString(pageColors.get(page-1)));}returntrue;caseTouchEvent.PRIMARY_POINT_UP:returntrue;default:}returnfalse;}(2)获取上滑或下滑后,下一步是为底部按钮设置动画。动画使用属性动画,属性动画的一般实现是初始化动画和设置动画时长。实现动画属性值变化监听事件,最终启动动画大体代码如下:privatevoidstartChangeButtonBg(intdirection,intduration){if(animatorValue==null){animatorValue=newAnimatorValue();}animatorValue.setCurveType(Animator.CurveType.LINEAR);animatorValue.setDuration(duration);animatorValue.setValueUpdateListener(newAnimatorValue.ValueUpdateListener(){@OverridepublicvoidonUpdate(AnimatorValueanimatorValue,floatv){if(direction<=0){doublevalue=((1-(double)v)*nextHeight)*direction;next.setMarginBottom((int)value);}else{floatvalue=-(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();}privatevoidsetAnimStateChangeList(intdirection){animatorValue.setStateChangedListener(newAnimator.S)tateChangedListener(){@OverridepublicvoidonStart(Animatoranimator){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));}}}@OverridepublicvoidonStop(Animatoranimator){}@OverridepublicvoidonCancel(Animatoranimator){}@OverridepublicvoidonEnd(Animatoranimator){movePointY=0;}@OverridepublicvoidonPause(Animatoranimator){}@OverridepublicvoidonResume(Animatoranimator){}});}2.2.3如何操作子视图?首先我们看看PageSlider是否有子view的运行监控接口。查看了api,并没有这种接口获取方法,只好自己想办法实现了。我这里的实现思路是在PageSlider设置provider的时候保存。所有子视图对象,再次使用时取出子视图进行操作我们这里的例子是改变子视图的透明度。代码实现如下:(1)保存子视图newArrayList<>();//初始化用于添加子视图的集合,注意这是一个有序的集合{if(!pageComonents.containsValue(component)){pageComonents.put(i,component);}}}(2)operatorviewprivatevoidsetPageApale(intcurrentPage,inttargetPage,floatoffset){if(adapter.pageComonents!=null&&adapter.pageComonents.get(currentPage)!=null&&adapter.pageComonents.get(targetPage)!=null){floatalpha=newBigDecimal(1.0f).subtract(newBigDecimal(offset).multiply(newBigDecimal(2))).floatValue();if(偏移量>=0.4&&offset<=0.9){offset=newBigDecimal(offset).subtract(newBigDecimal(0.4f)).floatValue();}elseif(offset<0.4){offset=0.0f;}else{offset=1.0f;}setApale(currentPage,targetPage,alpha,offset);}}去这里我们的垂直导向工具组件已经打包。2.2.4使用组件如何使用我们的组件?这里我们使用组件化的思想。所以我们只需要在我们的项目中引入我们的组件,然后在我们的ability中集成我们封装的VerticalIntroSlice对象即可,最后封装一个添加数据的接口,把我们的数据变成动态添加。3.结论至此,我们的整个设计过程就结束了。通过以上操作,相信小伙伴们可以实现应用引导功能了。更多信息请访问:Harmonyos.51cto.com,与华为官方合作打造的鸿蒙技术社区