首页 文章 精选 留言 我的

精选列表

搜索[HarmonyOS SDK],共10003篇文章
优秀的个人博客,低调大师

【HarmonyOS NEXT】【自定义组件】下拉选择框

踏入鸿蒙世界的敲门砖,标志着您在技术征途上的全新起点,提升就业竞争力,获得行业认可,点亮职业成长先机,快人一步抢占未来应用开发赛道!https://developer.huawei.com/consumer/cn/training/dev-cert-detail/101666948302721398 背景 在项目中遇到了一个下拉选择框组件的开发需求: ·选择框的三角箭头需要在点击时跟随转动。 ·弹出的选择框需要基本满框弹出。 ·选择框显示选择的项的方式为后面加一个✔的符号或图片。 ·选择框选择不是第一个默认的时候,需要提供一个不同颜色的显示提醒用户。 ·选择框需要提供方法,实现选择第一列的数值的时候,可以格式化成其他的文字内容。 根据测试发现,系统自带的Select组件的自定义无法满足想要的效果,因此根据多次的测试后,选择使用Toggle+bindMenu的方式,实现对组件的最大自定义封装。并提供了Option设置类,代码复制后可以直接使用。 实现效果 代码文件 SelectDemo 调用使用页面文件 ToggleMenuOption 自定义组件配置类,提供了是否显示菜单,选中字符、菜单索引等组件内容设置,大家可以根据自己的需求修改当前类的内容,可以添加和删减 ToggleMenu 封装组件 总结 上述文章是对下拉框选择组件的一种封装和实现的方式,其中也遇到了一些问题,比如说: ·菜单组件的宽度设置成“100%”的时候,菜单会自动内缩一段距离,然后也没有办法进行调整,如果弹出菜单内容的宽度也设置成100%的话,会出现超出界面不显示的问题。(希望后面会解决这个问题) 希望这篇文章对大家可以有所帮助,或者有什么可以改进的地方,欢迎大家交流(转载自CSDN,作者:baobao熊)

优秀的个人博客,低调大师

#HarmonyOS NEXT体验官# 应用权限原理和封装

踏入鸿蒙世界的敲门砖,标志着您在技术征途上的全新起点,提升就业竞争力,获得行业认可,点亮职业成长先机,快人一步抢占未来应用开发赛道!https://developer.huawei.com/consumer/cn/training/dev-cert-detail/101666948302721398?ha_source=hmosclass-csdn&ha_sourceId=89000445 背景 在项目中,避免不了需要调用系统资源和系统能力,比如:日历读写、摄像头等。因此,需要了解对系统资源访问权限的申请方式方法。 授权方式 包括两种授权方式,分别是system_grant(系统授权) 和 user_grant(用户授权)。 system_grant(系统授权) 仅需要在module.json5文件中,标注需要的权限,应用打开时,系统会自动赋予需要的权限。 user_grant(用户授权) 需要在项目中向系统发送申请,然后由用户决定是否给应用提供需要的权限。 应用的授权等级(APL) 一共有三个等级:normal、system_basic、system_core。权限等级依次提高。 · normal 等级是全部应用都可以使用 · system_basic 等级是需要申请签名证书后,才能使用 · system_core 等级是对系统应用开放,对第三方应用不开放 应用权限 · 对所有的硬件开放 · 受限开放权限 封装代码 PermissionUtils类 封装了三个常用的方法: · 检查权限是否授权(CheckPermissions) · 申请授权(RequestPermissions) · 打开系统设置的权限管理页面(OpenPermissionSettingsPage) index界面 添加三个按钮分别测试对应的方法 需要注意的是,所有的权限都需要先去module.json5中配置权限: 模拟器中询问受限制的权限 下图的权限,可以在模拟器的调试阶段,使用自动签名的方式使用: 如果没有自动签名时,添加这些权限在module.json5文件中,编辑会报错。 需要注意的点: · 确保已经连接真机或模拟器 · 打开项目结构,然后勾选自动生成签名文件 · 在项目的build-profile.json5文件下,查看signingConfigs下是否签名成功 (转载自51CTO,作者:奥尼5354)

优秀的个人博客,低调大师

HarmonyOS实战—组件的外边距和内边距

边距 组件的位置属性,分为:内边距 和 外边距 1. 外边距 表示组件跟外部其他组件的边距 案例: 如果只设置 margin ,就会把上下左右都给设置了,这是一个整体的设置。 ohos:margin="10vp" 设置第一个文本组件 ohos:top_margin="10vp" 给下面的文本框设置:ohos:top_margin="20vp" 外边距小节: 组件边框外侧距离其他组件的距离。 如果组件外侧没有其他组件,则是到父布局的距离。 2. 内边距 组件边框内侧跟文本之间的间距 一般设置上内边距和左内边距就行了,因为设置了这两个,就可以确定文本的位置了 利用内边距就可以调整组件内部文本的位置 把第二个文本的内边距设置为:ohos:top_padding="20vp" 内边距小节: 组件边框内侧距离内部文字的距离。

优秀的个人博客,低调大师

HarmonyOS实战—滑动事件的三个动作

1. 滑动事件的三个动作 接口名:TouchEventListener 滑动事件里面分为三个动作:按下不松,移动,抬起。 PRIMARY_POINT_DOWN:按下不松。 POINT_MOVE:移动。 PRIMARY_POINT_UP:抬起。 方法返回值: true 表示继续执行后面的动作。 false 表示不会继续执行后面的动作。 涉及到如下三个动作,根据用户按下位置和松下位置,就可以辨别用户是上、下、左、或右滑动。 如:可以辨别出用户是向右滑动(简称:右滑) 如:可以辨别出用户是向下滑动(简称:下滑) 2. 实现案例:按下、移动或松开都要修改文本的内容 因为要在整个屏幕上滑动,所以要给最外面的布局DirectionalLayout设置滑动事件,加个id 按下、移动或抬起都要修改文本的内容 新建项目:ListenerApplication4 代码实现 ability_main 采用默认生成的Text文本内容,在此基础上给DirectionalLayout布局和Text组件分别加上id <?xml version="1.0" encoding="utf-8"?> <DirectionalLayout ohos:id="$+id:dl" xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:height="match_parent" ohos:width="match_parent" ohos:alignment="center" ohos:orientation="vertical"> <Text ohos: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" /> </DirectionalLayout> MainAbilitySlice 采用当前类作为实现类接口的方式编写 package com.xdr630.listenerapplication.slice; import com.xdr630.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.Text; import ohos.multimodalinput.event.TouchEvent; public class MainAbilitySlice extends AbilitySlice implements Component.TouchEventListener { Text text1 = null; @Override public void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ResourceTable.Layout_ability_main); //1.先找到整个布局对象 DirectionalLayout dl = (DirectionalLayout) findComponentById(ResourceTable.Id_dl); text1 = (Text) findComponentById(ResourceTable.Id_text1); //2.给整个布局添加滑动事件 //当我们在整个布局滑动的时候,就会调用本类中的onTouchEvent方法 //在按下 移动、松开的过程,代码会不断去调用本类中的 onTouchEvent方法 dl.setTouchEventListener(this); } @Override public void onActive() { super.onActive(); } @Override public void onForeground(Intent intent) { super.onForeground(intent); } @Override public boolean onTouchEvent(Component component, TouchEvent touchEvent) { //参数1:component表示滑动的组件(布局也是一种组件,所以也可以用component表示布局对象) //实际上此时代表的就是DirectionalLayout布局对象,这个布局是铺满整个屏幕的 //参数2:touchEvent表示动作对象(按下、滑动、抬起) //获取当前手指对屏幕进行操作(按下、滑动、抬起) int action = touchEvent.getAction(); // 1:表示按下操作 // 2:表示松开操作 // 3. 表示滑动/移动操作 if (action == TouchEvent.PRIMARY_POINT_DOWN){ //只要写按下时需要运行的代码即可 text1.setText("按下"); }else if (action == TouchEvent.POINT_MOVE){ //移动或滑动 text1.setText("移动"); }else if (action == TouchEvent.PRIMARY_POINT_UP){ //松开或抬起 text1.setText("松开"); } return true; } } 运行: 按下: 移动: 松开: 3. 按下、滑动、松开 参数说明 可以看到1、2、3数字分别表示PRIMARY_POINT_DOWN(按下)、PRIMARY_POINT_UP(松开)、POINT_MOVE(移动),所以上面代码的参数也可以直接用数字代替,但为了更直观表达,建议使用参数,一目了然。 如:使用数字表示 if (action == 1){ //只要写按下时需要运行的代码即可 text1.setText("按下"); }else if (action == 3){ //移动或滑动 text1.setText("移动"); }else if (action == 2){ //松开或抬起 text1.setText("松开"); } 4. 验证 按下、 移动、松开的过程,代码会不断去调用本类中的 onTouchEvent方法 在上述代码的基础上,定义成员变量计数器 int count = 0 onTouchEvent方法被调用一次,就给加上一次 把count放在每次操作的后面 当按下时,是第一次调用,count应该为1 移动的时候随着鼠标不断移动,也就会不断地调用onTouchEvent方法,count就会递增 当松开后,也会调用一次,count在前面数值的基础上加1 所以,经过验证: 在 按下 、移动、松开的过程,代码会不断去调用本类中的 onTouchEvent方法。

优秀的个人博客,低调大师

HarmonyOS实战—单击事件的四种写法

单击事件的四种写法 1. 自己编写实现类 编写实现类(MyListener)去实现 Component.ClickedListener 接口 在类里面重新下 onClick 方法,把点击代码实现的操作就写在 onClick 方法当中 实现代码: 创建项目名为:ListenerApplication 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"> <button ohos:id="$+id:but1" ohos:height="match_content" ohos:width="match_content" ohos:text="点我" ohos:text_size="200" ohos:background_element="red"> </button> </directionallayout> MainAbilitySlice package com.example.listenerapplication.slice; import com.example.listenerapplication.ResourceTable; import ohos.aafwk.ability.AbilitySlice; import ohos.aafwk.content.Intent; import ohos.agp.components.Button; import ohos.agp.components.Component; public class MainAbilitySlice extends AbilitySlice { @Override public void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ResourceTable.Layout_ability_main); //1.找到按钮 //完整写法:this.findComponentById(ResourceTable.Id_but1); //this:本类的对象,指:MainAbilitySlice(子界面对象) // 在子界面当中,通过 id 找到对应的组件 // 用this去调用方法,this可以省略不写 //findComponentById(ResourceTable.Id_but1); //返回一个组件对象(所以组件的父类对象) //那么我们在实际写代码的时候,需要向下转型:强转 Component but1 = (Button) findComponentById(ResourceTable.Id_but1); //2.给按钮绑定单击事件,当点击后,就会执行 MyListener 中的方法,点一次执行一次 // 而方法就是下面点击的内容 but1.setClickedListener(new MyListener()); } @Override public void onActive() { super.onActive(); } @Override public void onForeground(Intent intent) { super.onForeground(intent); } } class MyListener implements Component.ClickedListener{ @Override public void onClick(Component component) { //Component:所有组件的父类 //component参数: 被点击的组件对象,在这里就表示按你的对象 //component.setText(); setText是子类特有的方法,需要向下转型:强转 Button but = (Button) component; but.setText("被点了"); } } 运行: 点击后: 2. 当前类实现接口 ability_main.xml 中把ohos:text_size="50",其他跟上面一样不变 MainAbilitySlice 中只需把上面新建的类 MyListener 给去掉,然后 AbilitySlice 实现 ClickedListener 接口类中的 onClick 方法,给本类的 but1按钮直接绑定单价事件 package com.example.listenerapplication.slice; import com.example.listenerapplication.ResourceTable; import ohos.aafwk.ability.AbilitySlice; import ohos.aafwk.content.Intent; import ohos.agp.components.Button; import ohos.agp.components.Component; public class MainAbilitySlice extends AbilitySlice implements Component.ClickedListener { @Override public void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ResourceTable.Layout_ability_main); //1.找到按钮 //完整写法:this.findComponentById(ResourceTable.Id_but1); //this:本类的对象,指:MainAbilitySlice(子界面对象) // 在子界面当中,通过 id 找到对应的组件 // 用this去调用方法,this可以省略不写 //findComponentById(ResourceTable.Id_but1); //返回一个组件对象(所以组件的父类对象) //那么我们在实际写代码的时候,需要向下转型:强转 Component but1 = (Button) findComponentById(ResourceTable.Id_but1); //2.给but1绑定单击事件,当事件被触发后,就会执行本类中的onClick方法,this就代表本类 but1.setClickedListener(this); } @Override public void onActive() { super.onActive(); } @Override public void onForeground(Intent intent) { super.onForeground(intent); } @Override public void onClick(Component component) { Button but = (Button) component; but.setText("被点了——单击事件的第二种写法"); } } 运行: 点击后: 3. 自己编写实现类 和 当前类实现接口 的区别 如果添加在按钮上面添加一个Text文本内容,当按钮点击后就会修改文本框的内容 改动第一个案例中的代码:添加Text文本框 上面的 onStart 方法中 text1 是局部变量,如果用第一种方法(自己编写实现类)来写, MyListener 不能调用到 text1 变量 如果使用第二种方法(当前类实现接口),就要把 text1 提到成员变量,再把设置点击后的内容添加到 onClick 方法中 如果在点击按钮之后,需要操作其他的组件对象,那么就可以使用第二种方式(当前类实现接口)。 如果在点击按钮之后,不需要操作其他的组件对象,就可以使用第一种方式(自己编写实现类)。 4. 匿名内部类 采用匿名内部类就不需要实现 implement ClickedListener 接口,也不需要再新建一个类了 但使用匿名内部类的代码只能使用一次。当使用代码需要用一次的时候,可以采用匿名内部类的形式来简化代码 直接 new ClickedListener 就能实现了,然后把第一种实现方式(自己编写实现类)中的 onClick 拿过来或第二种方式(当前类实现接口)实现的 onClick 方法拿过来就行了(其实这两者的onClick方法的内容是一样的),如下: but1.setClickedListener(new Component.ClickedListener() { @Override public void onClick(Component component) { Button but = (Button) component; but.setText("被点了——单击事件的第三种写法"); text1.setText("被点击了"); } }); 运行: 当被点击后,触发了 onClick 方法中两个设置文本的方法(Button和Text文本都发生了变化) 5. 方法引用 这个方法的形参和方法的返回值类型需要跟接口里的抽象方法里的形参和返回值类型要保持一致 代码实现,布局代码不变跟匿名内部类的一致,改动如下: 直接编写 onClick 方法,不带 @Override ,然后在 onStart 方法中直接调用即可 package com.example.listenerapplication.slice; import com.example.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 { Text text1 = null; @Override public void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ResourceTable.Layout_ability_main); Component but1 = (Button) findComponentById(ResourceTable.Id_but1); text1 = (Text) findComponentById(ResourceTable.Id_text1); but1.setClickedListener(this::onClick); } @Override public void onActive() { super.onActive(); } @Override public void onForeground(Intent intent) { super.onForeground(intent); } public void onClick(Component component) { Button but = (Button) component; but.setText("被点了——单击事件的第四种写法"); text1.setText("被点击了"); } } 当按钮被点击后,就要执行this本类中的onClick方法,相当于把下面的public void onClick...方法拿过来,引用了一下,当做抽象方法的方法体。 运行: 6. 小节 当前类作为实现类和方法引用是比较常用的。其他的写法也要掌握了解即可。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册