HarmonyOS鸿蒙Next中GridRow这个的GridCol按照order排完之后,GridCol的位置能否调整

HarmonyOS鸿蒙Next中GridRow这个的GridCol按照order排完之后,GridCol的位置能否调整 GridRow这个的GridCol按照order排完之后,这个3的位置可以通过设置调整上去吗?

cke_1404.png


更多关于HarmonyOS鸿蒙Next中GridRow这个的GridCol按照order排完之后,GridCol的位置能否调整的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

当前栅格布局中确实没有很直接的方式来解决这个对齐的问题,这里只能自己手动适配

通过监听当前断点的类型变化,来讲对应的GridCol进行offset偏移

请参考代码:

// xxx.ets

@Entry

@Component

struct GridRowExample {

  @State currentBp: string = 'unknown'

  build() {

    Column() {

      GridRow({

        columns: 2,

        gutter: { x: 5, y: 10 },

        breakpoints: {

          value: ["400vp", "600vp", "800vp"],

          reference: BreakpointsReference.WindowSize

        },

        direction: GridRowDirection.Row

      }) {

        //1

        GridCol({

          span: {

            xs: 1,

            sm: 2

          },

          offset: 0,

          order: 1

        }) {

          Row()

            .width("100%").height("20vp")

        }

        .borderColor(Color.Red)

        .borderWidth(2)

        //2

        GridCol({

          span: {

            xs: 1,

            sm: 2

          },

          offset: 0,

          order: 2

        }) {

          Row().width("100%").height("60vp")

        }.borderColor(Color.Yellow).borderWidth(2)

        //3

        GridCol({

          span: {

            xs: 1,

            sm: 2

          },

          offset: 0,

          order: 3

        }) {

          Row().width("100%").height("20vp")

        }.borderColor(Color.Green).borderWidth(2)

        .offset({ y: this.currentBp == 'xs' ? -40 : 0 })

        //4

        GridCol({

          span: {

            xs: 1,

            sm: 2

          },

          offset: 0,

          order: 4

        }) {

          Row().width("100%").height("40vp")

        }.borderColor(Color.Blue).borderWidth(2)

      }.width("100%").height("100%")

      //.alignItems(ItemAlign.Start)

      .onBreakpointChange((breakpoint) => {

        console.log('hmLog-->', breakpoint)

        this.currentBp = breakpoint

      })

    }

    .width('80%')

    .margin({ left: 10, top: 5, bottom: 5 })

    .height(200)

    .border({ color: '#880606', width: 2 })

    .backgroundColor('#000')

  }

}

更多关于HarmonyOS鸿蒙Next中GridRow这个的GridCol按照order排完之后,GridCol的位置能否调整的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


你这种情况建议使用WaterFlow布局哦!

也就是瀑布流容器,由“行”和“列”分割的单元格所组成,通过容器自身的排列规则,将不同大小的"项目"自上而下,如瀑布般紧密布局。

简单的例子:

// Index.ets
import { WaterFlowDataSource } from './WaterFlowDataSource';
enum FooterState {
  Loading = 0,
  End = 1
}
@Entry
@Component
struct WaterFlowDemo {
  @State minSize: number = 80;
  @State maxSize: number = 180;
  @State colors: number[] = [0xFFC0CB, 0xDA70D6, 0x6B8E23, 0x6A5ACD, 0x00FFFF, 0x00FF7F];
  @State footerState: FooterState = FooterState.Loading;
  scroller: Scroller = new Scroller();
  dataSource: WaterFlowDataSource = new WaterFlowDataSource();
  private itemWidthArray: number[] = [];
  private itemHeightArray: number[] = [];
  // 计算FlowItem宽/高
  getSize() {
    let ret = Math.floor(Math.random() * this.maxSize);
    return (ret > this.minSize ? ret : this.minSize);
  }
  // 设置FlowItem的宽/高数组
  setItemSizeArray() {
    for (let i = 0; i < 100; i++) {
      this.itemWidthArray.push(this.getSize());
      this.itemHeightArray.push(this.getSize());
    }
  }
  // 组件生命周期:在组件即将出现时初始化尺寸数组
  aboutToAppear() {
    this.setItemSizeArray();
  }
  @Builder
  itemFoot() {
    // 注意:不要直接用IfElse节点作为footer的根节点
    // 必须在外面使用(Column/Row/Stack等)容器包裹,确保布局正确
    Column() {
      if (this.footerState == FooterState.Loading) {
        Text(`加载中...`)
          .fontSize(10)
          .backgroundColor(Color.Red)
          .width(50)
          .height(50)
          .align(Alignment.Center)
          .margin({ top: 2 })
      } else if (this.footerState == FooterState.End) {
        Text(`到底啦...`)
          .fontSize(10)
          .backgroundColor(Color.Red)
          .width(50)
          .height(50)
          .align(Alignment.Center)
          .margin({ top: 2 })
      } else {
        Text(`Footer`)
          .fontSize(10)
          .backgroundColor(Color.Red)
          .width(50)
          .height(50)
          .align(Alignment.Center)
          .margin({ top: 2 })
      }
    }
  }
  build() {
    Column({ space: 2 }) {
      WaterFlow({ footer: this.itemFoot() }) {
        LazyForEach(this.dataSource, (item: number) => {
          FlowItem() {
            Column() {
              Text("N" + item).fontSize(12).height('16')
              // 注意:需要确保对应的jpg文件存在才会正常显示
              Image('res/waterFlowTest(' + item % 5 + ').jpg')
                .objectFit(ImageFit.Fill)
                .width('100%')
                .layoutWeight(1)
            }
          }
          .width('100%')
          .height(this.itemHeightArray[item % 100])
          .backgroundColor(this.colors[item % this.colors.length])
        }, (item: string) => item)
      }
      .columnsTemplate("1fr 1fr")    // 设置2列等宽布局
      .columnsGap(10)
      .rowsGap(5)
      .backgroundColor(0xFAEEE0)
      .width('100%')
      .height('100%')
      // 触底加载数据:滚动到底部时触发分页加载
      .onReachEnd(() => {
        console.info("onReachEnd")
        // 模拟分页加载:当数据超过200条时停止加载
        if (this.dataSource.totalCount() > 200) {
          this.footerState = FooterState.End;
          return;
        }
        setTimeout(() => {
          for (let i = 0; i < 100; i++) {
            this.dataSource.addLastItem();
          }
        }, 1000)
      })
      .onReachStart(() => {
        // 滚动到顶部时触发
        console.info('waterFlow reach start');
      })
      .onScrollStart(() => {
        // 开始滚动时触发
        console.info('waterFlow scroll start');
      })
      .onScrollStop(() => {
        // 停止滚动时触发
        console.info('waterFlow scroll stop');
      })
      .onScrollFrameBegin((offset: number, state: ScrollState) => {
        // 滚动帧开始时触发:可以控制滚动行为
        // offset:滚动偏移量,state:滚动状态
        console.info('waterFlow scrollFrameBegin offset: ' + offset + ' state: ' + state.toString());
        return { offsetRemain: offset };  // 返回开发者期望的实际滚动偏移量
      })
    }
  }
}

图片

建议改为WaterFlow呢

加油,

在HarmonyOS鸿蒙Next中,GridCol组件通过order属性排序后,其位置无法直接调整。order属性决定了GridCol在GridRow布局中的排列顺序,系统会严格按照order值进行自动布局。如需改变位置,需修改order属性值或调整GridCol在代码中的声明顺序。

在HarmonyOS Next的GridRow布局中,GridCol组件通过order属性排序后,其位置是严格按照数值顺序排列的,无法通过其他属性直接调整顺序。order值越小,元素越靠前排列,这是Flex布局规范的标准行为。

从您提供的图片来看,若希望调整某个GridCol的位置(例如将3调整到上方),只能通过修改其order值实现。例如:

  • 将目标GridCol的order设置为比当前更小的值
  • 或调整其他GridCol的order值来间接改变顺序

需要注意:

  1. 所有未设置order的GridCol默认值为0
  2. 相同order值按代码书写顺序排列
  3. 修改后会自动触发布局重排

建议通过统一规划所有GridCol的order值来实现精确的排序需求。

回到顶部