hdc shell 自动读取路径文件如何将文件传到手机上如何查找手机上的目录文件是否存在通过resource文件夹下放置文件shell读取/resource文件推送到手机上shell命令执行文件adb命令滚动组件设计日志获取touch触摸屏点击target:BY控件选择器text()、id()、type()控件对象Component坐标modeUiParam.NORMAL -- 单击UiParam.LONG -- 长按UiParam.DOUBLE -- 双击scroll_target指定可滚动的控件在该控件中滚动搜索指定目标控件target仅在target为BY选择器时有效driver.touch(BY.text(退出),scroll_targetBY.type(Scroll))wait_time:点击后等待响应的时间单位秒默认0.1秒touch模糊匹配MatchPattern.STARTS_WITH 前缀匹配MatchPattern.ENDS_WITH 后缀匹配MatchPattern.CONTAINS 包含匹配driver.touch(BY.text(今天星期, MatchPattern.STARTS_WITH))touch多属性组合定位控件# 点击文本为蓝牙, 类型为Button, 并且key为bluetooth_switch的按钮。driver.touch(BY.text(蓝牙).type(Button).key(bluetooth_switch))控件相对位置属性组合定位控件BY.isBefore -- 匹配在指定控件前面的控件BY.isAfter -- 匹配在指定控件后面的控件BY.within -- 匹配在指定控件内部的控件BY.inWindow -- 匹配在指定窗口内部的控件# 查找在text属性为显示通知图标的控件之后的type属性为Button的控件。component driver.find_component(BY.type(Button).isAfter(BY.text(显示通知图标)))# 查找在text属性为账号的控件之前的type属性为Image的控件。component driver.find_component(BY.type(Image).isBefore(BY.text(账号)))文件拉取/推送pull_file拉取文件从设备端传输文件到PC端pull_file(device_path:str,local_path:strNone,timeout:int60)device_path设备保存文件的路径local_pathPC侧保存文件的路径timeout拉取文件超时时间单位秒默认60秒driver.pull_file(/data/local/tmp/test.log,test.log)push_file推送文件从PC端传输文件到设备端push_file(local_path:str,device_path:str,timeout:int60)local_pathPC侧保存文件的路径device_path设备保存文件的路径timeout拉取文件超时时间单位秒默认60秒driver.push_file(test.hap,/data/local/tmp/test.hap)查询文件是否存在has_file(file_path:str) - bool -- 查询设备中是否有存在路径为file_path的文件返回True/Falsedriver.has_file(/data/local/tmp/test_file.txt)获焦写滚动组件demoScrollListGridWaterFlowSwiper懒加载用到时再加载没显示在屏幕上的先不创建。也叫按需加载 / 延迟加载。监听日志如何获取日志中的文本线性布局Row/Column自适应拉伸Blank()自适应缩放layoutWeight()层叠布局Stack通过alignContent参数实现对齐方式弹性布局Flex自动排列、对齐、分配剩余空间常用于页面头部导航栏的均匀分布、多行数据的排列等通过FlexOptions的参数direction来决定主轴方向控制子元素的排列方向FlexDirection.Row默认值主轴为水平方向子元素从起始端沿着水平方向开始排布反向RowReverse -- Column同理布局换行默认情况下Flex容器中子元素都排列在一条轴线上当子元素主轴尺寸之和 容器主轴尺寸时可通过wrap属性控制是单行/多行布局FlexWrap.NoWrap默认值不换行如大于父容器尺寸时子元素会被压缩宽度FlexWrap.Wrap换行FlexWrap.WrapReverse反向换行主轴对齐FlexAlign.Start交叉轴ItemAlign.Auto(默认值)相对布局RelativeContainer栅格布局GridRow/GridCol选项卡Tabs容器组件List当列表项达到一定数量内容超过屏幕大小时可以自动提供滚动功能子组件有ListItemGroup或ListItem循环渲染一组行/列或任意数量的单个视图和ForEach结构支持条件渲染、循环渲染、懒加载等渲染控制方式生成子组件主轴与交叉轴listDriection(Axis.Vertical)默认 -- 垂直方向主轴 -- 交叉轴为水平方向listDrection(Axis.Horizontal) -- 水平方向主轴 -- 交叉轴为垂直方向List列表List(){ForEach(数据源,(item:单个数据数据类型){ListItem(){Text(${item})}})}.alignListItem(ListItemAlign.Center) // 居中Python与ArkTS循环的对比:ArkTSForEach循环:ForEach(数据源,(item:单个数据数据类型){ListItem(){Text(${item})}})PythonFor循环:List [1,2,3,4]for i in List:print(i)arkts中ForEach:置换到Python:for item in 数据源 (需加item数据类型)可以通过from创建空数组Array.from({length:10}) -- 生成了一个数组长度为10的空数组,方便作为数据源做循环ForEach(Array.from({ length: 10 }), (item: string, index)) {}Scroller滚动控制器1.实例化Scroller控制器 -- myScroll: Scroller new Scroller()2.绑定控制器 -- Scroll(this.myScroll)3.设置按钮Button,添加OnClick事件 -- .onClick((){this.myScroll.scrollEdge(Edge.End)})Top/End控制滑动自定义组件:Entry:1.Entry装饰的自定义组件将作为UI页面的入口2.单个UI页面中最多只能有一个Entry装饰一个自定义组件3.可以接受一个可选的LocalStorage参数Component struct build() -- 自定义组件固定写法Component:1.Component装饰器仅能装饰struct关键字声明的数据结构2.struct被Component装饰后具备组件化的能力,需要实现build方法去描述UI3.一个struct只能被一个Component装饰,可接受一个可选的boolean类型参数4.一个.ets文件可以写多个Componentstruct:实现自定义组件的创建struct 自定义组件名 {...} 构成自定义组件build()函数:用于定义自定义组件的声明式UI描述(必须定义)必须有Component装饰,且一个Component中只有一个build()自定义组件实现:EntryComponentstruct MyComponent {build() {}}不允许调用没有使用Builder装饰的方法,但允许系统组件的参数是TS方法的返回值状态装饰器:State:允许装饰的变量类型基本类型:number、string、boolean、enum引用类型:object、class、数组、Date(API 10)集合类型:Map、Set(API 11)空值类型:undefined、null(API 11)联合类型:如string | number、Length | ResourceStr(API 11)不支持装饰Function不能用于static或函数内变量State装饰的状态变量更改会引起UI的刷新渲染但并不是所有的变量更改都会引起刷新渲染,只有可以被框架观察到的修改才会刷新渲染使用规则:1.必须指定类型 初始化值2.必须通过this.变量名修改,直接赋值不触发更新3.引用类型整体替换才触发更新;直接修改内部属性不生效4.API 11支持Watch监听状态变化State Watch(onCountChange) count: number 0;onCountChange(newVal: number, oldVal: number) {console.log(count从${oldVal}变为${newVal});// 可在此做联动逻辑如计算衍生状态}5.禁止在build()中修改状态,会导致无限渲染循环父子组件:包含关系:父组件内部可以写多个子组件,子组件也能继续写子组件(组件树)数据传递关系:1.父组件可以传给子组件数据2.子组件不能直接改父组件的数据(单向数据流)3.通过Prop、Link、State等装饰器传递渲染关系:父组件渲染 -- 子组件才会渲染父组件更新 -- 子组件可能更新子组件更新 -- 不影响父组件生命周期关系:父组件出现 -- 子组件出现父组件消失 -- 子组件消失父子组件判定:一个组件的build()里写了另一个组件,里面即为子组件,build()所在组件即为父组件EntryComponentstruct Parent { // 父组件build() {Column() {// Parent是父, Child是子Child()}}}// 子组件Componentstruct Child {build() {Text(我是子组件)}}父组件:1.可创建、显示子组件2.给子组件传数据、传样式、传事件3.控制子组件是否显示4.决定子组件的位置、大小、排列子组件:1.接收父组件的数据(Prop)2.维护自己内部状态(State)3.向父组件抛出事件(onClick)4.独立渲染UI分父子组件的作用:1.拆分页面,将一个页面拆分为头部、内容、底部,代码结构清晰2.复用UI,例如一个按钮组件、列表项,多处使用,只写一次3.独立管理状态,子组件的State不会影响父组件,结构更安全4.维护方便,改一个地方,所有使用的地方都生效Prop单向同步装饰器应用场景:用于父组件向子组件单向同步场景支持类型:只支持简单类型/枚举number、string、boolean、enum不支持对象、数组、class、map、set、null/undefined作为同步类型特性:单向同步:父 - 子子组件只读:不能修改Prop的值,修改也无效同步更新:父组件更新 - 子组件自动刷新默认值:父组件不传值时,需设置默认值父组件传值时,可以无默认值父组件不传值且子组件无默认值 -- 报错限制:不能和Link、ObjectLink共用用法:EntryComponentstruct Parent {// 父自己的状态State num: number 666;build() {Column() {// 父把 this.num 传给子组件的 countChild({ count: this.num })}}}Componentstruct Child {// 子用 Prop 接收,名字要和父传的对应:countProp count: number;build() {// 直接用 this.count 显示父传过来的数据Text(父传过来的值 this.count)}}运行结果:父组件num 666 - 传给子组件 -子组件count666当父组件修改this.num时,子组件立刻自动更新注意点:1.父组件传的名字必须和子组件Prop名字一致2.不支持在构造函数 constructor 中使用 Prop 变量3.Prop变化会触发子组件重新渲染function function_name(){// 执行代码}function_name() // 函数调用// 函数返回值function greet():string{return hello world}function caller(){let msg greet() // 调用greet()函数console.log(msg)}caller()greet()返回类型为stringcaller()返回类型为编译器自动推断可选参数function name(firstName: string, lastName?: string) {}lastName可选,参数可传可不传匿名函数没有函数名的函数没有函数名和参数的匿名函数let msg function(){return hello world;}console.log(msg());Lambda函数(箭头函数)let Test (x:number)10xconsole.log(Test(100)) // 输出1101.不指定函数的参数类型通过函数内来推断参数类型let func x {if(typeof x number){console.log(x是一个数字)}else if(typeof x string){console.log(x是一个字符串)}}func(12)func(Test)2.单个参数()可选 -- 可以为(x)也可以为x3.无函数时可以设置空括号let disp (){console.log(Function invoked);}disp();面向对象包含字段、构造函数、方法class Car{// 字段engine:string;// 构造函数constructor(engin:string){this.engineengin}// 方法disp():void{console.log(engin:this.engin)}}创建实例化对象使用new关键字来实例化类的对象let object_name new class_name([arguments])let obj new Car(Engine 1)访问属性obj.engine访问方法obj.disp()static关键字:用于定义类的数据成员(属性和方法)为静态静态成员可以直接通过类名调用class StaticMem{static num:number;static disp():void{console.log(num值为:StaticMem.num)}}StaticMem.num 12 // 初始化静态变量StaticMem.disp() // 调用静态方法instanceof运算符:用于判断对象是否是指定的类型,返回booleanclass Person{}let obj new Person()let isPerson obj instanceof Person;console.log(obj是Person类实例化来的吗? isPerson) // 返回true访问控制:public(默认):公有,任何地方都可以访问protected:受保护,可以被其自身以及子类访问private:私有,只能被其定义所在的类访问类实现接口:类可以实现接口,使用关键字implements,并将interest字段作为类的属性使用而接口中有的,类中必须自己手动写一遍,不会自动生成除非在构造函数参数前加public/private/protected,才可以省略interface Iloan{interest:number}class AgriLoan implements Iloan{interest:number // 必写,否则报错rebate:numberconstructor(interest:number.rebate:number){this.interest interestthis.rebate rebate}}let obj new AgriLoan(10,1)console.log(interest为obj.interest,rebate为obj.rebate)