HarmonyOS实战—可编辑的卡片交互

简介: HarmonyOS实战—可编辑的卡片交互

HarmonyOS实战


前言

在前面的天气卡片设计中,我们设计了一个天气类卡片在桌面进行7日天气的直观显示。但其并不具备选择城市切换的功能,实用性并不高。


所以,今天博主将详细介绍鸿蒙原子化开发的编辑交互功能。


何为卡片编辑功能?

首先,我们需要来看一张图,认识一下有无卡片编辑功能样式到底有何不同。具体效果图如下所示:


可以看到,默认情况下鸿蒙的手机卡片是没有任何编辑功能的,那么如果让其有编辑功能呢?


答案在我们的config.json文件的卡片定义中。示例代码如下:

"forms": [
      {
        "jsComponentName": "widget",
        "isDefault": true,
        "formConfigAbility": "ability://com.liyuanjinglyj.jsweather.slice.WeatherChoiceAbility",
        "scheduledUpdateTime": "10:30",
        "defaultDimension": "2*4",
        "name": "widget",
        "description": "桌面7天天气直观卡片",
        "colorMode": "auto",
        "type": "JS",
        "supportDimensions": [
          "2*4"
        ],
        "updateEnabled": true,
        "updateDuration": 1
      }
],


感兴趣的读者可以自己按照博文:HarmonyOS实战—卡片的样式设计,创建一个随机的卡片,看看默认定义与这段代码有何不同。


这里,博主就直接给出答案,这里比默认的卡片定义多了一个formConfigAbility属性,该属性就是编辑功能的界面。


在这个界面,用户可以自定义功能进行卡片的更新以及样式的变化。比如这里的天气卡片,我们可以编辑传入城市,然后更新卡片的天气。


定义编辑界面

界面的交互逻辑

尽然说到需要更新天气,那么我们来定义这个编辑界面WeatherChoiceAbility界面,它是一个Java界面,只需要在XML布局中添加控件,进行操作即可。代码如下:

public class WeatherChoiceAbility extends Ability {
    private static final HiLogLabel TAG = new HiLogLabel(HiLog.DEBUG, 0x0, WeatherChoiceAbility.class.getName());
    private TextField textField;
    private Button button;
    private String url="https://yiketianqi.com/api?version=v9&appid=73913812&appsecret=458XM5hq&city=";
    private long formId;
    private String city;
    @Override
    protected void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_weather_choice_slice);
        this.textField=(TextField)findComponentById(ResourceTable.Id_ability_weather_choice_textfield);
        this.button=(Button)findComponentById(ResourceTable.Id_ability_weather_choice_button);
        formId=intent.getLongParam(AbilitySlice.PARAM_FORM_IDENTITY_KEY, -1);
        this.button.setClickedListener(new Component.ClickedListener() {
            @Override
            public void onClick(Component component) {
                TaskDispatcher refreshUITask = createParallelTaskDispatcher("", TaskPriority.DEFAULT);
                refreshUITask.syncDispatch(()->{
                    ZSONArray zsonArray=getData(textField.getText().trim());
                    HiLog.error(TAG,zsonArray.toString());
                    try {
                        ZSONObject object=new ZSONObject();
                        object.put("itemTitle",city);
                        object.put("weatherList",zsonArray);
                        FormBindingData bindingData = new FormBindingData(object);
                        if(!updateForm(formId,bindingData)){
                            HiLog.error(TAG,"updateForm error");
                        }else{
                            terminateAbility();
                        }
                    }catch (Exception e){
                        HiLog.error(TAG,"updateForm error");
                    }
                });
            }
        });
    }
    private ZSONArray getData(String cityStr){
        LYJUtils http = new LYJUtils();
        String response = http.doGet(url+cityStr);
        ZSONObject res = ZSONObject.stringToZSON(response);
        city = res.getString("city");
        HiLog.info(TAG, city);
        ZSONArray data = res.getZSONArray("data");
        WeatherImageMap weatherImageMap=new WeatherImageMap();
        Map<String,String> map= weatherImageMap.getMap();
        ZSONArray weatherList=new ZSONArray();
        for(int i=0;i<data.size();i++){
            ZSONObject zsonObject = (ZSONObject)data.get(i);
            ZSONObject newObject=new ZSONObject();
            newObject.put("image",map.get(zsonObject.getString("wea_day")));
            newObject.put("wea_day",zsonObject.get("wea_day"));
            newObject.put("week",zsonObject.get("week"));
            weatherList.add(newObject);
        }
        ZSONObject list_data = (ZSONObject)data.get(0);
        String content=list_data.getString("date");
        return weatherList;
    }
}


代码很简单,基本思路就是获取卡片的id,然后获取用户选择城市的天气信息,最后使用updateForm进行更新。


额外需要注意的是,传递给卡片的数据不能太长,先前博主直接将所有的天气数据updateForm后,直接导致数据丢失,最后只用了3个数据,才传递成功。(具体多长才算长,这个博主也没有研究,尽量只传递卡片需要的数据)


界面的布局

这里使用的ability_weather_choice_slice.xml布局文件只有一个文本框加上一个按钮,示例代码如下所示:

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:margin="20vp"
    ohos:orientation="vertical"
    ohos:top_margin="100vp">
    <TextField
        ohos:id="$+id:ability_weather_choice_textfield"
        ohos:height="40vp"
        ohos:width="match_parent"
        ohos:background_element="$graphic:textfield_graphic"
        ohos:hint="请输入城市名(去掉市,县,洲)"
        ohos:margin="20vp"
        ohos:padding="5vp"
        ohos:text_alignment="vertical_center"
        ohos:text_size="25vp"/>
    <Button
        ohos:id="$+id:ability_weather_choice_button"
        ohos:height="match_content"
        ohos:width="match_parent"
        ohos:background_element="$graphic:textfield_graphic"
        ohos:bottom_padding="5vp"
        ohos:text="获取城市天气同步到卡片"
        ohos:text_color="#FF0000"
        ohos:text_size="25vp"
        ohos:top_padding="5vp"/>
</DirectionalLayout>


代码中并没有加入城市的容错判断,感兴趣的可以自己加入,这里博主主要介绍卡片的编辑功能以及信息的同步。


当然,定义的Java界面需要在config.json中定义后才能使用,定义代码如下:

{
    "orientation": "unspecified",
    "name": "com.liyuanjinglyj.jsweather.slice.WeatherChoiceAbility",
    "icon": "$media:icon",
    "description": "$string:entry_MainAbility",
    "label": "$string:entry_MainAbility",
    "type": "page",
    "launchType": "standard"
}


运行之后,效果如首图所示。


本文源代码地址:https://github.com/liyuanjinglyj/JsWeather

相关文章
|
2月前
|
JavaScript API 数据处理
基于HarmonyOS 5.0 (Next)技术的渐变模糊效果技术实现【代码实战】
本文详细介绍如何在HarmonyOS 5.0(Next)中实现渐变模糊效果,涵盖从基础页面搭建到添加模糊、渐变效果的全过程,并通过代码实战展示具体操作步骤。文章首先介绍了使用`Stack`和`Image`控件设置背景并应用`foregroundBlurStyle`属性实现模糊效果,接着通过`linearGradient`属性融入渐变效果,使界面更加精致美观。此外,还展示了如何利用滑动条和手势等交互元素动态调整模糊与渐变效果,增强用户体验。最后,通过具体代码示例说明如何为图片、弹窗等控件添加渐变模糊效果,突显HarmonyOS的强大功能与灵活性。
112 17
|
2月前
|
数据管理 API 调度
鸿蒙HarmonyOS应用开发 | 探索 HarmonyOS Next-从开发到实战掌握 HarmonyOS Next 的分布式能力
HarmonyOS Next 是华为新一代操作系统,专注于分布式技术的深度应用与生态融合。本文通过技术特点、应用场景及实战案例,全面解析其核心技术架构与开发流程。重点介绍分布式软总线2.0、数据管理、任务调度等升级特性,并提供基于 ArkTS 的原生开发支持。通过开发跨设备协同音乐播放应用,展示分布式能力的实际应用,涵盖项目配置、主界面设计、分布式服务实现及部署调试步骤。此外,深入分析分布式数据同步原理、任务调度优化及常见问题解决方案,帮助开发者掌握 HarmonyOS Next 的核心技术和实战技巧。
261 76
鸿蒙HarmonyOS应用开发 | 探索 HarmonyOS Next-从开发到实战掌握 HarmonyOS Next 的分布式能力
|
2月前
|
开发框架 人工智能 安全
鸿蒙HarmonyOS应用开发 | 「鸿蒙技术分享」HarmonyOS NEXT元服务卡片实战体验
HarmonyOS NEXT的发布对华为及整个行业都产生了深远的影响。它不仅展示了华为的技术实力,还敏锐地把握了市场需求。同时,吸引了更多的开发者和合作伙伴加入鸿蒙生态体系,共同推动鸿蒙生态的繁荣发展。
286 20
鸿蒙HarmonyOS应用开发 | 「鸿蒙技术分享」HarmonyOS NEXT元服务卡片实战体验
|
2月前
|
存储 JavaScript 开发工具
基于HarmonyOS 5.0(NEXT)与SpringCloud架构的跨平台应用开发与服务集成研究【实战】
本次的.HarmonyOS Next ,ArkTS语言,HarmonyOS的元服务和DevEco Studio 开发工具,为开发者提供了构建现代化、轻量化、高性能应用的便捷方式。这些技术和工具将帮助开发者更好地适应未来的智能设备和服务提供方式。
76 8
基于HarmonyOS 5.0(NEXT)与SpringCloud架构的跨平台应用开发与服务集成研究【实战】
|
2月前
|
安全 数据安全/隐私保护 UED
HarmonyOS 5.0 (Next)应用开发实战:使用ArkTS构建开箱即用的登录页面【HarmonyOS 5.0(Next)】
### HarmonyOS 5.0(Next)应用开发实战:使用ArkTS构建开箱即用的登录页面 HarmonyOS 5.0(Next)融合了美学与科技,引入“光感美学”设计理念和多设备深度协同功能。本文通过 ArkTS 构建一个简单的登录页面,展示了模块化导入、状态管理、方法封装、声明式UI构建及事件处理等最佳实践。代码实现了一个包含用户名和密码输入框及登录按钮的界面,支持错误提示和页面跳转。
183 14
HarmonyOS 5.0 (Next)应用开发实战:使用ArkTS构建开箱即用的登录页面【HarmonyOS 5.0(Next)】
|
2月前
|
物联网 调度 vr&ar
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
鸿蒙技术分享:HarmonyOS Next 深度解析 随着万物互联时代的到来,华为发布的 HarmonyOS Next 在技术架构和生态体验上实现了重大升级。本文从技术架构、生态优势和开发实践三方面深入探讨其特点,并通过跨设备笔记应用实战案例,展示其强大的分布式能力和多设备协作功能。核心亮点包括新一代微内核架构、统一开发语言 ArkTS 和多模态交互支持。开发者可借助 DevEco Studio 4.0 快速上手,体验高效、灵活的开发过程。 239个字符
243 13
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
|
2月前
|
2月前
|
自然语言处理 搜索推荐 数据安全/隐私保护
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
鸿蒙登录页面设计展示了 HarmonyOS 5.0(Next)的未来美学理念,结合科技与艺术,为用户带来视觉盛宴。该页面使用 ArkTS 开发,支持个性化定制和无缝智能设备连接。代码解析涵盖了声明式 UI、状态管理、事件处理及路由导航等关键概念,帮助开发者快速上手 HarmonyOS 应用开发。通过这段代码,开发者可以了解如何构建交互式界面并实现跨设备协同工作,推动智能生态的发展。
196 10
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
|
2月前
|
Dart 前端开发 IDE
鸿蒙Flutter实战:14-现有Flutter 项目支持鸿蒙 II
本文介绍了如何将现有 Flutter 项目适配鸿蒙系统,详细步骤包括安装 FVM、使用 FVM 安装 Flutter SDK、搭建开发环境、创建项目架构和壳工程等。
304 4
鸿蒙Flutter实战:14-现有Flutter 项目支持鸿蒙 II
|
2月前
鸿蒙开发:弹窗交互(promptAction )
点击按钮实现不同方式的弹窗
83 4
鸿蒙开发:弹窗交互(promptAction )

热门文章

最新文章