自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

原创 十五、【鸿蒙 NEXT】Navigation与router与Tabs组件

鸿蒙开发中导航组件选择指南:对于路由能力,推荐使用Navigation组件,其支持自动适应屏幕大小(宽屏时双页展示)并提供灵活的栈操作接口;而router组件将不再演进。作为首页导航,建议选择Tabs组件,因其在同一页面内切换内容时保留底部工具栏,而Navigation组件跳转时会覆盖工具栏。两种组件各有适用场景:Navigation适用于多级页面跳转,Tabs更适合首页导航。

2025-05-28 06:46:07 448

原创 十四、【鸿蒙 NEXT】如何更改har包的版本号

本文介绍了直接修改HAR包版本号的方法:1)解压HAR包获取package目录;2)修改oh-package.json5中的版本号(仅支持x.x.x格式);3)重新打包成HAR文件。该方法适用于需要调整三方提供的HAR包版本号但原始包未修改的情况,操作简单有效。(99字)

2025-05-26 06:24:01 291

原创 十三、【鸿蒙 NEXT】使用canvas实现微信头像

本文介绍了使用Canvas实现微信式群头像的方法。通过定义画布尺寸、头像间距和成员数量,根据不同人数(3/4/5/6/9人)采用不同的布局算法:3人和4人采用2x2网格,5人和6人采用3x2布局,9人采用3x3网格。核心代码使用CanvasRenderingContext2D的drawImage方法精确计算每个头像的位置和尺寸,最后通过getPixelMap和setPixelMap完成最终渲染。该方法实现了类似微信的群组头像拼接效果。

2025-05-25 22:36:01 194

原创 十二、【鸿蒙 NEXT】如何使用系统api实现视频压缩

鸿蒙系统视频压缩方案:使用内置AVTranscoder实现高效压缩摘要:本文介绍了一种在鸿蒙系统中不依赖第三方组件实现视频压缩的方法。通过媒体库的AVTranscoder组件,开发者可以设置比特率等参数控制输出视频大小,例如将30秒100MB视频压缩至10MB以内。方案包含完整实现步骤:1)计算目标比特率参数;2)配置回调监听;3)设置输入输出文件句柄。文章提供了从相册选取视频到完成压缩的完整代码示例,包括视频选择、参数配置、压缩过程控制(开始/暂停/恢复)及结果保存等功能实现。该方法充分利用鸿蒙原生能力

2025-05-25 21:47:12 437

原创 十一、【鸿蒙 NEXT】@Observed装饰器和@ObjectLink装饰器

我们经常会遇到这种场景,比如从后台获取到一个数组对象T[],然后会根据该数组对象去循环渲染页面。当某个元素T中的某个属性值变更的时候,需要重新刷新页面。那么我们可以怎么操作去刷新页面呢?本节将讲下刷新页面的方法,以及它的优缺点。

2025-03-21 07:24:53 773

原创 十、【鸿蒙 NEXT】如何解决模块之间相互依赖问题

我们在业务开发时,会根据功能特点,划分不同的功能hsp模块,使得不同功能边界划分清晰,也能更好的将各个功能模块解耦,但是在一些业务复杂场景,难免会出现各个hsp模块之间存在相互依赖场景,比如A模块需要调用B模块的一个查询数据的方法,B模块也需要调用A模块一个查询数据的方法。但是模块之间又不能相互依赖,否则会造成app崩溃。那么如何解决这种模块之间相互依赖的问题呢?本节将介绍一种方法,希望给大家一个参考。我们可以先定义一个公共的模块common,该模块是一个最底层模块,不依赖任何其他模块。

2025-03-18 06:47:55 453

原创 九、【鸿蒙 NEXT】如何快速分析AppFreeze

在应用发布后,经常会遇到一些appFreeze的报错信息,那么我们可以如何快速的定位分析出问题点,本章就讲一下一些常用的判断方法,供大家参考。

2025-03-09 16:41:26 284

原创 八、【鸿蒙 NEXT】ArkTS开发中遇到的注意点

在实际开发中,经常遇到一些细节的点,可能在出现问题时,看代码逻辑,没有任何问题,但是运行结果就是不符合预期,本节将梳理一些这样的问题点,希望能帮助到大家。

2025-03-09 11:32:59 818

原创 七、【鸿蒙 NEXT】如何将多个图片合成一张图片

使用多媒体图片相关接口,将多个图片写入新图中,入参是一组图片流,怎么获取图片流可以参考上一篇文章,直接通过网络下载。或者将本地图片直接转为图片流。一般涉及聊天的场景,都会有用户头像展示,如果涉及群聊,群组的头像可能是多个头像拼接而成,本章就讲下如何实现图片拼接。比如,我要将最多4个头像拼接成一个40*40的图片,可以参考如下实现。2、使用图片接口,将多个图片流写入新的图片中。二、使用图片接口,将多个图片流写入新的图片中。1、纯粹采用布局实现图片拼接。一、纯粹采用布局实现图片拼接。

2025-03-07 22:18:03 453

原创 六、【鸿蒙 NEXT】如何实现图片下载,并保存本地

可能很多应用都会涉及网络图片的下载,本节将介绍下,如何在纯鸿蒙中实现图片的下载,并将图片保存到本地目录,或者直接保存到相册中。本节主要涉及以下几点:1、下载图片流2、将图片流转为Image组件能展示的对象PixelMap3、将图片保存到本地路径,路径由用户选择4、直接将图片保存到相册。

2025-02-26 23:19:17 483

原创 五、【纯血鸿蒙】如何抽取公共样式

开发过程中我们经常会遇到同一类型的组件样式都是一样的,如果每个组件都复制一份样式,代码会产生冗余,并且如果要改动这个样式,由于代码太分散,很容易改漏。那么纯血鸿蒙中如何抽取公共样式呢。主要分为两种(1)单个ets文件的样式抽取,这种方式抽取的样式只能在当前ets文件中共享。其他ets文件无法引用。(2)跨ets文件的公共样式抽取。1、使用@Styles装饰器,该装饰器只能抽取组件的通用属性及通用事件,比如height,width这些属于所有组件都有的属性,叫做通用属性这里有两种写法,一个是全局定义的需要加f

2025-02-23 17:20:56 346

原创 四、【纯血鸿蒙】关系型数据库创建与升级

在app开发过程中,关系型数据库基本都会用到,纯血鸿蒙的关系型数据库底层也是sqllite,只不过纯血鸿蒙用的是ArtTS语法写的。本章就讲解下如何用ArtTS语法来进行关系型数据库的创建与升级。

2025-02-23 16:33:03 483

原创 三、鸿蒙模块划分,hap/hsp/har三种模块如何选择

HAP(Harmony Ability Package)是应用安装和运行的基本单元。HAP包是由代码、资源、第三方库、配置文件等打包生成的模块包,其主要分为两种类型:entry和feature。entry:应用的主模块,作为应用的入口,提供了应用的基础功能。feature:应用的动态特性模块,作为应用能力的扩展,可以根据用户的需求和设备类型进行选择性安装。应用程序包可以只包含一个基础的entry包,也可以包含一个基础的entry包和多个功能性的feature包。

2024-09-01 16:07:10 1886

原创 一、鸿蒙原生开发语言:ArkTS语言介绍

ArkTS语言是官方主推的开发鸿蒙原生App应用的语言,该语言的语法和TypeScript比较相似,对于有前端基础的同学,学习起来应该比较容易。本节主要介绍下ArkTS与TypeScript的关系,以及ArkTS的特性。总结一句话,ArkTS是语法的定义,ArkUI是基于该语法的UI框架。集成了TS的语法,集成了目前流行的前端框架中的数据驱动UI的能力,并提供一套现成的UI框架,这样的一个超集

2024-08-25 16:09:15 2029

原创 harmonyOS鸿蒙-UI-自定义弹窗

上面代码中dialogController就是弹窗控制器,即CustomDialogController对象,该对象构造方法接收一个对象参数,其中builder对应值就是自定义的弹窗组件,需要@CustomDialog标注,alignment定义弹窗的位置,此处弹窗展示在底部,offset是弹窗相对于当前位置的偏移量,此处相对于底部再向上偏移24,效果如下。1、使用@CustomDialog装饰器装饰自定义弹窗,此装饰器内进行自定义内容(也就是弹框内容)2、创建构造器,与装饰器关联。

2023-07-02 22:33:32 1896

原创 harmonyOS鸿蒙-数据管理-用户首选项(@ohos.data.preferences)

用户首选项为应用提供key-value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。数据存储形式为键值对,键的类型为字符串,值得存储数据类型包括数字型、字符型、布尔型以及3种类型的数组类型。

2023-07-02 21:57:41 4613 1

原创 HarmonyOS-页面和自定义组件生命周期

1、自定义组件:@Component装饰的UI单元,可以组合多个系统组件实现UI复用2、页面:即应用的UI页面。可以由一个或者多个自定义组件组成,@Entry装饰的自定义组件为页面的入口组件,即页面的根节点,一个页面有且仅能有一个@Entry。只有被@Entry装饰的组件才能调用页面的生命周期1、aboutToAppear:组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其build()函数之前执行2、aboutToDisappear:在自定义组件即将销毁时执行。

2023-07-02 17:05:35 1406

原创 鸿蒙-关系型数据库(@ohos.data.relationalStore)

update函数需要传入两个参数,第一个是需要更新的列值,是一个对象,key为列名,value是对应的值,第二个参数是一个条件对象,上面代码表示更新userInfo表中name='lisi'的age更新为66。batchInsert函数第一个参数是表名称,第二个参数是一个ValuesBucket数组对象,ValuesBucket表示key-value的对象,key表示表的列名称,value是对应的值。2、RdbPredicates 用来定义数据库的操作条件,可用于查询,修改,删除的条件语句。

2023-07-02 16:35:47 5724 2

原创 HiLog日志打印

业务调用日志打印公共类,因为我们公共日志类参数是一个可变数组,我们可以把第一个参数作为业务类型的TAG,比如下面的"EntryAbility",第二个参数传入要具体打印的日志,如下。4、用DevEco Studio查看日志。

2023-07-02 10:16:08 683

原创 Optional取代null

如果给定一个Person对象,想要获取对应保险公司的名称,那么为了防止空指针异常的出现,我们往往会这么获取,每次引用一个变量都会做一次null检查、if嵌套层数多,代码膨胀。在项目中我们经常遇到空指针异常,为了防止该异常发生,我们往往需要加一大堆的判断,来防止对象是null的场景。(1)Optional.ofNullable():创建一个可接受null的Optional对象。(3)orElse():当Optional对象中存储的值不存在时,返回一个默认值。为了防止空指针异常,我们往往会这么写。

2023-05-07 09:04:18 169

原创 Android之服务service

新建一个类,并继承Service类,并实现类的方法onCreate、onStartCommand、onDestory,者三个方法是最常用的,其中onCreate方法会在服务创建时调用,onStartCommand方法会在每次服务启动时调用。通常,如果希望服务一起动就去执行某个动作,可以把逻辑写在onStartCommand中。另外每个服务都需要在AndroidManifest.xml中注册才能生效。

2023-04-23 07:02:58 949

原创 Android 内容提供器

比如某个程序的包名是com.test.app,那么程序对应的authority可以命名为com.test.app.provider。那么以路径结尾的MIME类型可以写成vnd.android.cursor.dir/vnd.com.test.app.provider.table1,以id结尾的MIME类型可以写为:vnd.android.cursor.item/vnd.com.test.app.provider.table1。分别是从内容提供器中查询,新增,更新,删除数据。以读取联系人为例,步骤如下。

2023-04-20 07:15:45 149

原创 Android 持久化操作

(1)通过Context.getSharedPreferences获取SharedPreferences对象,第一个参数是文件名,如果文件不存在,则会创建文件,第二个参数是操作模式,目前只有MODE_PRIVATE一种模式可选,表示只有当前app才能对这个文件进行读写。(1)调用update方法,第一个参数是表名称,第二是ContentValues对象,第三个是where条件,第四个是where条件的参数,第三第四个参数不指定的话是更新所有。(4)调用Editor.apply方法提交键值对,存入文件中。

2023-04-13 06:50:59 154

原创 Android广播机制

Android、安卓、广播

2023-04-09 11:39:58 320

原创 Fragment基本用法

Fragment基本用法

2022-12-04 16:59:01 187

原创 RecyclerView基本用法

Android中RecyclerView的基本用法

2022-12-04 11:43:39 176

原创 自定义公共组件ListView

Android自定义ListView公共组件,调用方只需关注ListView的数据无需关注UI渲染

2022-12-04 10:51:04 420

原创 AsyncTask异步编程

Android

2022-11-13 16:37:53 134

原创 CompletableFuture的使用

CompletableFuture多线程

2022-07-31 15:43:21 277

原创 class.getResourceAsStream获取不到resources路径下的文件

1、现象,如下图,获取xml文件为空2、解决方案: 在Porject Sturcture->Modules中将resources文件夹设置为Resources目录,如下图

2022-02-25 08:01:04 6045

原创 重构改善既有代码设计总结之代码坏味道

一、代码坏味道1、神秘命名意义:使函数、模块、变量和类,能清晰的表明自己的功能和用法(如果想不出一个好名字,说明背后可能潜藏着更深的设计问题)常用重构手法:(1)改变函数声明(124)(2)变量改名(137)(3)字段改名(244)2、重复代码意义:如果要修改重复代码,你必须找出所有的副本来修改,如果在一个以上的地点看到相同代码结构,设法将它们合而为一常用重构手法:(1)“同一个类的两个函数含有相同表达式”可以提炼函数(106)提炼出重复代码(2)如果

2022-02-18 07:22:18 851

原创 重构改善既有代码设计总结之重构手法

106、提炼函数要点:(1)将意图和实现分开:如果需要花时间浏览一段代码才能弄清它到底在干什么,就该提炼到一个函数中,并根据期用途来命名(大多数时候根本不需要关心函数如何达成其意图,这是函数体内干的事)(2)一个大函数中,一段代码上放着一句注释,此时可以将代码提炼到自己函数中,注释往往提示一个好名字115、内联函数要点:(1)手上有一群组织不合理的函数,可以将它们内联到一个大函数中,再以合理的方式重新提炼小函数(2)间接性可能带来帮助,但非必要的间接性总是让人晕头转向,如果系

2022-02-18 07:20:24 353

原创 JS基础-变量类型和计算

一、思考:(1)typeof能判断哪些类型(2)何时使用===何时使用==(3)值类型和引用类型区别(4)如何实现深拷贝二、知识点:1、变量类型(1)值类型与引用类型深入分析:值类型:引用类型:常见值类型:常见引用类型(2)typeof运算符识别所有值类型识别函数判断是否是引用类型(不可再细分)(3)深拷贝const obj1 = { age: 20, ...

2022-02-13 11:49:34 558

原创 Optional取代null

2021-05-10 00:22:17 100

原创 代码整洁之道总结

1、整洁的代码力求集中。每个函数、每个类和每个模块都全神关注于一事,完全不受四周细节的干扰和污染。2、不要重复代码,只做一件事,表达力,小规模抽象一、有意义的命名1、命名需要名副其实,一旦发现有更好的名称,就换掉旧的。如果名称需要注释来补充,那就不算名副其实2、以数字系列命名(a1、a2…aN)是依义命名的对立面,名称纯属误导,完全没有提供正确信息3、使用可搜索的名称,便于在项目中快速找到对应变量4、避免使用缩写,如接口的命名以I开头,可以直接把I去掉5、类名不应当是动词6、方法命名应当是动

2020-12-20 15:54:40 1014

原创 Ract基础之恰当的获取数据二

1、创建一个组件来从服务端获取数据,并展示,如下import React from 'react'class Gists extends React.Component{ constructor(props) { super(props); this.state = { gists:[] } } componentDidMount() { console.log('向服务端发起请求获取数据,

2020-12-13 17:12:12 546

原创 Ract基础之恰当的获取数据一

1、创建一个简单的组件,点击增加按钮计数器加1,点击减法按钮,计数器减一,如下import React from 'react'export default class Counter extends React.Component{ constructor(props) { super(props); this.state = { counter: 0 } } handleDecrement = () =

2020-12-13 16:23:47 1053

原创 React基础之函数子组件

1、概念:不按组件的形式传递子组件,而是定义一个可以从父组件接收参数的函数import React from 'react'export const Name = ({children}) => children("world")Name组件中拥有定义为函数的children属性,并且没有按JSX表达式使用,而是作为函数被调用上述组件的用法如下:ReactDOM.render( <Name> {name => <div>Hello,

2020-12-13 11:11:49 1140

原创 React基础之高阶组件

1、高阶组件其实就是函数,它接收组件作为参数,对组件进行增强后返回const Hoc = Component => EnhancedComponet2、举例:如果要为每个组件添加相同的className。可以编写一个高阶组件const withClassName = Component => props => (<Component {...props} className="my-class"/>)3、举例:为每个组件添加事件监听window的窗口宽度变化,可以编

2020-12-13 10:11:02 125

原创 React开发可复用组件

1、prop类型(1)如果希望整个引用可以复用组件,关键要确保清晰的定义组件及其参数,以便能够直观使用。React提供了一个非常简单的表达组件接口的强大工具,只要提供组件期望接收的prop名称与对应的验证规则即可。import React from 'react';import PropTypes from 'prop-types';export default function Button({text}){ return <button>{text}</button

2020-12-12 22:54:11 311

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除