本期视频已发布到bilibilijavascript
注意是应用开发,没错码农(应用开发)通常关注这个就好了html
点击应用开发之后,点击连接下载IDE,DevEco Studio是基于IDEA开源版魔改的,别再说什么抄袭Androidstudio了,使用这个工具没毛病,快速适应,gradle(gradle是打包构建工具,和Maven这种相似)的下载终于快了一次了前端
安装过程没什么好说的,就是若是你C盘不够了,安装SDK的时候能够先不肯定,进入IDE之后修改安装位置再安装vue
SDK Tools里面有个预览插件,可以实时预览效果,目前只支持手表java
对于其余的TV项目,想要编译查看效果还必须注册一个华为帐号,登录之后远程预览,能够点击Tools/HVD Manager
来查看react
点击运行之后就是这个效果,每次运行有一个小时的限制小程序
目前的应用开发和传统的安卓应用开发没什么区别,都是原生+js的混合,固然底层是他们重写的,设计成这个模式也是为了开发者可以无痛学习,没什么好说的服务器
固然你也彻底可使用JavaScript开发这个应用,只要你使用过vue这类mvvm框架应该是没什么难度的,想要实现复杂的应用还得上原生,原生仍是用的Java语言进行开发weex
这个原生应用的文件结构够熟悉吧,和集成JavaScript框架weex、react都差很少网络
首先咱们建立一个Lite Wearable应用来看一看,由于只有他可以实时预览
咱们主要编辑entry/src/main/js/default/pages
下面的内容
这个结构和小程序差很少,咱们在index.js
中定义一个属性
export default { data: { todolist: [{ title: '刷leetcode', date: '2020-06-25 10:00:00', }, { title: '看电影', date: '2020-06-27 20:00:00', }], } }
在index.html
中使用它
<div class="container"> <list class="todo-wraper"> <list-item for="{{todolist}}" class="todo-item"> <text class="todo-title">{{$item.title}}</text> <text class="todo-title">{{$item.date}}</text> </list-item> </list> </div>
点击运行项目,能够在右边实时看到预览效果
app.js
主要就是应用的生命周期,不得不说这个IDE代码提示仍是作的很好地
接着咱们建立一个原生的TV应用,选择一个List的模板
而后咱们在HVD manager
中启动一个TV模拟器,此时点击运行项目就有个设备能够选择了
运行效果,修改代码之后不是实时预览的,必需要重启项目,不知道是个人网络问题仍是他服务器问题,不是很流畅
接下看下代码,首先是MainAbility
这个没什么好说的就和activity
是同样的
public class MainAbility extends Ability { @Override public void onStart(Intent intent) { super.onStart(intent); super.setMainRoute(MainAbilitySlice.class.getName()); } }
在src\main\resources\base\layout
下放置页面文件,这个也是同样的里面嵌套了一个ListContainer
<DirectionalLayout xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:width="match_parent" ohos:height="match_parent" ohos:orientation="vertical"> <ListContainer ohos:id="$+id:list" ohos:width="match_parent" ohos:height="match_parent"/> </DirectionalLayout>
一个Page能够由一个或多个AbilitySlice(能够理解为片断和组件)构成,setMainRoute
决定应用的默认AbilitySlice,这里他选择的是MainAbilitySlice,咱们看下MainAbilitySlice
public class MainAbilitySlice extends AbilitySlice { private ListHolder listHolder; @Override public void onStart(Intent intent) { listHolder = new ListHolder(this); setUIContent(listHolder.createComponent()); } @Override public void onActive() { super.onActive(); } @Override public void onForeground(Intent intent) { super.onForeground(intent); } }
在onStart
中指定加载的页面内容,这里选择的ListHolder
,咱们看下ListHolder
public class ListHolder { private static final String TAG = "ListHolder"; private AbilitySlice mSlice; private ComponentContainer mRootLayout; private ListContainer listContainer; private ListItemProvider listItemProvider; public ListHolder(AbilitySlice abilitySlice) { mSlice = abilitySlice; listItemProvider = new ListItemProvider(abilitySlice); } public ComponentContainer createComponent() { Component mainComponent = LayoutScatter.getInstance(mSlice).parse(ResourceTable.Layout_ability_main, null, false); if (!(mainComponent instanceof ComponentContainer)) { return null; } mRootLayout = (ComponentContainer) mainComponent; listContainer = (ListContainer) mRootLayout.findComponentById(ResourceTable.Id_list); listContainer.setItemProvider(listItemProvider); return mRootLayout; } }
在createComponent
中咱们拿到list这个组件并填充具体的Item内容
ListContainer
页面文件中是两个Text
容器
<DirectionalLayout xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:width="match_parent" ohos:height="56vp" ohos:orientation="horizontal"> <Text ohos:id="$+id:left_content" ohos:width="match_content" ohos:height="match_content" ohos:weight="1" ohos:text_alignment="center" ohos:text_size="16fp" ohos:text="left" /> <Text ohos:id="$+id:right_content" ohos:width="match_content" ohos:height="match_content" ohos:weight="1" ohos:text_alignment="center" ohos:text_size="16fp" ohos:text="right" /> </DirectionalLayout>
list中具体的内容是经过listContainer.setItemProvider(listItemProvider);
设置的,咱们看下ListItemProvider
public class ListItemProvider extends RecycleItemProvider { private ArrayList<String> data = new ArrayList<>(); private AbilitySlice mSlice; ListItemProvider(AbilitySlice abilitySlice) { mSlice = abilitySlice; for (int i = 0; i < 10; ++i) { data.add("test" + i); } } @Override public long getItemId(int i) { return 0; } @Override public int getCount() { return data.size(); } @Override public Component getComponent(int position, Component convertView, ComponentContainer parent) { Component component = LayoutScatter.getInstance(mSlice).parse(ResourceTable.Layout_list_item, null, false); if (!(component instanceof ComponentContainer)) { return null; } ComponentContainer rootLayout = (ComponentContainer) component; Text leftText = (Text) rootLayout.findComponentById(ResourceTable.Id_left_content); leftText.setText(String.valueOf(position)); Text rightText = (Text) rootLayout.findComponentById(ResourceTable.Id_right_content); rightText.setText(data.get(position)); return component; } }
在getComponent
设置具体的内容,好的基本看完整个结构了,我以为会原生开发的同窗上手应该没啥问题
最后看下这个原生和JavaScript结合
看下项目结构,其实在前面是说过的和传统的安卓应用集成weex、react这类是很类似的,不过他官方就直接带这个这个模式,将来的开发的坑确定更少,毕竟不少人都体会过集成weex、react的痛
看到i18n
,看来是走国际化道路啊,而后能够直接使用前端来编写页面,须要原生拓展的地方再编写原生
官方还提供了完整的示例
最近鸿蒙挺火热的,我记得上次鸿蒙刚出的时候也火了一段时间,可是由于没有拿出真凭实绩的东西,遭到不少人的抨击,这一次拿出东西来了,又有不少人说啊这个妥妥的抄袭,我以为真的没有必要,他这样设计的目的就是为了让更多的开发者可以轻松上手,毕竟一个应用生态是一个系统最重要的地方。
鸿蒙我以为优点就是起步晚,能够吸取不少优秀的设计,并且最突出的就是一体的生态,不论是物联网仍是手机、电脑,若是未来鸿蒙真的是实现运行到这些平台上,跨平台开发和应用通讯、数据同步、权限控制都是很是方便的东西,毕竟如今的华为生态里面跨端协同也是作得很是好的,这一套很有苹果那个味道,我我的仍是支持,但愿国内可以真的有一套本身的东西!