第5章 常用组件布局开发 本章内容主要对HarmonyOS原子化服务与服务卡片开发过程中可以使用的各项组件与布局进行汇总与练习。通过组件引用和组合的方式,可以快速实现各项样式与功能; 通过组件的练习,可以快速地让开发者看到成效。我们创作了部分组件练习案例,读者可以直接引用练习,其他组件的使用思路和流程与此相同。 5.1JS通用组件 本节主要对在使用JS语言进行原子化服务与服务卡片开发时所用到的相关通用组件进行说明,包括通用属性、样式、事件等。 5.1.1通用属性 1. 常规属性 常规属性指的是组件普遍支持的用来设置组件基本标识和外观显示特征的属性,该属性的具体相关内容见表51。 表51常规属性 名称类型默认值必填描述 idstring—否组件的唯一标识 stylestring—否组件的样式声明 classstring—否组件的样式类,用于引用样式表 refstring—否用来指定指向子元素或子组件的引用信息,该引用将注册到父组的$refs属性对象上 disabledbooleanfalse否当前组件是否被禁用,在禁用场景下,组件将无法响应用户交互 dirstringauto否设置元素的布局模式,支持设置rtl、ltr和auto共3种属性值。rtl使用从右往左的布局模式,ltr使用从左往右的布局模式,auto跟随系统语言环境 2. 渲染属性 渲染属性是组件普遍支持的用来设置组件是否渲染的属性,该属性的具体相关内容见表52。 表52渲染属性 名称类型默认值描述 forarray—根据设置的数据列表,展开当前元素 ifboolean—根据设置的boolean值,添加或移除当前元素 showboolean—根据设置的boolean值,显示或隐藏当前元素 5.1.2通用样式 通用样式是指普遍支持的可以在style或CSS中设置组件外观样式的组件,通用样式不是必填项,具体名称、类型属性等见表53。 表53通用样式 名称类型默认值描述 width| —设置组件自身的宽度 缺省时使用元素自身内容所需要的宽度 height| —设置组件自身的高度 缺省时使用元素自身内容所需要的高度 minwidth| 0设置元素的最小宽度 minheight| 0设置元素的最小高度 maxwidth| —设置元素的最大宽度,默认无限制 maxheight| —设置元素的最大高度,默认无限制 padding| 0使用简写属性设置所有的内边距属性。该属性可以有1~4个值: 当指定一个值时,该值指定4条边的内边距; 当指定两个值时,第1个值指定上下两边的内边距,第2个值指定左右两边的内边距; 当指定3个值时,第1个值指定上边的内边距,第2个值指定左右两边的内边距,第3个值指定下边的内边距; 当指定4个值时,分别指定上、右、下、左边的内边距(顺时针顺序) padding[left|top|right|bottom]| 0设置左、上、右、下内边距属性 padding [start|end]| 0设置起始和末端内边距属性 续表 名称类型默认值描述 margin| 0使用简写属性设置所有的外边距属性,该属性可以有1~4个值。当只有一个值时,这个值会被指定给全部的4条边; 当有两个值时,第1个值被匹配给上和下,第2个值被匹配给左和右; 当有3个值时,第1个值被匹配给上,第2个值被匹配给左和右,第3个值被匹配给下; 当有4个值时,会依次按上、右、下、左的顺序匹配 (顺时针顺序) margin[left|top|right|bottom]| 0设置左、上、右、下外边距属性 margin[start|end]| 0设置起始和末端外边距属性 border—0使用简写属性设置所有的边框属性,包含边框的宽度、样式、颜色属性,按顺序设置为borderwidth、borderstyle、bordercolor,不设置时,各属性值为默认值 borderstylestringsolid使用简写属性设置所有边框的样式,可选值dotted表示显示为一系列圆点,圆点半径为borderwidth的一半; 可选值dashed表示显示为一系列短的方形虚线; 可选值solid表示显示为一条实线 border[left|top|right|bottom]stylestringsolid分别设置左、上、右、下4条边框的样式,可选值为dotted、dashed、solid border[left|top|right|bottom]——使用简写属性设置对应位置的边框属性,包含边框的宽度、样式、颜色属性,顺序设置为borderwidth、borderstyle、bordercolor,不设置的值为默认值 borderwidth0使用简写属性设置元素的所有边框宽度,或者单独为各边边框设置宽度 border[left|top| right|bottom] width0分别设置左、上、右、下4条边框的宽度 bordercolorblack使用简写属性设置元素的所有边框颜色,或者单独为各边边框设置颜色 border[left|top| right|bottom] colorblack分别设置左、上、右、下4条边框的颜色 borderradius—borderradius属性用于设置元素的外边框圆角半径。设置borderradius时不能单独设置某一个方向的border[left|top|right|bottom]width、border[left|top|right|bottom]color、border[left|top|right|bottom]style,如果要设置color、width和style,则需要将4个方向一起设置(borderwidth、bordercolor、borderstyle) 续表 名称类型默认值描述 border[top| bottom][left| right]radius—分别设置左上、右上、右下和左下4个角的圆角半径 background—仅支持设置渐变样式,与backgroundcolor、backgroundimage不兼容 backgroundcolor—设置背景颜色 backgroundimagestring—设置背景图片。与backgroundcolor、background不兼容,支持本地图片资源地址,示例: backgroundimage: url("/common/background.png") backgroundsizestring auto设置背景图片的大小。string可选值: contain把图片扩展至最大尺寸,以使其高度和宽度完全适用内容区域; cover把背景图片扩展至足够大,以使背景图片完全覆盖背景区域; 背景图片的某些部分也许无法显示在背景定位区域中; auto保持原图的比例不变。length值: 设置背景图片的高度和宽度。第1个值设置宽度,第2个值设置高度。如果只设置一个值,则第2个值会被设置为auto。百分比参数以父元素的百分比设置背景图片的宽度和高度。第1个值设置宽度,第2个值设置高度。如果只设置一个值,则第2个值会被设置为 auto backgroundrepeatstringrepeat针对重复背景图片样式进行设置,背景图片默认在水平和垂直方向上重复。repeat在水平轴和竖直轴上同时重复绘制图片; repeatx: 只在水平轴上重复绘制图片; repeaty: 只在竖直轴上重复绘制图片; norepeat: 不会重复绘制图片 backgroundpositionstring string 0px 0px关键词方式: 如果仅规定了一个关键词,则第2个值为center。两个值分别用于定义水平方向位置和竖直方向位置 left是水平方向上最左侧; right是水平方向上最右侧; top是竖直方向上最顶部; bottom是竖直方向上最底部; center是水平方向或竖直方向上中间位置; length值: 第1个值是水平位置,第2个值是垂直位置。 左上角是 0 0。单位是像素 (0px 0px) 。如果仅规定了一个值,则另外一个值将是50%。百分比参数: 第1个值是水平位置,第2个值是垂直位置。左上角是 0% 0%。右下角是 100% 100%。如果仅规定了一个值,则另外一个值为50%。可以混合使用 续表 名称类型默认值描述 boxshadowstring0语法为boxshadow: hshadow vshadow blur spread color,通过这个样式可以设置当前组件的阴影样式,包括水平位置(必填)、垂直位置(必填)、模糊半径(可选,默认值为0)、阴影延展距离(可选,默认值为0)、阴影颜色(可选,默认值为黑色),示例: ①boxshadow :10px 20px 5px 10px #888888; ②boxshadow :100px 100px 30px red; ③boxshadow :100px 100px 0px 40px filterstring—语法为filter: blur(px),通过这个样式可以将当前组件布局范围的内容设置为模糊,参数用于指定模糊半径,如果没有设置值,则默认为0(不模糊),不支持百分比,示例: filter: blur(10px) backdropfilterstring—语法为backdropfilter: blur(px),通过这个样式可以将当前组件布局范围的背景设置为模糊,参数用于指定模糊半径,如果没有设置值,则默认为0(不模糊),不支持百分比,示例: backdropfilter: blur(10px) opacitynumber1元素的透明度,取值范围为0~1,1表示不透明,0表示完全透明 displaystringflex确定一个元素所产生的框的类型,可选值为flex,表示弹性布局; none不渲染此元素 visibilitystringvisible是否显示元素所产生的框。不可见的框会占用布局(将display属性设置为none来完全去除框),可选值为visible,表示元素正常显示; hidden表示隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明(说明: visibility和display样式都设置时,仅display生效) flexnumber|string—规定当前组件如何适应父组件中的可用空间。 flex可以指定1个、2个或3个值。 单值语法: 一个无单位数用来设置组件的flexgrow; 一个有效的宽度值用来设置组件的flexbasis。 双值语法: 第1个值必须是无单位数,用来设置组件的flexgrow,第2个值可以是一个无单位数,用来设置组件的flexshrink,还可以是一个有效的宽度值,用来设置组件的flexbasis。 三值语法: 第1个值必须是无单位数,用来设置组件的flexgrow; 第2个值必须是无单位数,用来设置组件的flexshrink; 第3个值必须是一个有效的宽度值,用来设置组件的flexbasis(说明: 仅父容器为
时生效) 续表 名称类型默认值描述 flexgrownumber0设置组件的拉伸样式,指定父组件容器主轴方向上的剩余空间(容器本身大小减去所有flex子元素占用的大小)的分配权重。0为不伸展(说明: 仅父容器为
时生效) flexshrinknumber1设置组件的收缩样式,元素仅在默认宽度之和大于容器的时候才会发生收缩,0为不收缩(说明: 仅父容器为
时生效) flexbasis—设置组件在主轴方向上的初始大小(说明: 仅父容器为
时生效) alignselfstring—设置自身在父元素交叉轴上的对齐方式,该样式会覆盖父元素的alignitems样式,仅在父容器为div、list时生效。可选值stretch弹性元素表示在交叉轴方向被拉伸到与容器相同的高度或宽度; flexstart元素表示向交叉轴起点对齐; flexend元素表示向交叉轴终点对齐; center元素表示在交叉轴居中; baseline元素表示在交叉轴基线对齐 positionstringrelative设置元素的定位类型,不支持动态变更。 fixed相对于整个界面进行定位; absolute相对于父元素进行定位; relative相对于其正常位置进行定位(说明: absolute属性仅在父容器为
时生效) [left|top|right|bottom]| —left|top|right|bottom需要配合position样式使用,来确定元素的偏移位置。 left属性规定元素的左边缘。该属性定义了定位元素左外边距边界与其包含块左边界之间的偏移。 top属性规定元素的顶部边缘。该属性定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。 right属性规定元素的右边缘。该属性定义了定位元素右外边距边界与其包含块右边界之间的偏移。 bottom属性规定元素的底部边缘。该属性定义了一个定位元素的下外边距边界与其包含块下边界之间的偏移 [start|end]| —start|end需要配合position样式使用,来确定元素的偏移位置。 start属性规定元素的起始边缘。该属性定义了定位元素起始外边距边界与其包含块起始边界之间的偏移。 end属性规定元素的结尾边缘。该属性定义了一个定位元素的结尾边距边界与其包含块结尾边界之间的偏移 续表 名称类型默认值描述 zindexnumber—表示对于同一父节点其子节点的渲染顺序。数值越大,渲染数据越靠后(说明: zindex不支持auto,并且opacity等其他样式不会影响zindex的渲染顺序) imagefill—为svg图片填充颜色,支持组件范围(与设置图片资源的属性): button(icon属性)、piece(icon属性)、search(icon属性)、input(headericon属性)、textarea(headericon属性)、image(src属性)、toolbaritem(icon属性)。 svg图片文件内的fill属性颜色值在渲染时将被替换为imagefill所配的颜色值,并且仅对svg图片内显示声明的fill属性生效 clippath[| ]| none—设置组件的裁剪区域。区域内的部分显示,区域外的部分不显示。: 表示裁剪区域的作用范围,默认为borderbox。可选值为marginbox: margin,计算入长和宽尺寸内; borderbox: border计算入长和宽尺寸内; paddingbox: padding计算入长和宽尺寸内; contentbox: margin/border/padding不计算入长和宽尺寸内。 表示裁剪的形状,包含以下类型: inset,格式为inset( {1,4} [ round <'borderradius'> ]? ); circle,格式为circle( [ ]? [ at ]? ); ellipse,格式为ellipse( [ {2} ]? [ at ]? ); polygon,格式为polygon( [ ]#); path,格式为path( ) 5.1.3通用事件 相对于私有事件,通用事件是大部分组件可以绑定的事件,该事件的相关内容具体见表54。 表54通用事件 名称参数描述 click—单击动作触发该事件 change—监听事件 5.1.4渐变样式 渐变样式组件普遍支持在style或CSS中设置,可以平稳过渡两个或多个指定的颜色。开发框架支持线性渐变 (lineargradient)和重复线性渐变 (repeatinglineargradient)两种渐变效果。 使用渐变样式,需要定义过渡方向和过渡颜色。 1) 过渡方向 通过direction或者angle指定: (1) direction表示进行方向渐变。 (2) angle表示进行角度渐变。 background: linear-gradient(direction/angle, color, color, ...); background: repeating-linear-gradient(direction/angle, color, color, ...); 2) 过渡颜色 (1) 支持以下4种方式: #ff0000、#ffff0000、rgb(255, 0, 0)、rgba(255, 0, 0, 1),需要至少指定两种颜色。 (2) 过渡属性,见表55。 表55过渡颜色 名称类型默认值必填描述 directionto = [left|right]||[top|bottom]to bottom (由上到下渐变)否指定过渡方向,如: to left (从右向左渐变); 或者to bottom right (从左上角到右下角) angle180deg否指定过渡方向,以元素几何中心为坐标原点,水平方向为X轴,angle指定了渐变线与Y轴的夹角(顺时针方向) color|]—是定义使用渐变样式区域内颜色的渐变效果 5.1.5媒体查询 媒体查询(Media Query)在移动设备上应用十分广泛,开发者经常需要根据设备的大致类型或者特定的特征和设备参数(例如屏幕分辨率)来修改应用的样式。为此媒体查询提供了以下功能: (1) 针对设备和应用的属性信息,可以设计出相匹配的布局样式。 (2) 当屏幕发生动态改变时(例如分屏、横竖屏切换),应用页面布局同步更新。 1. CSS语法规则 使用@media可引入查询语句,具体规则如下: @media (media-feature) { CSS-Code; } 示例如下: @media (dark-mode: true) {… } //当设备为深色模式时生效 @media screen and (round-screen: true) { … } //当设备屏幕是圆形时条件成立 @media (max-height: 800) { … } //范围查询,CSS level 3 写法 @media (height <= 800) { … } //范围查询,CSS level 4 写法,与CSS level 3写法等价 @media screen and (device-type: tv) or (resolution < 2) { …} //同时包含媒体类型和多个媒体 //特征的多条件复杂语句查询 2. 页面中引用资源 通过@import方式引入媒体查询,具体使用方法如下: @import url (media-feature); //例如 @import '../common/style.css' (dark-mode:true); 3. 媒体类型 媒体类型见表56,需要按屏幕相关参数进行媒体查询。 表56媒体类型 类型说明 screen按屏幕相关参数进行媒体查询 4. 媒体逻辑操作 媒体逻辑操作符,and、or、not、only用于构成复杂媒体查询,也可以通过逗号(,)将其组合起来,详细解释说明见表57。 表57媒体逻辑操作 类型说明 and将多个媒体特征(Media Feature)以“与”的方式连接成一个媒体查询,只有当所有媒体特征都为true时,查询条件成立。另外,它还可以将媒体类型和媒体功能结合起来,例如: screen and (devicetype: wearable) and (maxheight: 600) 表示当设备类型是智能穿戴同时应用的最大高度小于或等于600像素单位时成立 续表 类型说明 not取反媒体查询结果,媒体查询结果不成立时返回值为true,否则返回值为false。在媒体查询列表中应用not,not仅取反应用它的媒体查询,例如: not screen and (minheight: 50) and (maxheight: 600) 表示当应用高度小于50像素单位或者大于600像素单位时成立(说明: 使用not运算符时必须指定媒体类型) only当整个表达式都匹配时,才会应用选择的样式,可以应用在防止某些较早版本的浏览器上产生歧义的场景。一些较早版本的浏览器对于同时包含了媒体类型和媒体特征的语句会产生歧义,例如: screen and (minheight: 50),较早版本浏览器会将这句话理解成screen,从而导致仅仅匹配媒体类型(screen),只应用了指定样式,使用only可以很好地规避这种情况(说明: 使用only时必须指定媒体类型) ,(逗号)将多个媒体特征以“或”的方式连接成一个媒体查询,如果存在结果为true的媒体特征,则查询条件成立。其效果等同于or运算符,例如: screen and (minheight: 1000), (roundscreen: true) 表示当应用高度大于或等于1000像素单位或者设备屏幕是圆形时,条件成立 or将多个媒体特征以“或”的方式连接成一个媒体查询,如果存在结果为true的媒体特征,则查询条件成立,例如: screen and (maxheight: 1000) or(roundscreen: true)表示当应用高度小于或等于1000像素单位或者设备屏幕是圆形时,条件成立 5. 媒体特征 媒体特征包括高度、宽度、分辨率等内容,具体见表58。 表58媒体特征 类型说明 height应用页面显示区域的高度 minheight应用页面显示区域的最小高度 maxheight应用页面显示区域的最大高度 width应用页面显示区域的宽度 minwidth应用页面显示区域的最小宽度 maxwidth应用页面显示区域的最大宽度 resolution设备的分辨率,支持dpi、dppx和dpcm单位。其中,dpi表示每英寸中物理像素的个数,1dpi≈0.39dpcm; dpcm表示每厘米上的物理像素个数,1dpcm≈2.54dpi; dppx表示每个px中的物理像素数(此单位按96px=1英寸为基准,与页面中的px单位计算方式不同),1dppx=96dpi minresolution设备的最小分辨率 maxresolution设备的最大分辨率 orientation屏幕的方向 可选值为orientation: portrait(设备竖屏)和orientation: landscape(设备横屏) aspectratio应用页面显示区域的宽度与高度的比值,例如: aspectratio:1/2 minaspectratio应用页面显示区域的宽度与高度的最小比值 续表 类型说明 maxaspectratio应用页面显示区域的宽度与高度的最大比 deviceheight设备的高度 mindeviceheight设备的最小高度 maxdeviceheight设备的最大高度 devicewidth设备的宽度 mindevicewidth设备的最小宽度 maxdevicewidth设备的最大宽度 devicetype设备类型,支持phone(手机)、tablet(平板)、tv(智慧屏)、wearable(智能穿戴) roundscreen屏幕类型,圆形屏幕为true, 非圆形屏幕为 false darkmode系统在深色模式下为true,否则为false 5.2JS容器组件 本节主要对JS容器组件进行整体介绍与进行部分组件实战练习,包括JS容器组件的类别名称、功能说明与实例等。 5.2.1容器组件 容器组件名称类别及相关功能使用说明,详细见表59。 表59容器组件 名称说明 badge如果应用中有需用户关注的新事件提醒,则可以采用新事件标记来标识 div基础容器,用作页面结构的根节点或将内容进行分组 list列表包含一系列相同宽度的列表项。适合连续、多行呈现同类数据,例如图片和文本 listitem的子组件,用来展示列表的具体item stack堆叠容器,子组件按照顺序依次入栈,后一个子组件覆盖前一个子组件 swiper滑动容器,提供切换子组件显示的能力 5.2.2容器组件示例 1. badge 如果应用中有需用户关注的新事件提醒,则可以采用新事件标记来标识,需要使用badge。 1) 演示案例主要代码 index.hml文件的代码如下: /*第5章/badge案例index.hml代码部分*/
//标记提醒 example //标记提醒 example
index.css文件的代码如下: //第5章/badge案例index.css代码部分 .container { flex-direction: column; width: 100%; align-items: center; } //标记样式 .badge { width: 50%; margin-top: 100px; } .text1 { background-color: #f9a01e; font-size: 30px; padding: 10px; } .text2 { background-color: #46b1e3; font-size: 30px; padding: 10px; } index.js文件的代码如下: //第5章/badge案例index.js代码部分 export default { data:{ //提醒样式 badgeconfig:{ badgeColor:"#0a59f7", textColor:"#ffffff", } } } 2) 演示案例效果展示 badge演示案例效果,如图51所示。 图51展示效果(1) 2. div div是基础容器,用作页面结构的根节点或将内容进行分组。 1) 演示案例主要代码 index.hml文件的代码如下: /*第5章/div案例index.hml代码部分*/
//节点
index.css文件的代码如下: //第5章/div案例index.css代码部分 .container { flex-direction: column; justify-content: center; align-items: center; width: 454px; height: 454px; } .flex-box { justify-content: space-around; align-items: center; width: 400px; height: 140px; background-color: #ffffff; } .flex-item { width: 120px; height: 120px; border-radius: 16px; } .color-primary { background-color: #007dff; } .color-warning { background-color: #ff7500; } .color-success { background-color: #41ba41; } 2) 演示案例效果展示 div基础容器演示案例效果如图52所示。 图52展示效果(2) 3. list和listitem list和listitem是列表类组件,列表包含一系列相同宽度的列表项。适合连续、多行呈现同类数据,例如图片和文本。 1) 演示案例主要代码 index.hml文件的代码如下: /*第5章/list和list-item案例index.hml代码部分*/
//列表容器 {{$item.title}} {{$item.date}}
index.css文件的代码如下: //第5章/list和list-item案例index.css代码部分 .container { display: flex; justify-content: center; align-items: center; left: 0px; top: 0px; width: 454px; height: 454px; } .todo-wrapper { width: 454px; height: 300px; } .todo-item { width: 454px; height: 80px; flex-direction: column; } .todo-title { width: 454px; height: 40px; text-align: center; } index.js文件的代码如下: //第5章/list和list-item案例index.js代码部分 export default { data: { todolist: [{ title: '刷题', date: '2021-12-31 10:00:00', }, { title: '看电影', date: '2021-12-31 20:00:00', }], }, } 2) 演示案例效果展示 list和listitem列表类组件演示案例效果,如图53所示。 图53展示效果(3) 4. stack stack是堆叠容器,子组件按照顺序依次入栈,后一个子组件覆盖前一个子组件。 1) 演示案例主要代码 index.hml文件的代码如下: /*第5章/stack案例index.hml代码部分*/ //节点
index.css文件的代码如下: //第5章/stack案例index.css代码部分 .stack-parent { width: 400px; height: 400px; background-color: #ffffff; border-width: 1px; border-style: solid; } .back-child { width: 300px; height: 300px; background-color: #3f56ea; } .front-child { width: 100px; height: 100px; background-color: #00bfc9; } .positioned-child { width: 100px; height: 100px; left: 50px; top: 50px; background-color: #47cc47; } .bd-radius { border-radius: 16px; } 2) 演示案例效果展示 stack堆叠容器组件案例演示效果如图54所示。 图54展示效果(4) 5. swiper swiper是滑动容器,提供切换子组件显示的能力。 1) 演示案例主要代码 index.hml文件的代码如下: /*第5章/swiper案例index.hml代码部分*/
//滑动容器
1
2
3
//文本输入框和单击事件
index.css文件的代码如下: //第5章/swiper案例index.css代码部分 .container { flex-direction: column; width: 100%; height: 100%; align-items: center; } .swiper { flex-direction: column; align-content: center; align-items: center; width: 70%; height: 130px; border: 1px solid #000000; indicator-color: #cf2411; indicator-size: 14px; indicator-bottom: 20px; indicator-right: 30px; margin-top: 100px; next-margin:20px; previous-margin:20px; } .swiperContent1{ height: 100%; justify-content: center; background-color: #007dff; } .swiperContent2{ height: 100%; justify-content: center; background-color: #ff7500; } .swiperContent3{ height: 100%; justify-content: center; background-color: #41ba41; } .button { width: 70%; margin: 10px; } .text { font-size: 40px; } index.js文件的代码如下: //第5章/swiper案例index.js代码部分 export default { swipeTo() { //获取下标 this.$element('swiper').swipeTo({index: 2}); }, showNext() { this.$element('swiper').showNext(); }, showPrevious() { this.$element('swiper').showPrevious(); } } 2) 演示案例效果展示 swiper是滑动容器组件,演示案例效果如图55中(a)→(b)→(c)所示。 图55展示效果(5) 5.3JS基础组件 本节主要阐述JS基础组件的名称类别、功能样式,以及部分JS基础组件案例实战练习。 5.3.1基础组件 JS基础组件主要的名称类别与相关功能的使用说明见表510。 表510基础组件 名称说明 button提供按钮组件,包括胶囊按钮、圆形按钮、文本按钮 calendar提供日历组件,用于呈现日历界面 chart图表组件,用于呈现线性图、柱状图、量规图界面 clock时钟组件,用于提供时钟表盘界面 divider提供分隔器组件,分隔不同内容块/内容元素。可用于列表或界面布局 image图片组件,用来渲染并展示图片 progress进度条,用于显示内容加载或操作处理进度 span作为子组件提供文本修饰能力 text文本,用于呈现一段信息 5.3.2基础组件示例 1. button button提供按钮组件,包括胶囊按钮、圆形按钮、文本按钮。 1) 演示案例主要代码 index.hml文件的代码如下: /*第5章/基础组件button案例index.hml代码部分*/
//下载进度 //加载 //单击跳转
index.css文件的代码如下: //第5章/基础组件button案例index.css代码部分 .div-button { flex-direction: column; align-items: center; } .button { margin-top: 15px; } .last{ background-color: #F2F2F2; text-color: #969696; margin-top: 15px; width: 280px; height:72px; } .next{ width: 180px; height: 50px; font-size: 26px; border-radius: 25px; } .button:waiting { width: 280px; } .text { text-color: red; font-size: 40px; font-weight: 900; font-family: sans-serif; font-style: normal; } .download { width: 280px; text-color: white; background-color: #007dff; } index.js文件的代码如下: //第5章/基础组件button案例index.js代码部分 import router from '@system.router';//导入模块 export default { data: { count: 5, downloadText: "Download" }, //跳转 goIndex(){ router.push({ uri:'pages/index/index' }) }, //下载 progress(e) { this.count+= 10; this.downloadText = this.count+ "%"; this.$element('download-btn').setProgress({ progress: this.count}); if (this.count>= 100) { this.downloadText = "Done"; } } } 2) 演示案例效果展示 button按钮组件,演示案例效果如图56(a)→(b)→(c)所示。 图56展示效果(6) 2. chart chart是图表组件,用于呈现线性图、柱状图、量规图界面。 1) 演示案例主要代码 index.hml文件的代码如下: /*第5章/基础组件chart案例index.hml代码部分*/
//图表-线状
//按钮
index.css文件的代码如下: //第5章/基础组件chart案例index.css代码部分 .container { flex-direction: column; justify-content: center; align-items: center; } .chart-region { height: 400px; width: 700px; } .chart-background { width: 700px; height: 400px; background-color: cadetblue; } .chart-data { width: 700px; height: 600px; } button { width: 100%; height: 50px; background-color: #F4F2F1; text-color: #0C81F3; } index.js文件的代码如下: //第5章/基础组件chart案例index.js代码部分 export default { data: { lineData: [ { strokeColor: '#0081ff', fillColor: '#cce5ff', data: [763, 550, 551, 554, 731, 654, 525, 696, 595, 628, 791, 505, 613, 575, 475, 553, 491, 680, 657, 716], gradient: true, } ], lineOps: { xAxis: { min: 0, max: 20, display: false, }, yAxis: { min: 0, max: 1000, display: false, }, series: { lineStyle: { width: "5px", smooth: true, }, headPoint: { shape: "circle", size: 20, strokeWidth: 5, fillColor: '#ffffff', strokeColor: '#007aff', display: true, }, loop: { margin: 2, gradient: true, } } }, }, //单击增加 addData() { this.$refs.linechart.append({ serial: 0, data: [Math.floor(Math.random() * 400) + 400] }) } } 2) 演示案例效果展示 chart是图表组件,演示案例效果如图57所示。 图57展示效果(7) 3. progress progress为进度条组件,用于显示内容加载或操作处理进度。 1) 演示案例主要代码 index.hml文件的代码如下: /*第5章/基础组件progress案例index.hml代码部分*/
index.css文件的代码如下: //第5章/基础组件progress案例index.css代码部分 .container { flex-direction: column; height: 100%; width: 100%; align-items: center; } .min-progress { width: 200px; height: 200px; } 2) 演示案例效果展示 progress进度条组件,演示案例效果如图58所示。 图58展示效果(8) 5.4JS自定义组件与附录 本节主要阐述JS自定义组件的使用方式,以及与相关长度、颜色选择时的一些参考附录及表格等内容。 5.4.1基本用法 自定义组件是用户根据业务需求,将已有的组件组合,封装成的新组件,可以在工程中多次调用,提高代码的可读性。自定义组件通过element引入宿主页面,代码如下:
(1) name属性指自定义组件名称(非必填),组件名称对大小写不敏感,默认使用小写。src属性指自定义组件HML文件的路径(必填),若没有设置name属性,则默认使用HML文件名作为组件名。 (2) 事件绑定: 自定义组件中绑定子组件事件使用(on|@)child1语法,子组件中通过{action:"proxy", method: "eventName"}触发事件并进行传值,父组件执行bindParentVmMethod方法并接收子组件传递的参数。 自定义组件配置文件标签的相关内容见表511。 表511自定义组件配置文件标签 属性类型描述 dataObject页面的数据模型,类型是对象。属性名不能以$或_开头,不要使用保留字for、if、show、tid propsArray/ Objectprops用于组件之间的通信,可以通过方式传递给组件; props名称必须用小写,不能以$或_开头,不要使用保留字for、if、show、tid。目前props的数据类型不支持Function 5.4.2自定义事件 自定义组件内支持自定义事件,该事件的标识需要将action类型指定为proxy,事件名则通过method指定。使用该自定义组件的卡片页面可以通过该事件名注册相应的事件回调,当自定义组件内该自定义事件触发时,会触发卡片页面上注册的回调事件。 1. 子组件comp示例 comp.hml文件的示例代码如下:
comp.css文件的示例代码如下: //第5章/子组件comp示例comp.css代码部分 .container { flex-direction:column; background-color: green; width: 100%; height: 100%; } .row-3 { width: 100%; height: 50px; background-color: orange; font-size:15px; } comp.json文件的示例代码如下: //第5章/子组件comp示例comp.json代码部分 { "data": { }, "actions": { "buttonClicked": { "action": "proxy", "method:" "event_1" } } } 2. 卡片页面示例 index.hml文件的示例代码如下:
index.css文件的示例代码如下: .container { background-color: red; height: 500px; width: 500px; } index.json文件的示例代码如下: //第5章/卡片页面示例index.json代码部分 { "data": { }, "actions": { "click": { "action": "message", "params": { "message": "click event" } }, "buttonClick": { "action": "message", "params": { "message": "click event 2" } } } } 5.4.3props 自定义组件可以通过props声明属性,父组件通过设置属性向子组件传递参数。具体内容如下。 1. 添加默认值 子组件可以通过固定值default设置默认值,当父组件没有设置该属性时,将使用其默认值。此情况下props属性必须为对象形式,不能用数组形式,示例如下。 demo.hml文件的示例代码如下:
{{text}}
{{textdata[0]}}
demo.json文件的示例代码如下: //第5章/props自定义组件demo.json代码部分 { "data": { "progress": { "default": "80" } }, "props": { "textdata": { "default": ["a","b"] }, "progress": { "default": 60 }, "text": { "default": "ha" } }, "actions": { "buttonClicked": { "action": "proxy", "method": "event_1" } } } demo.hml文件的示例代码如下:
2. 数据单向性 父子组件之间数据的传递是单向的,只能从父组件传递给子组件,子组件不能直接修改父组件传递来的值,可以将props传入的值用data接收后作为默认值,再对data的值进行修改。 5.4.4附录 附录主要对常用的长度类型和颜色类型的相关内容进行展示,便于查阅与对照。 (1) 长度类型,见表512。 表512长度类型 名称类型定义描述 lengthstring|number用于描述尺寸单位,输入为number类型时,使用px单位; 输入为string类型时,需要显式指定像素单位,当前支持的像素单位包括px和fp。px是逻辑尺寸单位; fp是字体大小单位,会随系统字体大小的设置而发生变化,仅支持文本类组件设置相应的字体大小 percentagestring百分比尺寸单位,如50% (2) 颜色类型,见表513。 表513颜色类型 名称类型定义描述 colorstring|颜色枚举字符串 用于描述颜色信息。字符串格式如下: rgb(255, 255, 255),rgba(255, 255, 255, 1.0)。HEX格式: #rrggbb,#aarrggbb。枚举格式: black,white。(说明: JS脚本中不支持颜色枚举格式) 5.5Java组件开发 本节主要阐述常用的Java布局、组件相关的整体知识与进行部分布局、组件的实战案例练习。 5.5.1常用布局 Java常用布局及相关功能使用说明,见表514。 表514常用布局 名称说明 DirectionalLayoutDirectionalLayout是Java UI中的一种重要组件布局,用于将一组组件(Component)按照水平或者垂直方向排布,能够方便地对齐布局内的组件。该布局和其他布局的组合,可以实现更加丰富的布局方式 DependentLayoutDependentLayout是Java UI框架里的一种常见布局。与DirectionalLayout相比,拥有更多的排布方式,每个组件可以指定相对于其他同级元素的位置,或者指定相对于父组件的位置 StackLayoutStackLayout直接在屏幕上开辟出一块空白的区域,添加到这个布局中的视图都以层叠的方式显示,而它会把这些视图默认放到这块区域的左上角,第1个添加到布局中的视图显示在最底层,最后一个被放在最顶层。上一层的视图会覆盖下一层的视图 TableLayoutTableLayout使用表格的方式划分子组件 PositionLayout在PositionLayout中,子组件通过指定准确的x/y坐标值在屏幕上显示。(0, 0)为左上角; 当向下或向右移动时,坐标值变大; 允许组件之间互相重叠 AdaptiveBoxLayout①AdaptiveBoxLayout是自适应盒子布局,该布局提供了在不同屏幕尺寸设备上的自适应布局能力,主要用于相同级别的多个组件需要在不同屏幕尺寸设备上自动调整列数的场景; ②该布局中的每个子组件都用一个单独的“盒子”装起来,子组件设置的布局参数都以盒子作为父布局生效,不以整个自适应布局为生效范围; ③该布局中每个盒子的宽度固定为布局总宽度除以自适应得到的列数,高度为match_content,每行中的所有盒子按高度最高的进行对齐; ④该布局在水平方向自动分块,因此水平方向不支持match_content,布局水平宽度仅支持match_parent或固定宽度; ⑤自适应仅在水平方向进行自动分块,纵向没有限制,因此如果将某个子组件的高设置为match_parent类型,则可能导致后续行无法显示 下面我们通过几个案例练习Java组件的使用。 1. DirectionalLayout 1) 垂直布局 ability_main.xml文件的代码如下: /*第5章/DirectionalLayout案例垂直布局ability_main.xml代码*/ //按钮1