鸿蒙Banner图适配不同屏幕

摘要

随着终端设备形态日益多样化,分布式技术逐渐打破单一硬件边界,一个应用或服务,可以在不同的硬件设备之间随意调用、互助共享,让用户享受无缝的全场景体验。而作为应用开发者,广泛的设备类型也能为应用带来广大的潜在用户群体。但是如果一个应用需要在多个设备上提供同样的内容,则需要适配不同的屏幕尺寸和硬件,开发成本较高。HarmonyOS系统面向多终端提供了“一次开发,多端部署”的能力,让开发者可以基于一种设计,高效构建多端可运行的应用。

Banner图适配方案

我们在使用Banner图时,会发现在中大屏设备上,Banner的宽度太大,当我们将高度固定时,在大屏设备上,高度又太小,图片裁剪严重。若宽高采用比例设置,高度又太大,在不同的屏幕上要么太小或太大,显示效果都不是很理想。

Banner有一个属性displayCount,用来控制一屏显示多少个组件,我们在小屏设备上显示一张图片,在中大屏设备上一屏显示2张图片。再使用aspectRatio设置合适的宽高比,就能达到我们想要的效果了。

我们现在只需要判断设备是小屏还是中大屏就可以了,这里借助GridRow栅格组件的断点能力,针对小屏和非小屏设备,设置不同的displayCount和aspectRatio就可以了,实现小源码如下。

@ComponentV2
struct Index {
  @Local breakPoint: string = 'unknown'
  @Local images: string[] = []

  @Computed
  get isSm(): boolean {
    return this.breakPoint === 'sm'
  }

  build() {
    Column() {
          GridRow({
            columns: 1,
            breakpoints: { reference: BreakpointsReference.WindowSize }
          }) {
            GridCol() {
              Swiper() {
                Repeat(this.images).each((data: Readonly<RepeatItem<string>>) => {
                  Image(data.item)
                }).key((item) => item)
              }
              .width('100%')
              .height('100%')
              .loop(false)
              .duration(1000)
              .autoPlay(false)
              .indicatorInteractive(true)
              .itemSpace(this.isSm ? 0 : 32)
              .displayCount(this.isSm ? 1 : 2)
              .indicator(new DotIndicator().itemWidth(8)
                .itemHeight(8)
                .selectedItemWidth(12)
                .selectedItemHeight(8)
                .color($r('app.color.divider_color'))
                .selectedColor($r('app.color.brand_color')))
            }
          }.width('100%').aspectRatio(this.isSm ? 2.5 : 4.5).onBreakpointChange((point) => {
            this.breakPoint = point
          })
        }.width('100%').justifyContent(FlexAlign.Start)
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zqwang888

一毛不嫌少,一块不嫌多!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值