HarmonyOS 开发-图片九宫格封装案例

介绍

本示例介绍使用(Flex)

组件实现图片在不同个数情况下的布局效果(默认布局和自定义布局)。该场景多用于社交类应用。

效果图预览

使用说明

  1. 默认布局情况下,传入图片资源imageSource(类型为Resource[]),图片会按照个数进行相应的布局。
  2. 自定义布局情况下,传入图片资源imageSource(类型为Resource[])和自定义列数col(类型为number)。
  3. 通过指定flexWidth(类型为string)参数,可调整整个图片布局的宽度。
  4. 通过指定modifier(类型需继承AttributeModifier
    )参数,可以指定image的相关参数,modifier具体使用参考动态属性设置。

默认布局策略:

  • 1张图片时,图片显示效果的长宽比保持不变。
  • 2-3,5-9张图片时,图片按九宫格的形式布局,图片裁切为正方形,且图片大小一致.
  • 4张图片时,图片按四宫格布局(两行两列),图片大小同九宫格。

实现思路

1.在自定义组件创建的回调里根据传入的col值决定布局方式,若参数col<=0为默认布局,若参数col>0为自定义布局(图片布局的列数=col),

此部分逻辑会根据传入参数的不同走不同的逻辑。

typescript 复制代码
aboutToAppear(){
  this.arraySize = this.imageSource.length
  // 未传入col值时所走的逻辑,此时图片按默认方式布局
  if (this.col <= COLUMNS_0) {
    this.arraySize = Math.min(this.imageSource.length, IMAGE_SET_SIZE_9)
    this.row = Math.ceil(this.arraySize / COLUMNS_3)

    // 不同数量的图片对应不同的参数、布局
    if (this.arraySize === IMAGE_SET_SIZE_1) {
      this.col = COLUMNS_1
      this.imageAspectRatio = IMAGE_ASPECT_RATIO_0
      this.imageFit = ImageFit.Contain
      this.imageWidth = '60%'
    }
    else if (this.arraySize === IMAGE_SET_SIZE_4) {
      this.col = COLUMNS_2
      this.flexWidth = '50%'
      this.imageWidth = `calc((100% - ${this.imageSpacing}vp ) / 2)`
    }
    else {
      this.col = COLUMNS_3
      this.imageWidth = `calc((100% - ${this.imageSpacing * COLUMNS_2}vp ) / 3)`
    }
  }
  // 传入col值时所走的逻辑,此时图片传入的col值进行布局
  else {
    this.row = Math.ceil(this.arraySize / this.col)
    this.imageWidth = `calc((100% - ${this.imageSpacing * (this.col - 1)}vp ) / ${this.col})`
  }

}

2.布局主要是利用Flex的自适应能力及控制参数的变化来达到想要的布局效果。

typescript 复制代码
build(){
  Flex({ wrap: FlexWrap.Wrap, justifyContent: FlexAlign.Start }){
    ForEach(this.imageSource.slice(0, this.arraySize), (item: string | Resource, idx: number) => {
      Image(item)
        .attributeModifier(this.modifier)
        .autoResize(true)
        .objectFit(this.imageFit)
        .aspectRatio(this.imageAspectRatio)
        .width(this.imageWidth)
        .margin(
          {
            bottom: (idx + 1) > ((this.row - 1) * this.col) ? 0 : this.imageSpacing,
            right: (idx + 1) % this.col === 0 ? 0 : this.imageSpacing
          }
        )
    })
  }
  .width(this.flexWidth)
}

3.为image组件指定特定的参数可实现AttributeModifier的继承类,声明想要的属性并实现对应的方法。继承类及使用的代码如下

typescript 复制代码
// 图片属性的modifier类,便于用户扩展image相关的属性
class ImageModifier implements AttributeModifier<ImageAttribute> {
  private imageFit: ImageFit = ImageFit.Fill;
  private imageRenderMode: ImageRenderMode = ImageRenderMode.Original;

  constructor() {
  }

  applyNormalAttribute(instance: ImageAttribute): void {
    instance.objectFit(this.imageFit)
    instance.renderMode(this.imageRenderMode)
  }

  objectFit(fit: ImageFit): ImageModifier {
    this.imageFit = fit;
    return this;
  }

  renderMode(mode: ImageRenderMode): ImageModifier {
    this.imageRenderMode = mode;
    return this;
  }
}
···
private imageModifier: ImageModifier = new ImageModifier().objectFit(ImageFit.Fill)
  .renderMode(ImageRenderMode.Original)
···
MultiGrid({ imageSource: item, modifier: this.imageModifier })

工程结构&模块类型

imagegridlayout                             // har类型
|---src/main/ets/components/mainpage
|   |---ImageGridLayout.ets                 // 图片九宫格展示实现页面
|   |---MultiGrid.ets                       // 图片九宫格案例封装

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ......

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ......

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ......

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题

2.性能优化方向

3.架构方向

4.鸿蒙开发系统底层方向

5.鸿蒙音视频开发方向

6.鸿蒙车载开发方向

7.鸿蒙南向开发方向

相关推荐
鑫宝Code1 小时前
【React】状态管理之Redux
前端·react.js·前端框架
鸿蒙自习室1 小时前
鸿蒙动画开发06——打断动画
ui·华为·harmonyos·鸿蒙
Allen zhu3 小时前
【PowerHarmony】电鸿蒙学习记录-编写helloworld!
学习·华为·harmonyos
Jiaberrr3 小时前
开启鸿蒙开发之旅:交互——点击事件
前端·华为·交互·harmonyos·鸿蒙
LKAI.3 小时前
华为路由策略配置
运维·网络·华为·智能路由器
SuperHeroWu74 小时前
【HarmonyOS】应用实现读取剪切板内容(安全控件和自读取)
安全·华为·harmonyos·鸿蒙·权限·剪切板·systepasteboard
lqj_本人4 小时前
鸿蒙next版开发:相机开发-元数据(ArkTS)
数码相机·华为·harmonyos
熊的猫5 小时前
DOM 规范 — MutationObserver 接口
前端·javascript·chrome·webpack·前端框架·node.js·ecmascript
mez_Blog5 小时前
Vue之插槽(slot)
前端·javascript·vue.js·前端框架·插槽
放逐者-保持本心,方可放逐5 小时前
vue3 中那些常用 靠copy 的内置函数
前端·javascript·vue.js·前端框架