当前位置: 首页 > news >正文

鸿蒙开发的入门

鸿蒙开发的入门

注册并实名认证华为开发者账户

华为官网

注册 有账户可以直接登录 并进行实名认证

下载并安装开发工具

鸿蒙开发使用的语言

java js c/c++ 仓颉

手机app java

硬件 c/c++

应用开发工具的下载地址

Windows(64-bit) 下载地址

程序的运行过程

解析config.json 文件初始化获取入口Ability的全类名找到Ability,并运行运行Ability中的子界面加载xml文件,展示内容

第二个应用 页面跳转

鸿蒙ui中,提供了两种编写布局的方式

1 xml文件
标签便是要展示的不用内容 <Text> 文本
<image> 图片
<Button> 按钮
相关的代码
<?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"><Textohos:id="$+id:text_helloworld"ohos:height="match_content"ohos:width="match_content"ohos:background_element="$graphic:background_ability_main"ohos:layout_alignment="horizontal_center"ohos:text="第一个页面"ohos:text_size="40vp"/><Buttonohos:id="$+id:but1"ohos:height="match_content"ohos:width="match_content"ohos:background_element="red"ohos:text_size="40fp"ohos:text="点我"/></DirectionalLayout>
2 java代码
对象表示要展示的不用内容Text对象 文本
image对象 图片
Button对象 按钮
相关的代码
package com.zz.myapplication.slice;import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.DirectionalLayout;
import ohos.agp.components.Text;
import ohos.agp.utils.Color;public class SecondAbilitySlice extends AbilitySlice {@Overridepublic void onStart(Intent intent) {super.onStart(intent);//super.setUIContent(ResourceTable.Layout_ability_second);//1.创建布局对象DirectionalLayout dl = new DirectionalLayout(this);//2.创建文本对象Text t = new Text(this);//设置内容t.setText("第二个页面");//设置文字大小t.setTextSize(55);//设置文字颜色t.setTextColor(Color.BLUE);//3.把文本对象添加到布局当中dl.addComponent(t);//4.把布局添加到子界面当中super.setUIContent(dl);}@Overridepublic void onActive() {super.onActive();}@Overridepublic void onForeground(Intent intent) {super.onForeground(intent);}
}
3添加跳转的代码
package com.zz.myapplication.slice;import com.zz.myapplication.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.aafwk.content.Operation;
import ohos.agp.components.Button;
import ohos.agp.components.Component;public class MainAbilitySlice extends AbilitySlice implements Component.ClickedListener {Button btu ;@Overridepublic void onStart(Intent intent) {super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_main);//1.找到按钮 idbtu = (Button) findComponentById(ResourceTable.Id_but1);//2.给按钮添加一个点击事件//如果没有添加点击事件,那么用鼠标点击按钮之后是没有任何反应的。//如果我们给按钮添加了点击事件,那么用鼠标点击按钮之后,就可以执行对应的代码//理解方式://给btu这个按钮添加了点击事件//当我们用鼠标点击了btu这个按钮之后,就可以执行本类中onClick方法btu.setClickedListener(this);}@Overridepublic void onActive() {super.onActive();}@Overridepublic void onForeground(Intent intent) {super.onForeground(intent);}@Overridepublic void onClick(Component component) {//点击按钮只要要执行的代码//跳转到第二个页面中if(component == btu){//只有点击了btu这个按钮之后,才进行跳转//跳转到哪个页面中(意图)Intent i = new Intent();//包含了要跳转的页面信息Operation operation = new Intent.OperationBuilder().withDeviceId("")//要跳转到哪个设备上,如果传递一个没有内容的字符串,表示跳转本机.withBundleName("com.zz.myapplication")//我要跳转到哪个应用上,小括号里面可以写报名.withAbilityName("com.zz.myapplication.SecondAbility")//要跳转的页面.build();//表示将上面的三个信息进行打包//把打包之后的operation设置到意图当中i.setOperation(operation);//跳转页面startAbility(i);}}
}

什么是事件

事件 就是可以被文本、按钮、图片等组件识别的操作

常见的是有

单击 双击 长按 滑动

单机事件

又叫做点击事件,是开发中使用最多的一种事件,没有之一

实现步骤
1 通过id找到组件
// 1 找到按钮//完整写法://this.findComponentById(ResourceTable.Id_but1);//this:本类的对象。(子界面对象)//在子界面中,通过id找到对应的组件。//用this去调用方法,this是可以省略不写的。//findComponentById(ResourceTable.Id_but1);//返回一个组件对象(所有组件的父类对象)。//那么我们在实际写代码的时候,需要向下转型。Button but1 = (Button) findComponentById(ResourceTable.Id_but1);
2 给按钮组件设置单击事件
// 2 给按钮绑定一个点击事件but1.setClickedListener(new MyListener());
3 写一个类实现ClickedListener接口并重写onClick方法
class MyListener  implements Component.ClickedListener{@Overridepublic void onClick(Component component) {// Component 所有组件的父类// 参数 被点击的组件对象Button but = (Button) component;but.setText("被点了");}
}
4 编写onClick方法体
 // Component 所有组件的父类// 参数 被点击的组件对象Button but = (Button) component;but.setText("被点了");
单击事件的四种写法
定义实现类
class MyListener  implements Component.ClickedListener{@Overridepublic void onClick(Component component) {// Component 所有组件的父类// 参数 被点击的组件对象Button but = (Button) component;but.setText("被点了");}
}
当前类作为实现类
public class MainAbilitySlice extends AbilitySlice implements Component.ClickedListener
匿名内部类 只能使用一次
        but1.setClickedListener(new Component.ClickedListener() {@Overridepublic void onClick(Component component) {Button btu = (Button) component;btu.setText("被点了-单击事件的第三种写法");text1.setText("被点击了");}});
方法引用
        but1.setClickedListener(this::onClick);public void onClick(Component component) {Button btu = (Button) component;btu.setText("被点了-单击事件的第二种写法");text1.setText("被点击了");}

双击事件

实现步骤
1 通过id找到组件
        // 1 找到文本框组件和按钮组件Button but1 = (Button) findComponentById(ResourceTable.Id_but1);text1 =  (Text) findComponentById(ResourceTable.Id_text1);
2 给按钮组件设置双击事件
        // 2 绑定事件// 我想要点谁 那么就给谁绑定事件// 当我双击了 but1 这个按钮之后,就会执行本类中的onDoubleClickbut1.setDoubleClickedListener(this);
3 本类实现DoubleClickedListener接口并重写
public class MainAbilitySlice extends AbilitySlice implements Component.DoubleClickedListener
4重写onDoubleClick方法体
    @Overridepublic void onDoubleClick(Component component) {// component 表示点击组件的对象// 简单理解  我点了谁 那么component就表示谁的对象// 目前而言 按钮对象对问们暂时还没有什么用处//  问们要做的是点击之后改变文本框中的内容text1.setText("双击");}

长按事件

实现步骤
1 通过id找到组件
        // 1 找到文本框组件和按钮组件Button but1 = (Button) findComponentById(ResourceTable.Id_but1);text1 =  (Text) findComponentById(ResourceTable.Id_text1);
2 给按钮组件设置长按事件
        // 2 绑定事件// 我想要点谁 那么就给谁绑定事件but1.setLongClickedListener(this);
3 本类实现LongClickedListener接口
public class MainAbilitySlice extends AbilitySlice implements Component.LongClickedListener
4重写onLongClick方法体
    @Overridepublic void onLongClicked(Component component) {text1.setText("长按");}

滑动事件

按下不松 按下位置

移动

松开 松开位置

实现步骤
1 通过id找到组件
        // 1  先找到整个的布局对象DirectionalLayout d1 = (DirectionalLayout) findComponentById(ResourceTable.Id_d1);text1 = (Text) findComponentById(ResourceTable.Id_text1);
2 给按钮组件设置滑动事件
        // 2  给整个布局添加滑动事件// 当我们在整个布局上滑动的时候 就会调用本类中onTouchEvent的方法d1.setTouchEventListener(this);
3 本类实现TouchEventListener接口
public class MainAbilitySlice extends AbilitySlice implements Component.TouchEventListener
4重写onTouchEvent方法体
    @Overridepublic boolean onTouchEvent(Component component, TouchEvent touchEvent) {count++;//  参数1  component 表示滑动的哪个组件 (布局也是一种组件)// 实际上此时代表的就是那个DirectionalLayout 这个对象// 参数2  touchEvent 动作对象 (按下 滑动 抬起)// 获取当前手指对屏幕进行的操作 (按下 滑动 抬起)int action = touchEvent.getAction();// 1  表示 按下 操作// 2 表示松开// 3 表示 滑动 / 移动操作if (action == TouchEvent.PRIMARY_POINT_DOWN){// 只要写按下时需要运行的代码即可text1.setText("按下"+count);}else if (action == TouchEvent.POINT_MOVE) {text1.setText("移动"+count);}else if (action == TouchEvent.PRIMARY_POINT_UP){text1.setText("松开"+count);}return true;}

按下时 手指的坐标

送开始 手指的坐标

y坐标不变 x 坐标变大 右滑

y坐标不变 x 坐标变小 左滑

x坐标不变 y坐标变大 下滑

x坐标不变 y坐标变小 上滑

获取当前手指对屏幕进行的操作 代码

    public boolean onTouchEvent(Component component, TouchEvent touchEvent) {count++;//  参数1  component 表示滑动的哪个组件 (布局也是一种组件)// 实际上此时代表的就是那个DirectionalLayout 这个对象// 参数2  touchEvent 动作对象 (按下 滑动 抬起)// 获取当前手指对屏幕进行的操作 (按下 滑动 抬起)int action = touchEvent.getAction();// 1  表示 按下 操作// 2 表示松开// 3 表示 滑动 / 移动操作if (action == TouchEvent.PRIMARY_POINT_DOWN){// 只要写按下时需要运行的代码即可//text1.setText("按下"+count);// 获取按下时手指的位置MmiPoint point = touchEvent.getPointerPosition(0);float x = point.getX();float y = point.getY();text1.setText(x+"----"+y);}else if (action == TouchEvent.POINT_MOVE) {// text1.setText("移动"+count);MmiPoint point = touchEvent.getPointerPosition(0);float x = point.getX();float y = point.getY();text1.setText(x+"----"+y);}else if (action == TouchEvent.PRIMARY_POINT_UP){//  text1.setText("松开"+count);MmiPoint point = touchEvent.getPointerPosition(0);float x = point.getX();float y = point.getY();text1.setText(x+"----"+y);}return true;}

上下左右的滑动

//   记录按下时手指的位置float startx = 0;float starty = 0;@Overridepublic boolean onTouchEvent(Component component, TouchEvent touchEvent) {count++;//  参数1  component 表示滑动的哪个组件 (布局也是一种组件)// 实际上此时代表的就是那个DirectionalLayout 这个对象// 参数2  touchEvent 动作对象 (按下 滑动 抬起)// 获取当前手指对屏幕进行的操作 (按下 滑动 抬起)int action = touchEvent.getAction();// 1  表示 按下 操作// 2 表示松开// 3 表示 滑动 / 移动操作if (action == TouchEvent.PRIMARY_POINT_DOWN){// 只要写按下时需要运行的代码即可//text1.setText("按下"+count);// 获取按下时手指的位置MmiPoint point = touchEvent.getPointerPosition(0);startx = point.getX();starty = point.getY();// text1.setText(x+"----"+y);}else if (action == TouchEvent.POINT_MOVE) {// text1.setText("移动"+count);
//            MmiPoint point = touchEvent.getPointerPosition(0);
//            float x = point.getX();
//            float y = point.getY();
//            text1.setText(x+"----"+y);}else if (action == TouchEvent.PRIMARY_POINT_UP){//  text1.setText("松开"+count);MmiPoint point = touchEvent.getPointerPosition(0);float endx = point.getX();float endy = point.getY();//text1.setText(x+"----"+y);// 拿着按下时手指的位置跟送开始手指的位置进行比较就可以了if (endx > startx){text1.setText("右滑");} else  if (endx < startx){text1.setText("左滑");} else  if (endy > starty){text1.setText("下滑");} else  if (endy < starty){text1.setText("上滑");}}return true;}

bug的解决

    @Overridepublic boolean onTouchEvent(Component component, TouchEvent touchEvent) {count++;//  参数1  component 表示滑动的哪个组件 (布局也是一种组件)// 实际上此时代表的就是那个DirectionalLayout 这个对象// 参数2  touchEvent 动作对象 (按下 滑动 抬起)// 获取当前手指对屏幕进行的操作 (按下 滑动 抬起)int action = touchEvent.getAction();// 1  表示 按下 操作// 2 表示松开// 3 表示 滑动 / 移动操作if (action == TouchEvent.PRIMARY_POINT_DOWN){// 只要写按下时需要运行的代码即可//text1.setText("按下"+count);// 获取按下时手指的位置MmiPoint point = touchEvent.getPointerPosition(0);startx = point.getX();starty = point.getY();// text1.setText(x+"----"+y);}else if (action == TouchEvent.POINT_MOVE) {// text1.setText("移动"+count);
//            MmiPoint point = touchEvent.getPointerPosition(0);
//            float x = point.getX();
//            float y = point.getY();
//            text1.setText(x+"----"+y);}else if (action == TouchEvent.PRIMARY_POINT_UP){//  text1.setText("松开"+count);MmiPoint point = touchEvent.getPointerPosition(0);float endx = point.getX();float endy = point.getY();//text1.setText(x+"----"+y);// 拿着按下时手指的位置跟送开始手指的位置进行比较就可以了if (endx > startx && Math.abs(endy -starty) < 100){text1.setText("右滑");} else  if (endx < startx && Math.abs(endy -starty) < 100){text1.setText("左滑");} else  if (endy > starty && Math.abs(endx -startx) < 100){text1.setText("下滑");} else  if (endy < starty && Math.abs(endx -startx) < 100){text1.setText("上滑");}}return true;}
//如果为true,表示所有的动作都会触发当前方法并执行对应代码。
//如果为false,表示只有第一个动作会触发当前方法并执行对应代码。
//后续的动作就不会触发当前方法了。
//按下 --- 移动 --- 松开

案例

多按钮被点击

登录和注册按钮
public class MainAbilitySlice extends AbilitySlice implements Component.ClickedListener {Text text1;Button login;Button register;@Overridepublic void onStart(Intent intent) {super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_main);// 1 找到文本框组件 按钮组件text1 = (Text) findComponentById(ResourceTable.Id_text1);login = (Button) findComponentById(ResourceTable.Id_login);register = (Button) findComponentById(ResourceTable.Id_register);//2  给按钮绑定事件// 我现在要对哪个组件做什么操作// 要对登录按钮 注册按钮做点击操作login.setClickedListener(this);register.setClickedListener(this);}@Overridepublic void onActive() {super.onActive();}@Overridepublic void onForeground(Intent intent) {super.onForeground(intent);}@Overridepublic void onClick(Component component) {// 先做一个判断// 判断当前点击的市登录按钮还是注册按钮//component 表示当前点击的组件if (component == login){// 表示点击的是登录按钮text1.setText("点击了登录按钮");}else if (component == register){// 表示点击的注册按钮text1.setText("点击了注册按钮");}}
}

双击点赞

package com.zz.listenerapplication.slice;import com.zz.listenerapplication.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Component;
import ohos.agp.components.DirectionalLayout;
import ohos.agp.components.Image;public class MainAbilitySlice extends AbilitySlice implements Component.DoubleClickedListener{Image image ;@Overridepublic void onStart(Intent intent) {super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_main);// 1 找图片组件image = (Image) findComponentById(ResourceTable.Id_img);// 找到铺满屏幕的布局对象DirectionalLayout dl = (DirectionalLayout) findComponentById(ResourceTable.Id_dl);//  2 给布局添加双击事件dl.setDoubleClickedListener(this);}@Overridepublic void onActive() {super.onActive();}@Overridepublic void onForeground(Intent intent) {super.onForeground(intent);}// 如果标记未false  表示没有点赞  此时吧白色变成红色// 如果表示未true  表示已经点赞  再次双击之后 会打红色变回白色boolean flag = false;@Overridepublic void onDoubleClick(Component component) {// 修改图片的红心if (flag){image.setImageAndDecodeBounds(ResourceTable.Media_white);flag = false;}else {image.setImageAndDecodeBounds(ResourceTable.Media_red);flag = true;}}
}

配置文件

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayoutxmlns:ohos="http://schemas.huawei.com/res/ohos"ohos:id="$+id:dl"ohos:height="match_parent"ohos:width="match_parent"ohos:alignment="center"ohos:orientation="vertical"><Imageohos:id="$+id:img"ohos:height="match_content"ohos:width="match_content"ohos:image_src="$media:white"ohos:background_element="cyan"/></DirectionalLayout>

单击更换文本

package com.zz.listenerapplication.slice;import com.zz.listenerapplication.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Button;
import ohos.agp.components.Component;
import ohos.agp.components.Text;
import ohos.global.resource.NotExistException;
import ohos.global.resource.Resource;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;public class MainAbilitySlice extends AbilitySlice implements Component.ClickedListener {String[] jokes;Text text1;Button btu1;@Overridepublic void onStart(Intent intent) {super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_main);// 1 资源管理器try {// 用来拼接读取到的所以数据StringBuffer sb = new StringBuffer();Resource resource = this.getResourceManager().getResource(ResourceTable.Profile_joke);//  因为resource 是一个字节流 利用字节流可以读取文件中的内容BufferedReader br = new BufferedReader(new InputStreamReader(resource));String line;while ((line = br.readLine()) != null){sb.append(line);}// 释放资源br.close();//  当代码执行到这里的时候 资源文件joke.tet 中所有的内容全部读取到sb当中了//  利用 -- 将数据进行切割,分成四个段子jokes = sb.toString().split("---");// 当我们点击了按钮之后 就会给文本框设置一个随机的笑话// 找到文本组件 按钮组件text1 = (Text) findComponentById(ResourceTable.Id_text1);btu1 = (Button) findComponentById(ResourceTable.Id_btu1);// 给按钮 添加一个点击事件btu1.setClickedListener(this);} catch (IOException e) {throw new RuntimeException(e);} catch (NotExistException e) {throw new RuntimeException(e);}}@Overridepublic void onActive() {super.onActive();}@Overridepublic void onForeground(Intent intent) {super.onForeground(intent);}@Overridepublic void onClick(Component component) {// 当我们点击了按钮之后 会从数组里面随机获取一个笑话并设置到文本当中Random r = new Random();// 获取随机索引int index = r.nextInt(jokes.length);// 通过随机索引获取段子String randomjoke = jokes[index];//  把随机的段子设置到文本当中text1.setText(randomjoke);}
}

配置文件

<?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"><Textohos:id="$+id:text1"ohos:height="match_content"ohos:width="match_content"ohos:background_element="$graphic:background_ability_main"ohos:layout_alignment="horizontal_center"ohos:text="$string:mainability_HelloWorld"ohos:text_size="40vp"ohos:multiple_lines="true"/><Buttonohos:id="$+id:btu1"ohos:height="match_content"ohos:width="match_content"ohos:text="点我"ohos:text_size="100"ohos:background_element="red"/></DirectionalLayout>

单击随机图片

package com.zz.listenerapplication.slice;import com.zz.listenerapplication.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Button;
import ohos.agp.components.Component;
import ohos.agp.components.Image;import java.util.ArrayList;
import java.util.Random;public class MainAbilitySlice extends AbilitySlice implements Component.ClickedListener {ArrayList<Integer> list = new ArrayList<>();Image img;Button but1;@Overridepublic void onStart(Intent intent) {super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_main);// 定义一个数组 或者集合用来储存所有的图片list.add(ResourceTable.Media_girl1);list.add(ResourceTable.Media_girl2);list.add(ResourceTable.Media_girl3);list.add(ResourceTable.Media_girl4);list.add(ResourceTable.Media_girl5);list.add(ResourceTable.Media_girl6);list.add(ResourceTable.Media_girl7);list.add(ResourceTable.Media_girl8);list.add(ResourceTable.Media_girl9);// 找到组件img = (Image)findComponentById(ResourceTable.Id_img);but1 = (Button)findComponentById(ResourceTable.Id_but1);//  给按钮绑定单击事件but1.setClickedListener(this);}@Overridepublic void onActive() {super.onActive();}@Overridepublic void onForeground(Intent intent) {super.onForeground(intent);}@Overridepublic void onClick(Component component) {// 当按钮点击以后 我们需要修改图片的内容Random r = new Random();// 获取随机的索引int index = r.nextInt(list.size());// 通过随机的索引 可以获取随机的元素int randomImg = list.get(index);//  把获取到的随机图片 设置给image 组件就可以了img.setImageAndDecodeBounds(randomImg);}
}

配置文件

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayoutxmlns:ohos="http://schemas.huawei.com/res/ohos"ohos:id="$+id:dl"ohos:height="match_parent"ohos:width="match_parent"ohos:alignment="center"ohos:orientation="vertical"><Imageohos:id="$+id:img"ohos:height="match_content"ohos:width="match_content"/><Buttonohos:id="$+id:but1"ohos:height="match_content"ohos:width="match_content"ohos:text="点我"ohos:text_size="100"ohos:background_element="red"/></DirectionalLayout>

10秒统计次数

package com.zz.listenerapplication.slice;import com.zz.listenerapplication.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Button;
import ohos.agp.components.Component;
import ohos.agp.components.Text;public class MainAbilitySlice extends AbilitySlice implements Component.ClickedListener {Button btu;Text text;@Overridepublic void onStart(Intent intent) {super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_main);// 找到文本和按钮对象btu = (Button) findComponentById(ResourceTable.Id_btu1);text = (Text) findComponentById(ResourceTable.Id_text1);// 给按钮设置点击事件btu.setClickedListener(this);}@Overridepublic void onActive() {super.onActive();}@Overridepublic void onForeground(Intent intent) {super.onForeground(intent);}// 如果flag为true 表示当前按钮是第一次点击//  如果flag为false 表示当前按钮不是第一次点击boolean flag = true;long startTime = 0;
// 用来记录点击了多少次int count = 0 ;@Overridepublic void onClick(Component component) {// 点击一次 计数器就自增一次count++ ;// 统计10秒中之内按了多少次// 并把次数在文本框展示出来if (flag){// 如果当前是第一次点击按钮// 记录当前的时间startTime = System.currentTimeMillis();// 当第一次点击之后 游戏开始// 修改按钮中的文字内容btu.setText("请疯狂点我");// 修改标记flag = false;}else {if (( System.currentTimeMillis() - startTime)<= 10000){text.setText(count+"");}else {btu.setText("结束");// 取消按钮的点击事件btu.setClickable(false);}}}
}

配置文件

<?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"><Textohos:id="$+id:text1"ohos:height="match_content"ohos:width="match_content"ohos:background_element="$graphic:background_ability_main"ohos:layout_alignment="horizontal_center"ohos:text="$string:mainability_HelloWorld"ohos:text_size="40vp"/><Buttonohos:id="$+id:btu1"ohos:height="match_content"ohos:width="match_content"ohos:background_element="red"ohos:text="点我"ohos:text_size="100"/>
</DirectionalLayout>

相关文章:

鸿蒙开发的入门

鸿蒙开发的入门 注册并实名认证华为开发者账户 华为官网 注册 有账户可以直接登录 并进行实名认证 下载并安装开发工具 鸿蒙开发使用的语言 java js c/c 仓颉 手机app java 硬件 c/c 应用开发工具的下载地址 Windows(64-bit) 下载地址 程序的运行过程 解析config.j…...

为什么要减少Http的请求以及如何减少Http请求

为什么要减少Http的请求 减少 HTTP 请求的数量是优化网页性能的一个重要策略&#xff0c;原因有以下几点&#xff1a; 1.延迟&#xff1a;每个 HTTP 请求都会有一定的网络延迟。即使数据量很小&#xff0c;请求和响应的往返时间也可能相当长&#xff0c;特别是在网络条件不好…...

Linux性能测试工具整理

性能测试工具&#xff1a;Unixbench lmbench stream iozone fio netperf spec2000 spec2006 一、unixbench unixbench主要是用于系统基础性能测试&#xff0c;unixbench也包含一些非常简单的2D和3D图形测试 UnixBench一个基于系统的基准测试工具&#xff0c;不单纯是CPU 内存 …...

前端路由history路由和hash路由的区别?原理?

前端路由是指在单页应用程序&#xff08;SPA&#xff09;中通过改变 URL 路径来实现页面切换和导航的机制。在前端开发中&#xff0c;有两种主要的前端路由实现方式&#xff1a;基于 History API 的路由&#xff08;history-based routing&#xff09;和基于哈希&#xff08;Ha…...

AcWing 727. 菱形——像拼图一样做题

题目描述] 分析&#xff1a; 利用程序根据输入的整数&#xff0c;画出由字符*构成的该整数阶的实心菱形。给出一个示例&#xff1a; n 7 n7 n7。 * * * * * * * * * * * * * * * * * * * * * * * * * 我们将采取拆解问题&#xff0c;通过四个部分的…...

深入理解生成型大型语言模型:自监督预训练、细调与对齐过程及其应用

分析概述 本文主要介绍了生成型大型语言模型&#xff08;LLM&#xff09;的预训练过程&#xff0c;特别是通过下一个令牌&#xff08;token&#xff09;预测的自监督学习方法&#xff0c;以及后续的细调&#xff08;finetuning&#xff09;和对齐&#xff08;alignment&#x…...

个人简历主页搭建系列-03:Hexo+Github Pages 介绍,框架配置

今天的更新内容主要是了解为什么选择这个网站搭建方案&#xff0c;以及一些前置软件的安装。 Why Hexo? 首先我们了解一下几种简单的网站框架搭建方案&#xff0c;看看对于搭建简历网站的需求哪个更合适。 在 BuiltWith&#xff08;网站技术分析工具&#xff09;上我们可以…...

【堆、位运算、数学】算法例题

目录 十九、堆 121. 数组中的第K个最大元素 ② 122. IPO ③ 123. 查找和最小的K对数字 ② 124. 数据流的中位数 ③ 二十、位运算 125. 二进制求和 ① 126. 颠倒二进制位 ① 127. 位1的个数 ① 128. 只出现一次的数字 ① 129. 只出现一次的数字 II ② 130. 数字范围…...

IDEA 多个git仓库项目放一个窗口

1、多个项目先通过新建module或者CtrlAltShiftS 添加module引入 2、重点是右下角有时候git 分支视图只有一个module的Repositories。这时候需要去设置把多个git仓库添加到同一个窗口才能方便提交代码。 3、如果Directory Mappings已经有相关项目配置&#xff0c;但是灰色的&…...

全球变暖(蓝桥杯,acwing每日一题)

题目描述&#xff1a; 你有一张某海域 NN 像素的照片&#xff0c;”.”表示海洋、”#”表示陆地&#xff0c;如下所示&#xff1a; ....... .##.... .##.... ....##. ..####. ...###. .......其中”上下左右”四个方向上连在一起的一片陆地组成一座岛屿&#xff0c;例如上图就…...

多数据源 - dynamic-datasource | 集成 Quartz 及 ShardingJDBC

文章目录 集成 Quartz引入 quartz-starter配置数据源参数创建任务配置 Quartz 实际使用的数据源方式一: 自定义 SchedulerFactoryBeanCustomizer方式二: 使用@QuartzDataSource来指明quartz数据源集成 ShardingJDBC项目引入 shardingsphere 依赖分别配置shardingjdbc和多数据…...

四连杆机构运动学仿真 | 【Matlab源码+理论公式文本】| 曲柄滑块 | 曲柄摇杆 | 机械连杆

【程序简介】&#x1f4bb;&#x1f50d; 本程序通过matlab实现了四连杆机构的运动学仿真编程&#xff0c;动态展现了四连杆机构的运动动画&#xff0c;同时给出了角位移、角速度和角加速度的时程曲线&#xff0c;除了程序本身&#xff0c;还提供了机构运动学公式推导文档&…...

Lightroom Classic 2024 for mac 中文激活:强大的图像后期处理软件

对于追求极致画面效果的摄影师来说&#xff0c;Lightroom Classic 2024无疑是Mac平台上的一款必备软件。它凭借其强大的功能和出色的性能&#xff0c;赢得了众多摄影师的青睐。 软件下载&#xff1a;Lightroom Classic 2024 for mac 中文激活版下载 在Lightroom Classic 2024中…...

程序员下班以后做什么副业合适?

我就是一个最普通的网络安全工程师&#xff0c;出道快10年了&#xff0c;不出意外地遭遇到瓶颈期&#xff0c;但是凭技术在各大平台挖漏洞副业&#xff0c;硬是妥妥扛过来了。 因为对于程序员来讲&#xff0c;这是个试错成本很低、事半功倍的选择。编程技能是一种强大生产力&a…...

HSE化工应急安全生产管理平台:衢州某巨大型化工企业的成功应用

在化工行业中&#xff0c;安全生产一直是至关重要的议题。为了提高生产安全性、降低成本并提升企业形象&#xff0c;衢州某巨大型化工企业引入了HSE化工应急安全生产管理平台&#xff0c;取得了显著的改善和获益。 该平台的核心功能包括风险管理和应急预案制定。通过对化工生产…...

塑料工厂5G智能制造数字孪生可视化平台,推进塑料行业数字化转型

塑料工厂5G智能制造数字孪生可视化平台&#xff0c;推进塑料行业数字化转型。塑料制造行业作为重要的工业领域&#xff0c;亟需借助这一平台实现产业升级与转型&#xff0c;以适应市场的变化和提高生产效率。传统的塑料制造过程往往存在生产效率低下、资源浪费、环境污染等问题…...

HTML万字学习总结

html文本标签特殊符号图片音频与视频超链接表单列表表格语义标签(布局) html文本标签 标签简介<html></html>根目录<head></head>规定文档相关的配置信息&#xff08;元数据<body></body>元素表示文档的内容<meta></meta>表示…...

Linux网络编程: 以太网帧Frame/ARP/RARP详解

一、TCP/IP五层模型 物理层&#xff08;Physical Layer&#xff09;&#xff1a;物理层是最底层&#xff0c;负责传输比特流&#xff08;bitstream&#xff09;以及物理介质的传输方式。它定义了如何在物理媒介上传输原始的比特流&#xff0c;例如通过电缆、光纤或无线传输等。…...

【SpringCloud微服务实战09】Elasticsearch 搜索引擎

一、Elasticsearch 安装 1、Docker安装ES #创建一个网络 docker network create es-net#拉取ES镜像(这里使用7.17.18版本) docker pull elasticsearch:7.17.18#新建一个目录存放es数据 mkdir es cd es#docker运行 单机启动es docker run -d \--name es \-e "ES_JAVA_O…...

Leetcode 31. 删除无效的括号

心路历程&#xff1a; 一开始看到有点懵&#xff0c;后来发现有点像按照一定规则穷举所有可能情况&#xff0c;想到了排列组合问题&#xff0c;再结合问题长度不固定&#xff0c;无法用已知个for循环表示&#xff0c;从而想到了回溯。这个题相当于需要在一定规则下枚举。 按照…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...