HarmonyOS ArkUI-C中Swiper如何实现SwiperDisplayMode.AUTO_LINEAR的显示效果

如图片显示,app首页icon区使用了ArkTS的Swiper组件,为对齐其他系统的显示效果(首页完整显示第一页icon,并且漏出第二页icon的部分内容以提示用户还有更多可以滑动),使用了displayMode的SwiperDisplayMode.AUTO_LINEAR枚举值。

现在存在两个问题:

  1. ArkUI-C中没有对应的设置接口,无法实现对应的显示效果;

  2. ArkTS中该属性枚举值被标记为废弃,提示使用Scroller的scrollTo能力替代。

对于问题2,现在咨询一下,有没有一种实现方式,既能有SwiperDisplayMode.AUTO_LINEAR的显示效果,又同时保持Swiper的轮播能力?以及,ArkUI-C中如何实现Swiper这样的显示效果?

HarmonyOS ArkUI-C中Swiper如何实现SwiperDisplayMode.AUTO_LINEAR的显示效果 -鸿蒙开发者社区

HarmonyOS
2025-01-09 14:16:55
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zbw_apple

示例参考如下:

class BasicDataSource implements IDataSource {
  private listeners: DataChangeListener[] = [];
  private originDataArray: string[] = [];

  public totalCount(): number {
    return 0;
  }

  public getData(index: number): string {
    return this.originDataArray[index];
  }

  registerDataChangeListener(listener: DataChangeListener): void {
    if (this.listeners.indexOf(listener) < 0) {
      console.info('add listener');
      this.listeners.push(listener);
    }
  }

  unregisterDataChangeListener(listener: DataChangeListener): void {
    const pos = this.listeners.indexOf(listener);
    if (pos >= 0) {
      console.info('remove listener');
      this.listeners.splice(pos, 1);
    }
  }

  notifyDataReload(): void {
    this.listeners.forEach(listener => {
      listener.onDataReloaded();
    })
  }

  notifyDataAdd(index: number): void {
    this.listeners.forEach(listener => {
      listener.onDataAdd(index);
    })
  }

  notifyDataChange(index: number): void {
    this.listeners.forEach(listener => {
      listener.onDataChange(index);
    })
  }

  notifyDataDelete(index: number): void {
    this.listeners.forEach(listener => {
      listener.onDataDelete(index);
    })
  }

  notifyDataMove(from: number, to: number): void {
    this.listeners.forEach(listener => {
      listener.onDataMove(from, to);
    })
  }
}

class MyDataSource extends BasicDataSource {
  private dataArray: string[] = [];

  public totalCount(): number {
    return this.dataArray.length * 3;
  }

  public getData(index: number): string {
    return this.dataArray[index % this.dataArray.length];
  }

  public addData(index: number, data: string): void {
    this.dataArray.splice(index, 0, data);
    this.notifyDataAdd(index);
  }

  public moveDataWithoutNotify(from: number, to: number): void {
    let tmp = this.dataArray.splice(from, 1);
    this.dataArray.splice(to, 0, tmp[0])
  }

  public pushData(data: string): void {
    this.dataArray.push(data);
    this.notifyDataAdd(this.dataArray.length - 1);
  }

  public deleteData(index: number): void {
    this.dataArray.splice(index, 1);
    this.notifyDataDelete(index);
  }
}

@Entry
@Component
struct Parent {
  private data: MyDataSource = new MyDataSource();
  private scroller: Scroller = new Scroller();

  build() {
    Row() {
      List({initialIndex: 10, scroller: this.scroller}) {
        LazyForEach(this.data, (item: string) => {
          ListItem() {
            Text(item.toString())
              .fontSize(16)
              .textAlign(TextAlign.Center)
              .size({height: 200, width: 200})
          }
          .borderRadius(10)
          .margin(10)
          .backgroundColor("#FFFFFFFF")
        }, (item: string) => item)
      }
      .width('100%')
      .height('300')
      .backgroundColor("#FFDCDCDC")
      .listDirection(Axis.Horizontal)
      .scrollSnapAlign(ScrollSnapAlign.START)
      .friction(2)
      .onScrollFrameBegin((offset: number, state: ScrollState)=>{
        let currOffset = this.scroller.currentOffset().xOffset;
        let newOffset = currOffset + offset;
        let totalHeight = 220 * 10;
        if (newOffset < totalHeight * 0.5) {
          newOffset += totalHeight;
        } else if (newOffset > totalHeight * 2.5) {
          newOffset -= totalHeight;
        }
        return {offsetRemain: newOffset - currOffset }
      })
    }
  }
  aboutToAppear(): void {
    for (let i = 0; i < 10; i++) {
      this.data.pushData(i.toString())
    }
  }
}
分享
微博
QQ
微信
回复
2025-01-09 17:23:23
相关问题
使用swiper组件实现viewPager效果
1852浏览 • 1回复 待解决
HarmonyOS grid组件auto-fit没效果
623浏览 • 1回复 待解决
ArkUI C 如何使用ArkUI_StyledString
473浏览 • 1回复 待解决
如何关闭Swiper组件回弹效果
984浏览 • 1回复 待解决
基于原生实现高级显示效果
977浏览 • 1回复 待解决