HarmonyOS 鸿蒙Next中图文混排

HarmonyOS 鸿蒙Next中图文混排

一、场景概述

图文混排是指在同一布局中将文字与图片有机结合,形成更具表现力的 UI 展示方式。它不仅仅是简单地放置一个Text或Image,而是通过布局策略让两者在视觉上协调,增强信息传达效果。常见形式包括文字环绕图片、图上叠加文字、图标与文字组合等,广泛应用于商品详情页、新闻正文、卡片组件、标签徽章等场景。

1.1 使用场景

图文混排在空间充足时,通过调整组件的位置与展示方式,在左右布局与上下布局之间切换,用以展示更多内容或提高用户体验。图文组合与自适应导航均属于挪移布局的一种,单页面分上下两部分,上图下文。图片区固定,文字区可滑动。并且根据不同的设备宽度调整左图右文的比例显示。包括:直板机、PAD、PC、TV、座舱、折叠屏(阔折叠、双折叠、三折叠)。

说明

图1 基准直板机、双折叠外屏、三折叠F态,横屏、竖屏布局如下(图文高度比 6:4,默认系统安全区不考虑挖孔避让)

图2 在阔折叠的内屏、外屏以如下方式显示(内屏与直板机相同处理)

图3 在双折叠展开态、三折叠M态、Pad mini,横屏、竖屏以如下方式显示(横竖屏:6:4)

图4 平板和三折叠G态的横屏、竖屏以如下方式显示(横屏1:1,竖屏:6:4)

图 5 pc端如下方式显示

图 6 座舱、tv如下方式显示

1.2 常见问题

图 7 三屏态下首页、详情页显示大图、留白

1.3 多设备适配

1.3.1 图片与文字段落区域尺寸多设备自适应适配

图片、文字区域,支持依据设备窗口宽度调整最佳展示比例。

1.3.2 图文组合适配窗口变化

1、图文组合响应横竖屏切换引起的窗口变化,文字区支持滚动条形式展示避免遮挡、截断

2、图文组合响应分屏引起的窗口变化,基于握持方向窗口宽度判断展示形态

3、图文组合响应悬浮窗引起的窗口变化,基于握持方向窗口宽度判断展示形态,避让状态栏

二、开发指导

2.1 H5开发

2.1.1 关键能力

图文混排关键能力是识别不同设备,调整不同比列,这部分功能主要通过以下能力进行实现,包含以下几个核心api。

通过Web组件的src属性引入H5页面,并使用**registerJavaScriptProxy()**原生侧方法,将JavaScript对象注入到window对象中,从而在window对象中调用该对象的方法,实现H5页面调用原生方法。

Web({ src: 'http://localSampleWSC0170/MainPage', controller: this.webController })
  .onControllerAttached(() => {
    this.webController.registerJavaScriptProxy(this, 'webClass', ['pushToPage', 'clearPage', 'getLastPage']);
    this.webController.refresh();
  })

breakpointsStore:断点工具类,根据breakpointStore.curBreakpoint获取屏幕当前端点值,根据端点值判断图文混排比例分配。

const layout = computed(() => {
  const breakpoint = breakpointStore.curBreakpoint
  if (breakpoint === 'xs' || breakpoint === 'sm') {
    return 'vertical'
  } else {
    return 'horizontal'
  }
})

2.1.2 指导案例

以图文混排为例,在vue开发框架下给出具体的开发指导。

1、由于图文混排是根据断点进行比例适配,我们需要用到web_adaptive_layout_vue3里面封装的组件MultiDiversionVue, DiversionItemVue,根据断点值选择对应的界面显示,达到比例显示。

<template>
  <div class="page-wrapper">
    <MultiDiversionVue
      :direction="direction"
      :splitLine="splitLine">
  
      <DiversionItemVue
        name="image-section"
        :diversion-cols="imageCols">
        <div :class="imageInnerClass">
            <img class="image-content" src="./picture.png" alt="示例图片">
        </div>
      </DiversionItemVue>
  
      <DiversionItemVue
        name="text-section"
        :diversion-cols="textCols">
        <!-- Use different class names for portrait and landscape -->
        <div v-if="isVertical" class="text-area-vertical">
          <h2 class="text-title">{{ title }}</h2>
          <p class="text-content">{{ description }}</p>
        </div>
        <div v-else class="text-area-horizontal">
          <h2 class="text-title">{{ title }}</h2>
          <p class="text-content">{{ description }}</p>
        </div>
      </DiversionItemVue>
    
    </MultiDiversionVue>
  </div>
</template>

2、设置布局样式

根据断点判断布局样式,在xs、sm时布局为上下结构,大屏时为左右结构,代码如下。

// Direction config: set by breakpoint
const direction = computed(() => {
  return {
    xs: 'vertical',
    sm: 'vertical',
    md: 'horizontal',
    lg: 'horizontal',
    xl: 'horizontal'
  }
})

根据断点设置图文所占屏幕比例。

// Image column config - controls width ratio
const imageCols = computed(() => {
  return {
    xs: 12,
    sm: 12,
    md: 7,
    lg: 6,
    xl: 6

更多关于HarmonyOS 鸿蒙Next中图文混排的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS Next中,图文混排主要通过ArkUI的Text组件结合Span组件实现。开发者可以使用Span的decoration属性设置文本样式,并通过ImageSpan嵌入图片。布局时,图片与文本可灵活组合,支持设置图片大小、对齐方式及间距。此外,利用富文本能力,可在同一文本区域内混合不同样式的文字与图像,确保界面元素协调统一。

更多关于HarmonyOS 鸿蒙Next中图文混排的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中实现图文混排,核心在于利用ArkUI的声明式UI能力和响应式布局系统,实现跨设备自适应。根据你的场景描述,以下是关键实现方案:

1. 布局选择与自适应策略

  • 核心组件:使用FlexRowColumnGridRow/GridColRelativeContainer进行图文组合布局。
  • 断点系统:通过@ohos.mediaquerybreakpointsStore(Web场景)监听设备断点(xs, sm, md, lg, xl),动态调整布局方向(垂直/水平)和比例。
  • 比例控制:根据断点设置图片与文字区域的宽度比例(如6:4、1:1),示例中通过imageColstextCols映射不同断点下的栅格占比实现。

2. 多设备适配关键点

  • 折叠屏适配:利用display.getDefaultDisplay()获取屏幕信息,结合window.getLastWindow()监听窗口变化,在折叠状态切换时调整布局。
  • 横竖屏响应:通过mediaquerywindow.on('windowSizeChange')监听屏幕方向变化,切换图文排列方式。
  • 避让处理:使用safeArea组件或window.getWindowAvoidArea()获取安全区域,避免刘海屏、状态栏遮挡。

3. 图文混排具体实现

  • ArkTS/ArkUI方案
    // 使用Grid布局示例
    GridRow() {
      GridCol({ span: { xs: 12, sm: 12, md: 6, lg: 6 } }) {
        Image($r('app.media.image'))
          .aspectRatio(1.5) // 控制图片比例
          .objectFit(ImageFit.Contain)
      }
      GridCol({ span: { xs: 12, sm: 12, md: 6, lg: 6 } }) {
        Text('图文混排内容')
          .fontSize(16)
          .padding(10)
      }
    }
    .onBreakpointChange((breakpoint) => {
      // 根据断点调整布局参数
    })
    
  • 文字环绕效果:可通过RelativeContainer绝对定位或Shape组件实现自定义环绕。

4. 性能与体验优化

  • 图片自适应:使用Image组件的objectFit属性(如Contain、Cover)确保图片在不同比例下正常显示。
  • 文字区域滚动:长文本可嵌套ScrollList组件,避免内容截断。
  • 资源按需加载:结合LazyForEachGridItem实现大量图文列表的懒加载。

5. Web/H5场景补充

  • 如示例所述,通过Web组件加载H5页面时,利用registerJavaScriptProxy()实现原生与Web的通信,传递断点信息。
  • 在Vue3等框架中,使用MultiDiversionVue等自适应组件,根据断点动态切换CSS样式。

总结:HarmonyOS Next的图文混排应以响应式栅格系统为基础,结合断点查询与窗口监听,实现从手机到平板、折叠屏、PC的多设备流畅适配。重点在于布局结构的动态切换与比例调整,而非固定尺寸控制。

回到顶部