鸿蒙开发(Harmonyos兼容与Harmonyos适配)

布局的实现

Layout_ability_main.xml布局:

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayoutxmlns:ohos="http://schemas.huawei.com/res/ohos"ohos:height="match_parent"ohos:width="match_parent"ohos:alignment="center"ohos:orientation="vertical"><TextFieldohos: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"/><ScrollViewohos:height="0vp"ohos:weight="1.8"ohos:width="match_parent"><DirectionalLayoutohos:height="match_content"ohos:width="match_parent"ohos:alignment="horizontal_center"ohos:orientation="vertical"><DirectionalLayoutohos:height="match_content"ohos:width="match_parent"ohos:orientation="horizontal"><Buttonohos:id="$+id:reset"ohos:height="70vp"ohos:width="0vp"ohos:background_element="$graphic:background_button2"ohos:margin="6vp"ohos:text="c"ohos:text_size="30vp"ohos:weight="1"/><Buttonohos:id="$+id:except"ohos:height="70vp"ohos:width="0vp"ohos:background_element="$graphic:background_button2"ohos:margin="6vp"ohos:text="÷"ohos:text_size="30vp"ohos:weight="1"/><Buttonohos:id="$+id:ride"ohos:height="70vp"ohos:width="0vp"ohos:background_element="$graphic:background_button2"ohos:margin="6vp"ohos:text="x"ohos:text_size="30vp"ohos:weight="1"/><Buttonohos:id="$+id:delete"ohos:height="70vp"ohos:width="0vp"ohos:background_element="$graphic:background_button2"ohos:margin="6vp"ohos:text="←"ohos:text_size="30vp"ohos:weight="1"/></DirectionalLayout><DirectionalLayoutohos:height="match_content"ohos:width="match_parent"ohos:orientation="horizontal"><Buttonohos:id="$+id:seven"ohos:height="70vp"ohos:width="0vp"ohos:background_element="$graphic:background_button1"ohos:margin="6vp"ohos:text="7"ohos:text_size="30vp"ohos:weight="1"/><Buttonohos:id="$+id:eight"ohos:height="70vp"ohos:width="0vp"ohos:background_element="$graphic:background_button1"ohos:margin="6vp"ohos:text="8"ohos:text_size="30vp"ohos:weight="1"/><Buttonohos:id="$+id:nine"ohos:height="70vp"ohos:width="0vp"ohos:background_element="$graphic:background_button1"ohos:margin="6vp"ohos:text="9"ohos:text_size="30vp"ohos:weight="1"/><Buttonohos:id="$+id:reduce"ohos:height="70vp"ohos:width="0vp"ohos:background_element="$graphic:background_button2"ohos:margin="6vp"ohos:text="-"ohos:text_size="30vp"ohos:weight="1"/></DirectionalLayout><DirectionalLayoutohos:height="match_content"ohos:width="match_parent"ohos:orientation="horizontal"><Buttonohos:id="$+id:four"ohos:height="70vp"ohos:width="0vp"ohos:background_element="$graphic:background_button1"ohos:margin="6vp"ohos:text="4"ohos:text_size="30vp"ohos:weight="1"/><Buttonohos:id="$+id:five"ohos:height="70vp"ohos:width="0vp"ohos:background_element="$graphic:background_button1"ohos:margin="6vp"ohos:text="5"ohos:text_size="30vp"ohos:weight="1"/><Buttonohos:id="$+id:six"ohos:height="70vp"ohos:width="0vp"ohos:background_element="$graphic:background_button1"ohos:margin="6vp"ohos:text="6"ohos:text_size="30vp"ohos:weight="1"/><Buttonohos:id="$+id:add"ohos:height="70vp"ohos:width="0vp"ohos:background_element="$graphic:background_button2"ohos:margin="6vp"ohos:text="+"ohos:text_size="30vp"ohos:weight="1"/></DirectionalLayout><DirectionalLayoutohos:height="match_content"ohos:width="match_parent"ohos:orientation="horizontal"><Buttonohos:id="$+id:one"ohos:height="70vp"ohos:width="0vp"ohos:background_element="$graphic:background_button1"ohos:margin="6vp"ohos:text="1"ohos:text_size="30vp"ohos:weight="1"/><Buttonohos:id="$+id:two"ohos:height="70vp"ohos:width="0vp"ohos:background_element="$graphic:background_button1"ohos:margin="6vp"ohos:text="2"ohos:text_size="30vp"ohos:weight="1"/><Buttonohos:id="$+id:three"ohos:height="70vp"ohos:width="0vp"ohos:background_element="$graphic:background_button1"ohos:margin="6vp"ohos:text="3"ohos:text_size="30vp"ohos:weight="1"/><Buttonohos:id="$+id:decimal_point"ohos:height="70vp"ohos:width="0vp"ohos:background_element="$graphic:background_button2"ohos:margin="6vp"ohos:text="."ohos:text_size="30vp"ohos:weight="1"/></DirectionalLayout><DirectionalLayoutohos:height="match_content"ohos:width="match_parent"ohos:orientation="horizontal"><Buttonohos:id="$+id:percentage"ohos:height="70vp"ohos:width="0vp"ohos:background_element="$graphic:background_button2"ohos:margin="6vp"ohos:text="%"ohos:text_size="30vp"ohos:weight="1"/><Buttonohos:id="$+id:zero"ohos:height="70vp"ohos:width="0vp"ohos:background_element="$graphic:background_button2"ohos:margin="6vp"ohos:text="0"ohos:text_size="30vp"ohos:weight="1"/><Buttonohos:id="$+id:equal"ohos:height="70vp"ohos:width="0vp"ohos:background_element="$graphic:background_button3"ohos:margin="6vp"ohos:text="="ohos:text_size="30vp"ohos:weight="2"/></DirectionalLayout></DirectionalLayout></ScrollView>
</DirectionalLayout>

background_button1.xml背景样式:

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

background_button2.xml背景样式:

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

background_button3.xml背景样式:

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

嗯,编写布局页面不难、稍微难点的是电视、车载设备、Pad、手机、手表五个端的屏幕适配。

界面编写完,发现各个端的屏幕高度还没有做适配,一开始认为Android与HarmonyOS用Java语言都可以编写,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 = "";@Overridepublic void onStart(Intent intent) {super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_main);initView();highlyAdaptive();}/*** 各个按钮点击事件* @param component*/@Overridepublic 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;elsereturn false;}/*** 是否包含某一个运算符*/public boolean isContains(String value, String contain) {if (value.indexOf(contain) == -1)return false;elsereturn 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,如:

@Overridepublic 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,效果杠杠的,要知道网上很多远程真机测试可都是收费制,且按使用时间收费,这一功能的出现可降低了不少开发费用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/648958.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

测试人员为什么要编写测试用例?好的测试用例应该具备那些特点?

设计测试用例可以说是测试人员的一项最基本技能 。很多时候当我们接到设计测试用例的任务时 &#xff0c;往往都是想的该如何更快的完成这项任务 &#xff1f;而很少去想为什么要完成这项任务? 对于测试用例也是如此&#xff0c;为什么要设计测试用例呢(目的)&#xff1f;其实…

Jellyfin影音服务本地部署并结合内网穿透实现公网访问本地资源

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

拼图小游戏的界面和菜单的搭建

package Puzzlegame.com.wxj.ui;import javax.swing.*;public class GameJframe extends JFrame { //游戏主界面 public GameJframe(){//初始化界面initJFrame();//初始化菜单initJmenuBar();//让界面显示出来this.setVisible(true); }private void initJmenuBar() {//创建整个…

需求变化频繁的情况下,如何实施自动化测试

一.通常来说&#xff0c;具备以下3个主要条件才能开展自动化测试工作: 1.需求变动不频繁 自动化测试脚本变化的频率决定了自动化测试的维护成本。如果需求变动过于频繁&#xff0c;那么测试人员就需要根据变动的需求来不断地更新自动化测试用例&#xff0c;从而适应新的功能。…

qiankun子应用静态资源404问题有效解决(涉及 css文件引用图片、svg图片无法转换成 base64等问题)

在&#x1f449;&#x1f3fb; qiankun微前端部署&#x1f448;&#x1f3fb;这个部署方式的前提下&#xff0c;遇到的问题并解决问题的过程 最开始的问题现象 通过http请求本地的静态json文件404css中部分引入的图片无法显示 最开始的解决方式 在&#x1f449;&#x1f3…

行测-言语:2.语句表达

行测-言语&#xff1a;2.语句表达 1. 语句排序题 捆绑就是看两句话是不是讲的同一个内容&#xff0c;相同内容的句子应该相连。 1.1 确定首句 1.1.1 下定义&#xff08;……就是 / 是指&#xff09; A 1.1.2 背景引入&#xff08;随着、近年来、在……大背景 / 环境下&#…

Android 渲染机制

1 Android 渲染流程 一般情况下&#xff0c;一个布局写好以后&#xff0c;使用 Activity#setContentView 调用该布局&#xff0c;这个 View tree 就创建好了。Activity#setContentView 其实是通过 LayoutInflate 来把布局文件转化为 View tree 的&#xff08;反射&#xff09;…

使用Go语言编写自定义的HTTP代理:探险网络奇幻之旅

你是否曾经想过自己也能编写一个代理服务器&#xff0c;掌握网络冲浪的主动权&#xff1f;现在&#xff0c;有了Go语言&#xff0c;这个梦想不再遥不可及&#xff01;让我们一起踏上这段探险之旅&#xff0c;用Go语言编写一个自定义的HTTP代理&#xff0c;开启网络奇幻之旅&…

音频格式之AAC:(3)AAC编解码原理详解

系列文章目录 音频格式的介绍文章系列&#xff1a; 音频编解码格式介绍(1) ADPCM&#xff1a;adpcm编解码原理及其代码实现 音频编解码格式介绍(2) MP3 &#xff1a;音频格式之MP3&#xff1a;(1)MP3封装格式简介 音频编解码格式介绍(2) MP3 &#xff1a;音频格式之MP3&#x…

HNU-编译原理-甘晴void学习感悟

前言 熬过煎熬的考试周、复习以及更加煎熬的等成绩&#xff0c;查到成绩的那一刻&#xff0c;心里还是挺开心的。 虽然我没有完全学懂这门课程&#xff0c;但我还是兢兢业业地通过了课程的考试&#xff0c;拿到了这门课程的认可。 记录一下自己对编译原理的学习感悟&#xf…

优化用户体验测试应用领域:提升产品质量与用户满意度

在当今数字化时代&#xff0c;用户体验测试应用已经成为确保产品质量、提升用户满意度的关键工具。随着技术的不断发展&#xff0c;用户的期望也在不断演变&#xff0c;因此&#xff0c;为了保持竞争力&#xff0c;企业必须将用户体验置于产品开发的核心位置。本文将探讨用户体…

知识圣殿,智慧熔炉

知识圣殿&#xff0c;智慧熔炉 知识殿堂&#xff0c;巍然屹立 一座灵魂熔炉&#xff0c;号称图书馆 万卷书香盈架&#xff0c;智慧如星河汇聚 每一册书页&#xff0c;流淌着人类文明的血脉 钢笔与墨水交织诗篇 思想发芽&#xff0c;真理绽放光焰 浩瀚知识海洋&#xff0c;波涛…

Dlearning

Deep Learning Basic 神经网络&#xff1a; #mermaid-svg-rR22a8Udy5SxGOoP {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-rR22a8Udy5SxGOoP .error-icon{fill:#552222;}#mermaid-svg-rR22a8Udy5SxGOoP .error-t…

【MATLAB源码-第122期】基于matlab斑马优化算法(ZOA)无人机三维路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 斑马优化算法&#xff08;Zebra Optimization Algorithm&#xff0c;简称ZOA&#xff09;是一种模仿斑马群体行为的优化算法。在自然界中&#xff0c;斑马是一种社会性很强的动物&#xff0c;它们具有独特的群体行为模式&…

【STM32】STM32学习笔记-硬件SPI读写W25Q64(40)

00. 目录 文章目录 00. 目录01. SPI简介02. W25Q64简介03. SPI相关API3.1 SPI_Init3.2 SPI_Cmd3.3 SPI_I2S_SendData3.4 SPI_I2S_ReceiveData3.5 SPI_I2S_GetFlagStatus3.6 SPI_I2S_ClearFlag3.7 SPI_InitTypeDef 04. 硬件SPI读写W25Q64接线图05. 硬件SPI读写W25Q64示例06. 程序…

1块9毛钱,修复拓牛TC1D智能垃圾桶盖子不能正常开合的故障

前言 21年9月份买了拓牛的智能垃圾桶&#xff0c;一直用的很流畅&#xff0c;再加上屋里没啥有机垃圾&#xff0c;也没有宠物&#xff0c;用上之后每次投入垃圾&#xff0c;之后都会盖上盖子&#xff0c;没有很多的异味散发&#xff0c;屋里也没有蟑螂等害虫。 再加上门口有帘…

Chrome单独配置代理的方法

Windows Windows上单独对Chrome设置代理&#xff0c;需要在启动时传递参数&#xff0c;具体步骤如下。 在Chrome浏览器的快捷方式上右击&#xff0c;进入属性。在 快捷方式 标签下找到 目标 项目&#xff0c;在最后添加 –proxy-server“socks5://xxx.xxx.xx.xx:xxxx” 如果要…

Flink SQL 实时数据开发经验总结

使用SQL实现流处理的核心技术 在了解了Table\SQL API的使用方法以及作业运行机制之后&#xff0c;接下来分析SQL实现流处理的核心技术。 为什么要分析这个问题呢&#xff1f; 因为传统的关系代数以及SQL最开始是为了批处理设计的&#xff0c;在传统关系型数据库以及批处理中…

SpringBoot操作Jedis

SpringBoot操作Jedis 1、pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://ma…

大创项目推荐 目标检测-行人车辆检测流量计数

文章目录 前言1\. 目标检测概况1.1 什么是目标检测&#xff1f;1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 行人车辆目标检测计数系统 …