HarmonyOS鸿蒙Next中Scroll Image顶部会有留白

HarmonyOS鸿蒙Next中Scroll Image顶部会有留白 图片

已经添加了规避安全区域的代码了

图片


更多关于HarmonyOS鸿蒙Next中Scroll Image顶部会有留白的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

您好,滚动类容器内的组件不建议设置expandSafeArea属性,如果设置,需要按照组件嵌套关系,将当前节点到滚动类祖先容器间所有直接节点设置expandSafeArea属性

可参考

通过在滚动类容器内调用expandSafeArea属性实现沉浸式效果,Scroll内的子组件可以延伸到状态栏上

@Entry
@Component
struct Index {
  @State arr: string[] = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13'];
  build() {
    RelativeContainer() {
      Scroll() {
        Column() {
          Image($r('app.media.startIcon'))
            .width('100%')
            .objectFit(ImageFit.Cover)
            .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])
          ForEach(this.arr, (item: string) => {
            Column() {
              Text('数据' + item)
                .textAlign(TextAlign.Start)
                .fontSize(18)
            }
            .width('95%')
            .height(72)
            .backgroundColor(Color.White)
            .borderRadius(12)
            .justifyContent(FlexAlign.Center)
            .margin({
              top: 6,
              bottom: 6
            })
          })
        }
      }
      .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])
      .scrollBar(BarState.Off)
      .height('100%')
      .align(Alignment.Top)
      .backgroundColor(Color.Gray)
    }
    .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])
    .width('100%')
    .height('100%')
  }
}

更多关于HarmonyOS鸿蒙Next中Scroll Image顶部会有留白的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


因为Scroll的.align(Alignment.Center)默认居中,所以指定align的对齐方式

Scroll() {
    //...
}
.align(Alignment.TOP)
//...

Alignment枚举值:

Alignment.Top
Alignment.TopEnd
Alignment.Start
Alignment.Center
Alignment.End
Alignment.BottomStart
Alignment.Bottom
Alignment.BottomEnd

加上你提供的方法图片还是无法沉浸到状态栏下面

RelativeContainer() {
  Scroll() {
    Image(this.bean.det_url)
      .width(Const.ONE_HUNDRED_PERCENT)
      .objectFit(ImageFit.Cover)
      .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP])
  }
  .align(Alignment.Top)
  .scrollable(ScrollDirection.Vertical)
  .scrollBar(BarState.Off)
  .width(Const.ONE_HUNDRED_PERCENT)
  .height(Const.ONE_HUNDRED_PERCENT)

  TitleBar({ model: this.tabModel })
}
.width(Const.ONE_HUNDRED_PERCENT)
.height(Const.ONE_HUNDRED_PERCENT)
.expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])
import { HMRouter, HMRouterMgr } from '@hadss/hmrouter';
import { TeenagerBean } from '../../../../bean/TeenagerBean';
import { Const } from '../../../../const/Const';
import { Pages } from '../../../../const/Pages';

@HMRouter({ pageUrl: Pages.PAGE_TEENAGER_CHILD })
@Component
export struct TeenagerChildPage {
  private bean: TeenagerBean = (HMRouterMgr.getCurrentParam() as object)['bean']

  build() {
    RelativeContainer() {
      Scroll() {
        Image(this.bean.det_url)
          .width(Const.ONE_HUNDRED_PERCENT)
          .objectFit(ImageFit.Cover)
          .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP])
      }
      .scrollable(ScrollDirection.Vertical)
      .scrollBar(BarState.Off)
      .width(Const.ONE_HUNDRED_PERCENT)
      .height(Const.ONE_HUNDRED_PERCENT)
    }
    .width(Const.ONE_HUNDRED_PERCENT)
    .height(Const.ONE_HUNDRED_PERCENT)
    .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])
  }

  onBackPress(): boolean | void {
    HMRouterMgr.pop()
    return true
  }
}

在HarmonyOS Next中,Scroll Image组件顶部出现留白通常与布局设置有关。可能的原因包括:组件的margin或padding属性设置不当,或者父容器的布局约束导致。检查Scroll组件的布局参数,确认是否设置了不必要的顶部边距。此外,确保Image组件的尺寸和缩放模式(如objectFit属性)与Scroll容器匹配,避免因尺寸不匹配而产生空白区域。

从截图来看,顶部留白问题通常与安全区域(SafeArea)和滚动容器(Scroll)的嵌套或属性设置有关。虽然您已添加规避安全区域的代码,但问题可能出在具体实现方式或组件层级上。

可能的原因及解决方案:

  1. 检查 Scroll 组件的 edgeEffect 属性: 如果 edgeEffect 设置为 EdgeEffect.NoneEdgeEffect.Fade,在某些情况下可能导致顶部出现非预期的留白。可以尝试将其设置为 EdgeEffect.Spring 或移除该属性以使用默认值。

  2. 确认安全区域规避是否正确应用: 确保规避代码(如 safeArea 修饰器或 SafeArea 组件)应用在正确的层级。它应该直接作用于需要避开刘海屏、状态栏等区域的组件。如果 Scroll 内部内容需要顶到屏幕边缘,但 Scroll 本身被安全区域约束,则会出现留白。请检查布局结构,可能需要将安全区域设置调整到 Scroll 的父容器或 Scroll 本身。

  3. 检查 Scrollcontent 内边距: 查看是否在 Scrollcontent 部分(例如其内部的 ColumnFlex)设置了 paddingmargin,特别是顶部内边距,这可能导致内容下方出现空白。

  4. 使用 align 属性控制对齐: 在 Scroll 的内容容器中,尝试设置 align 属性为 Alignment.TopStart,确保内容从顶部开始排列。

建议的代码调整方向: 可以尝试将安全区域设置移至 Scroll 组件外部,确保 Scroll 能够占据整个可用空间。例如,使用 SafeArea 包裹 Scroll,并设置 Scrollwidthheight'100%'

如果问题仍存在,请检查是否有全局样式或主题中的默认边距影响了布局。

回到顶部