侵权投诉

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

HarmonyOS技术社区 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引导页!

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

收藏 人收藏
分享:

评论

相关推荐

开源大师兄 青少年OpenHarmony开发板硬件特性介绍

继OpenHarmony 3.0  LTS版本于 2021 年 9 月 30 日上线以来,在包括教育....
发表于 10-27 12:14 92次 阅读
开源大师兄 青少年OpenHarmony开发板硬件特性介绍

《道德经》原子化服务UX历程和后续升级计划

发表于 10-27 11:36 0次 阅读
《道德经》原子化服务UX历程和后续升级计划

网易云和腾讯互掐起来了?鸿蒙“后院”起火了

今天打开手机老王看到了一条有意思的新闻:“网易云和腾讯QQ音乐都说自己是第一家接入鸿蒙的流媒体音乐,要互掐了吗?” 发...
发表于 10-27 10:08 0次 阅读

HDC技术分论坛:HarmonyOS新一代UI框架的全面解读

作者:yuzhiqiang,UI编程框架首席技术专家在Harmony 3.0.0开发者预览版中,包含了新一代的声明式UI框架ArkUI 3.0、多语...
发表于 10-26 18:48 101次 阅读
HDC技术分论坛:HarmonyOS新一代UI框架的全面解读

HarmonyOS IDE工具DevEco 新版本3.0 Beta1发布

2021年10月22日的华为开发者大会HDC.Together 2021主题演讲会上,我们发布了HarmonyOS 3.0.0开发者预览版。预览版本中包含...
发表于 10-26 18:16 202次 阅读
HarmonyOS IDE工具DevEco 新版本3.0 Beta1发布

鸿蒙3.0给业内带来了哪些惊喜

据海外调研机构数据预测,2021年全球移动操作系统市场,Android占据73%的市场份额,苹果iO....
的头像 电子发烧友网 发表于 10-26 17:35 326次 阅读

第二届HarmonyOS开发者创新大赛正式启动 梦想再度启航

在10月22日举办的 华为 开发者大会(Together)上,第二届“ HarmonyOS 开发者创....
发表于 10-26 17:09 75次 阅读
第二届HarmonyOS开发者创新大赛正式启动 梦想再度启航

华为开发者大会有什么亮点

华为开发者大会2021于10月22至24在广东松山湖举行,开发者大会HDC 2021主题演讲嘉宾阵容....
的头像 lhl545545 发表于 10-26 17:03 274次 阅读

什么人会叁加华为开发者大会

华为开发者大会2021在广东东莞盛大召开,2021华为开发者大会参会者有华为专家、全球开发者等受邀参....
的头像 lhl545545 发表于 10-26 16:42 299次 阅读

华为开发者大会2021 10月官网

华为开发者大会2021近日正式在广东举行,本次大会聚焦HarmonyOS、智能家居、智慧办公、HMS....
的头像 lhl545545 发表于 10-26 16:26 350次 阅读

“饭圈女孩”: 拥有这款APP,你离爱豆更进一步!

Ins,是越来越多国内、国外明星们日亦喜爱的东西,如同许多国外名人开通微博一样。开通ins账号,也是....
发表于 10-26 15:20 24次 阅读
“饭圈女孩”: 拥有这款APP,你离爱豆更进一步!

HDC2021HarmonyOS学生公开课:校园布道未来可循

为了让学生了解HarmonyOS最新技术、商业价值、生态价值,以及学生开发者如何成长等信息,10月2....
的头像 话说科技 发表于 10-26 15:06 161次 阅读
HDC2021HarmonyOS学生公开课:校园布道未来可循

HarmonyOS原子化服务新赛道:系统级入口服务中心

10月22日-24日,为期三天的华为开发者大会2021(Together)在东莞举行。本次大会《Ha....
的头像 话说科技 发表于 10-26 15:05 189次 阅读
HarmonyOS原子化服务新赛道:系统级入口服务中心

华为开发者大会2021上市股票

华为开发者大会2021上市股票有哪些?华为开发者大会2021上市股票有中国长城、中国软件、金山办公、....
的头像 lhl545545 发表于 10-26 14:37 205次 阅读

华为2021开发者大会最新消息

华为开发者大会2021在中国松山湖举行,会上,华为公司基于OpenHarmony提供了Harmony....
的头像 lhl545545 发表于 10-26 14:20 189次 阅读

2021华为开发者大会介绍

华为开发者大会2021精彩纷呈,大会上主要聚焦了HarmonyOS、智慧办公、HMS Core等热门....
的头像 lhl545545 发表于 10-26 11:45 236次 阅读

Harmony应用开发--自定义标题栏实战

在Harmony开发过程中,如果对系统标题栏感到不满意,可以进行自行修改设计。配置文件(config.json)修改,在module下添加下面内...
发表于 10-26 11:37 101次 阅读
Harmony应用开发--自定义标题栏实战

华为开发者大会全程回顾

华为开发者大会2021(Together)在东莞松山湖已经完美落幕,下面我们一起来看看2021华为开....
的头像 lhl545545 发表于 10-26 11:16 213次 阅读

华为开发者大会2021鸿蒙系统升级

2021华为开发者大会10月22日至24日如期在松山湖举行,会上,华为正式发布了HarmonyOS3....
的头像 lhl545545 发表于 10-26 10:08 251次 阅读

分析 | 顶象iOS应用加固,如何助力App上架苹果商城

当前,中国经济正在转入高质量发展阶段,基于新一代信息技术飞速发展带来的引领性基础,以及创新驱动、高质....
的头像 话说科技 发表于 10-26 09:58 151次 阅读
分析 | 顶象iOS应用加固,如何助力App上架苹果商城

华为开发者大会在哪里看

2021年华为开发者大会近日正式在东莞松山湖举行,会上华为发布了HarmonyOS 3开发者预览版、....
的头像 lhl545545 发表于 10-26 09:56 171次 阅读

万物智联与烟火人间 HDC 2021华为开发者大会 一场跨越20年的双向奔赴

自从2011年,Gartner在著名的“新兴技术炒作周期”上,增加了一个新技术名词:物联网。IoT从....
的头像 脑极体 发表于 10-26 09:00 814次 阅读
万物智联与烟火人间 HDC 2021华为开发者大会 一场跨越20年的双向奔赴

华为开发者大会2021在哪

华为开发者大会2021在广东东莞松山湖举行,时间为三天,10月22至24天,华为官方已经公布了开发者....
的头像 lhl545545 发表于 10-25 17:53 448次 阅读

太强了!华为自研鸿蒙编程语言,行业大佬都已经偷偷学起来了

华为开发者大会 2021(Together)上,Harmony OS 3 开发者预览版正式发布,华为鸿蒙又是一个历史性的进步啊,而且,华为还表...
发表于 10-25 16:53 270次 阅读

华为开发者大会2021概念股

  华为开发者大会2021在10月22至24日在东莞松山湖如期举行,中国软件万兴科技等鸿蒙概念股有望....
的头像 lhl545545 发表于 10-25 16:44 323次 阅读

华为开发者大会值得参加吗

2021华为开发者大会值得参加。10月22至24日,2021华为开发者大会聚焦行业技术大咖发表了技术....
的头像 lhl545545 发表于 10-25 16:15 143次 阅读

2021华为开发者大会分论坛

华为开发者大会2021近日在广东如期举行,本次大会HarmonyOS鸿蒙生态成为重要参与者,华为除了....
的头像 lhl545545 发表于 10-25 15:56 320次 阅读

HarmonyOS 3.0.0开发者预览版全新发布

2021年10月22日在华为开发者大会HDC.Together 2021 主题演讲上,我们发布了HarmonyOS 3.0.0开发者预览版,主要内容包括:...
发表于 10-25 15:49 402次 阅读
HarmonyOS 3.0.0开发者预览版全新发布

2021华为开发者大会心得体会

10月22至24日华为正式举行了2021华为HDC开发者大会,华为通过展示软硬件协同的全场景多终端教....
的头像 lhl545545 发表于 10-25 15:25 182次 阅读

华为开发者大会是干嘛的

2021华为HDC开发者大会堪称“开发者嘉年华”,华为开发者大会是面向ICT等领域全球开发者的年度旗....
的头像 lhl545545 发表于 10-25 15:12 184次 阅读

不容错过!鸿蒙开发必备神器,老王月薪过万的秘诀都在这了

大家应该都知道在华为开发者大会HDC.Together 2021主题演讲会上,华为发布了HarmonyOS3.0.0开发者预览版。 预览版本中...
发表于 10-25 14:47 44次 阅读

HarmonyOS原子化服务卡片开发-快照实战说明

1.快照作用在服务中心显示卡片的过程中,因为页面加载需要一定时间,所以在服务中心中会先显示快照,后续再显示加载的小卡页面,...
发表于 10-25 13:42 0次 阅读
HarmonyOS原子化服务卡片开发-快照实战说明

华为开发者大会2021视频

华为开发者大会2021(Together)在东莞如期举行,华为消费总裁CEO余承恩在以“未来 有迹可....
的头像 lhl545545 发表于 10-25 11:23 285次 阅读

2020华为开发者大会直播入口

2020 年华为开发者大会与9 月10 日至9 月12 日在东莞松山湖举行。会上,华为揭开 了关于H....
的头像 lhl545545 发表于 10-25 11:09 215次 阅读

华为开发者大会2021举办时间

华为开发者大会HDC 2021在10月22至24日如期召开,地点在中国松山湖举行。华为与全球开发者汇....
的头像 lhl545545 发表于 10-25 10:50 198次 阅读

华为开发者大会2021官网

华为开发者大会2021近日已经正式开幕,华为公司在会上宣布HMS全球开发者已达510万,通过Harm....
的头像 lhl545545 发表于 10-25 10:36 226次 阅读

HarmonyOS驱动华为全屋智能再升级让智能家体验更近一步

(中国,东莞,2021年10月23日)华为开发者大会2021(Together)如期在东莞松山湖举行....
的头像 话说科技 发表于 10-25 10:31 260次 阅读
HarmonyOS驱动华为全屋智能再升级让智能家体验更近一步

梦想再度启航,第二届HarmonyOS开发者创新大赛正式启动

在10月22日举办的华为开发者大会(Together)上,第二届“HarmonyOS开发者创新大赛”....
的头像 话说科技 发表于 10-25 10:18 5557次 阅读
梦想再度启航,第二届HarmonyOS开发者创新大赛正式启动

华为开发者大会发布HarmonyOS 3预览版等全新开发技术,搭载HarmonyOS的设备超过1.5亿台

HarmonyOS已在超过1.5亿智能手机、平板、手表、智慧屏等设备上应用,成为万物智联时代的数字底....
的头像 西西 发表于 10-25 09:55 704次 阅读

华为何刚:网络安全和隐私保护是华为践行全场景生态战略的原点

华为提出消费者业务安全与隐私保护的“四大主张”,即自上而下的组织与流程保障、制定严苛的隐私安全原则、....
发表于 10-25 09:50 238次 阅读

鸿蒙3开发者预览版发布 华为鸿蒙编程语言正在研发中

2021华为开发者大会近日在广东东莞正式举行,随后华为消费总裁余承恩宣布将带来全新HarmonyOS....
的头像 lhl545545 发表于 10-25 09:13 310次 阅读

2021华为开发者大会分论坛HarmonyOS学生公开课布道师从零开始从现在开始

2021华为开发者大会分论坛HarmonyOS学生公开课布道师从零开始从现在开始 在正在直播的202....
的头像 inr999 发表于 10-24 11:47 601次 阅读
2021华为开发者大会分论坛HarmonyOS学生公开课布道师从零开始从现在开始

华为开发者分论坛HarmonyOS学生公开课-HarmonyOS开发者三大成长阶段与学习资源

2021华为开发者分论坛HarmonyOS学生公开课-HarmonyOS开发者三大成长阶段与学习资源
的头像 lhl545545 发表于 10-24 11:43 518次 阅读
华为开发者分论坛HarmonyOS学生公开课-HarmonyOS开发者三大成长阶段与学习资源

2021华为开发者大会分论坛HarmonyOS学生公开课解读HarmonyOS布道师

在今天的2021华为开发者大会分论坛HarmonyOS学生公开课上华为HarmonyOS开发者运营高....
的头像 inr999 发表于 10-24 11:35 536次 阅读
2021华为开发者大会分论坛HarmonyOS学生公开课解读HarmonyOS布道师

华为开发者分论坛HarmonyOS学生公开课-如何成为HarmonyOS校园布道师

2021华为开发者分论坛HarmonyOS学生公开课-如何成为HarmonyOS校园布道师
的头像 lhl545545 发表于 10-24 11:33 488次 阅读
华为开发者分论坛HarmonyOS学生公开课-如何成为HarmonyOS校园布道师

华为开发者分论坛HarmonyOS学生公开课-开发者成长图谱

2021华为开发者分论坛HarmonyOS学生公开课-开发者成长图谱
的头像 lhl545545 发表于 10-24 11:25 391次 阅读
华为开发者分论坛HarmonyOS学生公开课-开发者成长图谱

华为开发者分论坛HarmonyOS学生公开课-OpenHarmony Codelabs开发案例

2021华为开发者分论坛HarmonyOS学生公开课-OpenHarmony Codelabs开发案....
的头像 lhl545545 发表于 10-24 11:25 383次 阅读
华为开发者分论坛HarmonyOS学生公开课-OpenHarmony Codelabs开发案例

华为开发者分论坛HarmonyOS学生公开课-10分钟玩转codeLabs应用案例

2021华为开发者分论坛HarmonyOS学生公开课-10分钟玩转codeLabs应用案例
的头像 lhl545545 发表于 10-24 11:17 383次 阅读
华为开发者分论坛HarmonyOS学生公开课-10分钟玩转codeLabs应用案例

2021华为开发者大会HarmonyOS学生公开课上分享精彩样例

在今天的2021华为开发者大会分论坛HarmonyOS学生公开课上分享了很多的精彩样例;比如分布式任....
的头像 inr999 发表于 10-24 11:17 468次 阅读
2021华为开发者大会HarmonyOS学生公开课上分享精彩样例

华为开发者分论坛HarmonyOS学生公开课-如何学习HarmonyOS应用开发?

2021华为开发者分论坛HarmonyOS学生公开课-如何学习HarmonyOS应用开发?
的头像 lhl545545 发表于 10-24 11:09 310次 阅读
华为开发者分论坛HarmonyOS学生公开课-如何学习HarmonyOS应用开发?

2021华为开发者大会HarmonyOS学生公开课上教你10分钟成为HarmonyOS开发者

2021华为开发者大会HarmonyOS学生公开课上教你10分钟成为HarmonyOS开发者 学习H....
的头像 inr999 发表于 10-24 11:03 361次 阅读
2021华为开发者大会HarmonyOS学生公开课上教你10分钟成为HarmonyOS开发者