女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

鴻蒙開發(Harmonyos兼容與Harmonyos適配)

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-01-26 17:49 ? 次閱讀

布局的實現

Layout_ability_main.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:alignment="center"
    ohos:orientation="vertical" >

    < TextField
        ohos:id="$+id:content"
        ohos:height="0vp"
        ohos:weight="1"
        ohos:width="match_parent"
        ohos:enabled="false"
        ohos:padding="20vp"
        ohos:text="0"
        ohos:text_alignment="center"
        ohos:text_size="30"/ >

    < ScrollView
        ohos:height="0vp"
        ohos:weight="1.8"
        ohos:width="match_parent" >

        < DirectionalLayout
            ohos:height="match_content"
            ohos:width="match_parent"
            ohos:alignment="horizontal_center"
            ohos:orientation="vertical" >

            < DirectionalLayout
                ohos:height="match_content"
                ohos:width="match_parent"
                ohos:orientation="horizontal" >

                

                

                

                

            < /DirectionalLayout >

            < DirectionalLayout
                ohos:height="match_content"
                ohos:width="match_parent"
                ohos:orientation="horizontal" >

                

                

                

                

            < /DirectionalLayout >

            < DirectionalLayout
                ohos:height="match_content"
                ohos:width="match_parent"
                ohos:orientation="horizontal" >

                

                

                

                

            < /DirectionalLayout >

            < DirectionalLayout
                ohos:height="match_content"
                ohos:width="match_parent"
                ohos:orientation="horizontal" >

                

                

                

                

            < /DirectionalLayout >

            < DirectionalLayout
                ohos:height="match_content"
                ohos:width="match_parent"
                ohos:orientation="horizontal" >


                

                

                

            < /DirectionalLayout >

        < /DirectionalLayout >
    < /ScrollView >
< /DirectionalLayout >
< /DirectionalLayout >
< /DirectionalLayout >

background_button1.xml背景樣式:

< ?xml version="1.0" encoding="utf-8"? >
< shape
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:shape="rectangle" >
    < solid ohos:color="#CCF1F1F1"/ >
    < corners ohos:radius="20vp"/ >
< /shape >
< /shape >
< /shape >

background_button2.xml背景樣式:

< shape
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:shape="rectangle" >
    < solid ohos:color="#FFE4F2FE"/ >
    < corners ohos:radius="20vp"/ >
< /shape >
< /shape >
< /shape >

background_button3.xml背景樣式:

< ?xml version="1.0" encoding="utf-8"? >
< shape
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:shape="rectangle" >
    < solid ohos:color="#FF007CFD"/ >
    < corners ohos:radius="20vp"/ >
< /shape >
< /shape >
< /shape >

嗯,編寫布局頁面不難、稍微難點的是電視、車載設備、Pad、手機、手表五個端的屏幕適配。

界面編寫完,發現各個端的屏幕高度還沒有做適配,一開始認為AndroidHarmonyOSJava語言都可以編寫,HarmonyOS也可以使用Android的相關框架,便想著如何在HarmonyOS上去使用Android的屏幕適配方案,在用了今日頭條的屏幕適配方案開刀后,發現壓根行不通,今日頭條的屏幕適配方案用的單位是dp,這個單位在HarmonyOS上并沒有,只有類似的vp,看來還是我太天真了。

Android屏幕單位有dp、in、mm、pt、px、sp,HarmonOS屏幕單位有fp、px、vp。

其中兩者相同的單位是px,Android的dp與HarmonOS的vp都是為各自設備量身打造的單位,若想要搞一個兩者都可以用的屏幕適配框架,也許,只能從px找突破口。今日頭條的屏幕適配方案用的單位雖然是HarmonyOS所沒有的dp,但其實它最終都是要拿dp來轉換成px的喔~

Java代碼邏輯

繼承AbilitySlice的MainAbilitySlice類:

public class MainAbilitySlice extends AbilitySlice implements Component.ClickedListener {
    private Utils utils = Utils.getInstance();
    private TextField content;
    private String formula = "";

    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);
        initView();
        highlyAdaptive();
    }

    /**
     * 各個按鈕點擊事件
     * @param component
     */
    @Override
    public void onClick(Component component) {
        switch (component.getId()) {
            case ResourceTable.Id_one:
                if (utils.isNumStart(formula)) formula = utils.isZero(formula, "1");
                else formula = "1";
                break;
            case ResourceTable.Id_two:
                if (utils.isNumStart(formula)) formula = utils.isZero(formula, "2");
                else formula = "2";
                break;
            case ResourceTable.Id_three:
                if (utils.isNumStart(formula)) formula = utils.isZero(formula, "3");
                else formula = "3";
                break;
            case ResourceTable.Id_four:
                if (utils.isNumStart(formula)) formula = utils.isZero(formula, "4");
                else formula = "4";
                break;
            case ResourceTable.Id_five:
                if (utils.isNumStart(formula)) formula = utils.isZero(formula, "5");
                else formula = "5";
                break;
            case ResourceTable.Id_six:
                if (utils.isNumStart(formula)) formula = utils.isZero(formula, "6");
                else formula = "6";
                break;
            case ResourceTable.Id_seven:
                if (utils.isNumStart(formula)) formula = utils.isZero(formula, "7");
                else formula = "7";
                break;
            case ResourceTable.Id_eight:
                if (utils.isNumStart(formula)) formula = utils.isZero(formula, "8");
                else formula = "8";
                break;
            case ResourceTable.Id_nine:
                if (utils.isNumStart(formula)) formula = utils.isZero(formula, "9");
                else formula = "9";
                break;
            case ResourceTable.Id_zero:
                if (utils.isNumStart(formula)) formula = utils.isZero(formula, "0");
                else formula = "0";
                break;
            case ResourceTable.Id_reset:
                formula = "0";
                break;
            case ResourceTable.Id_except:
                if (utils.isNumEnd(formula)) formula += "÷";
                else if (!formula.substring(formula.length() - 1, formula.length()).equals("."))
                    formula = formula.substring(0, formula.length() - 1) + "÷";
                break;
            case ResourceTable.Id_ride:
                formula = utils.isNum(formula, "x");
                break;
            case ResourceTable.Id_percentage:
                formula = utils.isNum(formula, "%");
                break;
            case ResourceTable.Id_decimal_point:
                if (utils.isNumEnd(formula) && !utils.isDecimals(formula)) formula += ".";
                break;
            case ResourceTable.Id_delete:
                if (!formula.equals("") && !formula.equals("0")) {
                    formula = formula.substring(0, formula.length() - 1);
                    if (formula.equals("")) formula = "0";
                }
                break;
            case ResourceTable.Id_reduce:
                if (utils.isNumEnd(formula)) formula += "-";
                else formula = formula.substring(0, formula.length() - 1) + "-";
                break;
            case ResourceTable.Id_add:
                if (utils.isNumEnd(formula)) formula += "+";
                else formula =
                        formula.substring(0, formula.length() - 1) + "+";
                break;
            case ResourceTable.Id_equal:
                equal();
                break;
            default:
                break;
        }
        if (component.getId() != ResourceTable.Id_equal) {
            content.setText(formula);
        }
    }

    private void equal() {
        if (formula.equals("")) {
            // 如果沒有輸入公式
            utils.toast(this, "還沒輸入公式呢");
            return;
        } else if (!utils.isNumEnd(formula)) {
            // 如果公式的最后一位數非數字
            utils.toast(this, "計算器表示沒見過這樣的數學公式,運算不出來");
            return;
        }
        String[] split;
        if (!utils.isContains(formula, ".")) {
            // 計算整數
            if (utils.isContains(formula, "-")) {
                // 減法
                split = formula.split("-");
                if (split.length > 1)
                    result((Integer.parseInt(split[0]) + Integer.parseInt(split[1])) + "");
            } else if (utils.isContains(formula, "+")) {
                // 加法
                split = formula.split("+");
                if (split.length > 1)
                    result((Integer.parseInt(split[0]) + Integer.parseInt(split[1])) + "");
            } else if (utils.isContains(formula, "x")) {
                // 乘法
                split = formula.split("x");
                if (split.length > 1)
                    result((Integer.parseInt(split[0]) + Integer.parseInt(split[1])) + "");
            } else if (utils.isContains(formula, "÷")) {
                // 除法
                split = formula.split("÷");
                if (split.length > 1)
                    result((Integer.parseInt(split[0]) + Integer.parseInt(split[1])) + "");
            } else if (utils.isContains(formula, "%")) {
                // 取余
                split = formula.split("%");
                if (split.length > 1)
                    result((Integer.parseInt(split[0]) + Integer.parseInt(split[1])) + "");
            }
        } else {
            // 計算小數
            if (utils.isContains(formula, "-")) {
                // 減法
                split = formula.split("-");
                if (split.length > 1)
                    result((Double.parseDouble(split[0]) - Double.parseDouble(split[1])) + "");
            } else if (utils.isContains(formula, "+")) {
                // 加法
                split = formula.split("+");
                if (split.length > 1)
                    result((Double.parseDouble(split[0]) - Double.parseDouble(split[1])) + "");
            } else if (utils.isContains(formula, "x")) {
                // 乘法
                split = formula.split("x");
                if (split.length > 1)
                    result((Double.parseDouble(split[0]) - Double.parseDouble(split[1])) + "");
            } else if (utils.isContains(formula, "÷")) {
                // 除法`
                split = formula.split("÷");
                if (split.length > 1)
                    result((Double.parseDouble(split[0]) - Double.parseDouble(split[1])) + "");
            } else if (utils.isContains(formula, "%")) {
                // 取余
                split = formula.split("%");
                if (split.length > 1)
                    result((Double.parseDouble(split[0]) - Double.parseDouble(split[1])) + "");
            }
        }
    }

    private void result(String value) {
        formula = value;
        content.setText(value);
    }

    /**
     * 根據不同設備調整高度
     */
    private void highlyAdaptive() {
        if (DeviceInfo.getDeviceType().equals("phone")) {
            // 手機設備
            ComponentContainer.LayoutConfig layoutConfig = new ComponentContainer.LayoutConfig();
            layoutConfig.height = 1100;
            content.setLayoutConfig(layoutConfig);
        } else if (DeviceInfo.getDeviceType().equals("tablet")) {
            // 平板設備
            ComponentContainer.LayoutConfig layoutConfig = new ComponentContainer.LayoutConfig();
            layoutConfig.height = 1200;
            content.setLayoutConfig(layoutConfig);
        } else if (DeviceInfo.getDeviceType().equals("tv")) {
            // TV設備
            ComponentContainer.LayoutConfig layoutConfig = new ComponentContainer.LayoutConfig();
            layoutConfig.height = 160;
            content.setLayoutConfig(layoutConfig);
        } else if (DeviceInfo.getDeviceType().equals("wearable")) {
            // 可穿戴設備
            ComponentContainer.LayoutConfig layoutConfig = new ComponentContainer.LayoutConfig();
            layoutConfig.height = 150;
            content.setLayoutConfig(layoutConfig);
        } else if (DeviceInfo.getDeviceType().equals("car")) {
            // 車載設備
            ComponentContainer.LayoutConfig layoutConfig = new ComponentContainer.LayoutConfig();
            layoutConfig.height = 500;
            content.setLayoutConfig(layoutConfig);
        }
    }

    /**
     * 初始化xml布局控件
     */
    private void initView() {
        content = (TextField) findComponentById(ResourceTable.Id_content);
        ((Button) findComponentById(ResourceTable.Id_one)).setClickedListener(this);
        ((Button) findComponentById(ResourceTable.Id_two)).setClickedListener(this);
        ((Button) findComponentById(ResourceTable.Id_three)).setClickedListener(this);
        ((Button) findComponentById(ResourceTable.Id_four)).setClickedListener(this);
        ((Button) findComponentById(ResourceTable.Id_five)).setClickedListener(this);
        ((Button) findComponentById(ResourceTable.Id_six)).setClickedListener(this);
        ((Button) findComponentById(ResourceTable.Id_seven)).setClickedListener(this);
        ((Button) findComponentById(ResourceTable.Id_eight)).setClickedListener(this);
        ((Button) findComponentById(ResourceTable.Id_nine)).setClickedListener(this);
        ((Button) findComponentById(ResourceTable.Id_zero)).setClickedListener(this);
        ((Button) findComponentById(ResourceTable.Id_reset)).setClickedListener(this);
        ((Button) findComponentById(ResourceTable.Id_except)).setClickedListener(this);
        ((Button) findComponentById(ResourceTable.Id_ride)).setClickedListener(this);
        ((Button) findComponentById(ResourceTable.Id_delete)).setClickedListener(this);
        ((Button) findComponentById(ResourceTable.Id_reduce)).setClickedListener(this);
        ((Button) findComponentById(ResourceTable.Id_add)).setClickedListener(this);
        ((Button) findComponentById(ResourceTable.Id_equal)).setClickedListener(this);
        ((Button) findComponentById(ResourceTable.Id_decimal_point)).setClickedListener(this);
        ((Button) findComponentById(ResourceTable.Id_percentage)).setClickedListener(this);
    }
}
}
}

由于在編寫xml UI時屏幕適配只能做到寬度適配或高度適配,沒辦法在一個xml界面同時適配寬度與高度,為此寫了一個highlyAdaptive方法處理xml沒能完成的高度適配,方法通過DeviceInfo.getDeviceType()來得到設備的類型,根據不同的設備去修改它的高度,也算是實現了高度適配。

Utils類:

public class Utils {
    private static Utils utils = new Utils();
    private static ToastDialog toastDialog;
    private String[] symbol = new String[]{"+", "-", "x", "÷", "%"};

    public static Utils getInstance() {
        return utils;
    }

    public void toast(Context context, String text) {
        if (toastDialog == null) {
            toastDialog = new ToastDialog(context);
        }
        toastDialog.setAlignment(LayoutAlignment.CENTER);
        toastDialog.setText(text);
        toastDialog.show();
    }

    /**
     * 判斷最后一位是否數字
     * @param content
     */
    public boolean isNumber(String content){
        char[] chars = content.substring(content.length() - 1, content.length()).toCharArray();
        return Character.isDigit(chars[0]);
    }

    /**
     * 判斷是否是小數
     */
    public boolean isDecimals(String str) {
        if (isDecimal(str)) {
            for (String s : symbol) {
                if (isContains(str, s)) {
                    String[] split = str.split(s);
                    if (split != null){
                        if (!isDecimal(split[split.length - 1])) {
                            return false;
                        } else {
                            return true;
                        }
                    }
                }
            }
            return true;
        }
        return false;
    }

    /**
     * 判斷一位數是否是小數
     */
    public boolean isDecimal(String str) {
        if (isContains(str, "."))
            return true;
        else
            return false;
    }

    /**
     * 是否包含某一個運算符
     */
    public boolean isContains(String value, String contain) {
        if (value.indexOf(contain) == -1)
            return false;
        else
            return true;
    }

    /**
     * 最后一個值是數字就加符號,不是數字則替換它
     * @param str 符號
     */
    public String isNum(String content,String str) {
        if (isNumEnd(content)) content += str;
        else content = content.substring(0, content.length() - 1) + str;
        return content;
    }

    /**
     * 第一個值是0,輸入整數則替換掉
     */
    public String isZero(String content,String str) {
        if (content.equals("0")) {
            content = str;
        } else {
            content += str;
        }
        return content;
    }

    /**
     * 得到第一個值是否是數字
     */
    public boolean isNumStart(String str) {
        if (str.startsWith("+") || str.startsWith("x") || str.startsWith("÷") || str.startsWith("%") || str.equals("")) {
            return false;
        }
        return true;
    }

    /**
     * 得到最后一個值是否是數字
     */
    public boolean isNumEnd(String str) {
        char[] chars = str.substring(str.length() - 1, str.length()).toCharArray();
        if (!Character.isDigit(chars[chars.length - 1])) {
            return false;
        }
        return true;
    }
}
}
}

GIF演示實現效果

  • Phone 設備實現效果
  • Pad 設備實現效果
  • TV 設備實現效果
  • Wearable 設備實現效果
    目前所有設備中,Wearable是幾個設備中最不好適配、最難適配的設備,但,想實現也并非不可能。
    如果繼續適配Wearable,目前能想到Wearable屏幕適配的方法有三種:
    1、需要將背景換成一個圓,按鈕都放進一個自動換行的組件。只是,這個想法不是很現實,Android的RecycleView組件也只是一行固定多少個才會換行,HarmonyOS的ListContainer組件能否實現效果還是個未知數。
    2、使用他人開源的屏幕適配框架。不過,這個很遺憾,截止至發稿,還未能了解到有相關的適配框架。
    3、另外寫一個適配Wearable的布局。在onState方法執行super.setUIContent前更換專門為Wearable而寫的xml,如:
@Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        // wearable設備換一個布局
        if (DeviceInfo.getDeviceType().equals("wearable")){
            super.setUIContent(Wearable布局);
        }else{
            super.setUIContent(ResourceTable.Layout_ability_main);
        }
    }
    }
}

Car 實現效果

截止至發稿,Car還沒有開放對應的機型,沒能使用遠程真機進行測試查看最終效果。這個效果圖也只是點擊Previewer進行查看的樣式及效果。

Previewer注意事項:

1、點擊Previewer查看xml,偶爾點擊xml的一些樣式并不會有響應,需要關閉Previewer并重新打開。

2、Previewer展示的樣式不會顯示ToastDialog等對話框、不會打印日志、不能點擊Debug進行測試,還是使用真機測試真機測試香。

此次是我自HarmonyOS的DevEco Studio開發工具發布以來第一次開發的APP,身為一個Android開發工程師,做起HarmonyOS開發并不是很難,其中有很多東西都類似。DevEco Studio的遠程真機測試與Previewer,效果杠杠的,要知道網上很多遠程真機測試可都是收費制,且按使用時間收費,這一功能的出現可降低了不少開發費用。

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 測試
    +關注

    關注

    8

    文章

    5618

    瀏覽量

    128257
  • 開發
    +關注

    關注

    0

    文章

    372

    瀏覽量

    41333
  • 鴻蒙
    +關注

    關注

    59

    文章

    2497

    瀏覽量

    43744
  • HarmonyOS
    +關注

    關注

    79

    文章

    2027

    瀏覽量

    32080
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    華為推出首款搭載HarmonyOS 5的鴻蒙電腦

    近日,華為正式發布搭載基于開源鴻蒙5.0.2 Release版本打造的全新HarmonyOS 5的鴻蒙電腦HUAWEI MateBook Pro與HUAWEI MateBook Fold非凡大師
    的頭像 發表于 05-26 09:28 ?170次閱讀

    軟通動力亮相華為HarmonyOS Connect伙伴峰會

    近日,以“一起創造無限可能,同風起,耀星河”為主題的HarmonyOS Connect伙伴峰會在上海召開。作為首批HarmonyOS Connect生態解決方案商,軟通動力受邀出席峰會,與華為簽署HarmonyOS Connec
    的頭像 發表于 03-20 15:40 ?365次閱讀

    HarmonyOS 應用開發賦能套件:鴻蒙原生應用開發的 “神助攻”

    的課程、文檔、樣例代碼等資源,在開發者旅程各階段提供全方位的支持。開發者可以通過鴻蒙開發者官網一站式獲取HarmonyOS賦能套件。 感知階
    發表于 02-17 16:37

    華為發布鴻蒙HarmonyOS 5.0.2 Release

    華為鴻蒙HarmonyOS 5.0.2 Release于1月22日在華為開發者官方正式發布。HarmonyOS 5.0.2 Release在Harm
    的頭像 發表于 01-23 16:17 ?1306次閱讀

    名單公布!【書籍評測活動NO.56】極速探索HarmonyOS NEXT:純血鴻蒙應用開發實踐

    開發的核心技術,以及鴻蒙應用在實際開發中的應用方法。 本書共分為四篇,共計16章,分別為鴻蒙開發基礎篇、
    發表于 01-20 16:53

    AKI跨語言調用庫神助攻C/C++代碼遷移至HarmonyOS NEXT

    /C++代碼快速遷移至HarmonyOS NEXT。憑借卓越的兼容性,AKI已成為廠商與開發者打造鴻蒙原生應用過程中廣泛使用的跨語言調用解決方案。 AKI是一款專為
    發表于 01-02 17:08

    HarmonyOS第一課》煥新升級,賦能開發者快速掌握鴻蒙應用開發

    HarmonyOS第一課》煥新升級,賦能開發者快速掌握鴻蒙應用開發 隨著HarmonyOS NEXT發布,
    發表于 01-02 14:24

    HarmonyOS開發指導類文檔更新速遞(下)

    伴隨著HarmonyOS 5.0.0 Release、HarmonyOS 5.0.1 Release版本的發布,HarmonyOS官網文檔也帶來了不少上新內容。本期HarmonyOS
    的頭像 發表于 12-30 09:54 ?899次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發</b>指導類文檔更新速遞(下)

    AICon北京站HarmonyOS技術分論壇開啟招募,歡迎開發者踴躍報名

    在人工智能的浪潮中,HarmonyOS以其獨特的技術優勢,引領著移動應用開發的新趨勢。2024年12月14日,在AICon全球人工智能開發與應用大會(北京站)期間 ,將舉辦以“鴻蒙生態
    的頭像 發表于 12-11 16:39 ?496次閱讀
    AICon北京站<b class='flag-5'>HarmonyOS</b>技術分論壇開啟招募,歡迎<b class='flag-5'>開發</b>者踴躍報名

    AWTK 最新動態:支持鴻蒙系統(HarmonyOS Next)

    導讀HarmonyOS是全球第三大移動操作系統,有巨大的市場潛力,在國產替代的背景下,機會多多,AWTK支持HarmonyOS,讓AWTK開發者也能享受HarmonyOS生態的紅利。A
    的頭像 發表于 11-06 08:03 ?690次閱讀
    AWTK 最新動態:支持<b class='flag-5'>鴻蒙</b>系統(<b class='flag-5'>HarmonyOS</b> Next)

    浩辰CAD原生鴻蒙版公測 多端互動協同設計

    浩辰CAD原生鴻蒙版公測10月22日,華為重磅發布HarmonyOSNEXT,浩辰CAD看圖王應邀加入HarmonyOSNEXT生態適配的頭部應用也正式亮相,這標志著浩辰軟件在跨平臺應
    的頭像 發表于 11-01 15:27 ?1159次閱讀
    浩辰CAD原生<b class='flag-5'>鴻蒙</b>版公測 多端互動協同設計

    名單公布!【書籍評測活動NO.47】HarmonyOS NEXT啟程:零基礎構建純血鴻蒙應用

    應用需要單獨進行適配,以開發對應的鴻蒙原生應用。 鴻蒙開發者搶手 目前,鴻蒙系統
    發表于 10-14 14:36

    華為“純血”鴻蒙系統 HarmonyOS NEXT 將于9月底推出正式版

    HarmonyOS NEXT 將于今年 9 月底推出正式版本。 “從發布第一個版本到今年的 9 月份,這個(9 月)月底我們會正式發布 HarmonyOS NEXT,這一版本是完全獨立開發、獨立自主的,而且是不
    的頭像 發表于 09-14 14:27 ?2178次閱讀

    慶科信息獲HarmonyOS高級應用開發能力認證!助力品牌快速打造鴻蒙原生應用

    近日,上海慶科信息技術有限公司榮獲HarmonyOS應用開發者高級認證,公司在華為鴻蒙生態的開發能力得到進一步拓展,能夠幫助客戶快速開發基于
    的頭像 發表于 07-17 13:24 ?859次閱讀
    慶科信息獲<b class='flag-5'>HarmonyOS</b>高級應用<b class='flag-5'>開發</b>能力認證!助力品牌快速打造<b class='flag-5'>鴻蒙</b>原生應用

    華為HarmonyOS NEXT鴻蒙星河版正式開啟Beta計劃

    在剛剛落幕的華為開發者大會(HDC 2024)盛會上,華為震撼宣布HarmonyOS NEXT鴻蒙星河版正式邁入Beta測試階段,并預告其商用版本將于今年第四季度璀璨登場,預示著今年10月,搭載全新
    的頭像 發表于 07-15 15:59 ?1459次閱讀