使用swiper组件实现viewPager效果

使用swiper组件实现viewPager效果,实现用户左右滑动自动切换当前页面下标,同时点击页签切换到对应的页面。

HarmonyOS
2024-05-23 23:41:20
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
kaixinsanmao

使用的核心API

Swiper

半模态转场

核心代码解释

在使用ViewPager时,可以将其添加到布局中,并使用setAdapter()方法来设置视图页面的数据。可以使用Adapter类来实现这个适配器,并在其中定义要显示的视图。HarmonyOS中可以使用Swiper组件来达到类似的效果,Swiper组件中有index属性可以标识当前显示元素的索引(下标)并且支持双向绑定。

详情代码如下:

class MyDataSource implements IDataSource { 
  private list: number[] = [] 
  
  constructor(list: number[]) { 
    this.list = list 
  } 
  
  totalCount(): number { 
    return this.list.length 
  } 
  
  getData(index: number): number { 
    return this.list[index] 
  } 
  
  registerDataChangeListener(listener: DataChangeListener): void { 
  } 
  
  unregisterDataChangeListener() { 
  } 
} 
  
@Entry 
@Component 
struct SwiperExample { 
  private swiperController: SwiperController = new SwiperController() 
  private data: MyDataSource = new MyDataSource([]) 
  @State currentIndex: number = 1 
  @State showSheet: boolean = false 
  @State sheetHeight: number = 300; 
  @State showDragBar: boolean = true; 
  
  aboutToAppear(): void { 
    let list: number[] = [] 
    for (let i = 1; i <= 1000; i++) { 
      list.push(i); 
    } 
    this.data = new MyDataSource(list) 
  } 
  
  @Builder 
  pager() { 
    Grid() { 
      LazyForEach(this.data, (item: number) => { 
        GridItem() { 
          Text(item.toString()) 
            .width(30) 
            .height(30) 
            .border({ width: 1, color: (this.currentIndex + 1) === item ? Color.Red : Color.Gray, radius: 15 }) 
            .textAlign(TextAlign.Center) 
            .onClick(() => { 
              this.currentIndex = item - 1 
            }) 
  
        } 
      }, (item: string) => item) 
    }.columnsTemplate("1fr 1fr 1fr 1fr").rowsGap(8) 
    .width("100%") 
    .height("100%") 
  } 
  
  build() { 
    Column() { 
      Swiper(this.swiperController) { 
        LazyForEach(this.data, (item: string) => { 
          Text(item.toString()) 
            .width('100%') 
            .height("100%") 
            .backgroundColor(0xAFEEEE) 
            .textAlign(TextAlign.Center) 
            .fontSize(30) 
        }, (item: string) => item) 
      } 
      .layoutWeight(1) 
      .cachedCount(2) 
      .index($$this.currentIndex) 
      .indicator(false) 
      .loop(true) 
      .duration(300) 
      .curve(Curve.Linear) 
  
      Row({ space: 12 }) { 
        Text(`当前在第${this.currentIndex + 1}页,总计${this.data.totalCount()}`) 
      }.margin(5) 
      .onClick(() => { 
        this.showSheet = true 
      }) 
      .bindSheet($$this.showSheet, this.pager(), { 
        height: this.sheetHeight, 
        dragBar: this.showDragBar, 
        onAppear: () => { 
          console.log("BindSheet onAppear.") 
        }, 
        onDisappear: () => { 
          console.log("BindSheet onDisappear.") 
        } 
      }) 
  
    }.width('100%') 
    .margin({ top: 5 }) 
  } 
}

适配的版本信息

IDE版本:DevEco Studio 4.1.3.420

SDK版本: 4.1.6.1

分享
微博
QQ
微信
回复
2024-05-24 23:27:59
相关问题
如何使用Swiper组件实现下拉刷新
185浏览 • 1回复 待解决
Swiper是否支持组件复用
380浏览 • 1回复 待解决
如何实现组件的阴影效果
371浏览 • 1回复 待解决
滑动组件如何实现单边spring的效果
528浏览 • 1回复 待解决
List组件如何实现多列效果
735浏览 • 1回复 待解决
Swiper组件如何设置导航点位置
636浏览 • 1回复 待解决
Swiper 组件嵌套图片刷新数据会闪烁
341浏览 • 1回复 待解决
如何实现Tabs组件tarbar的吸顶效果
214浏览 • 1回复 待解决
如何设置组件透明效果
691浏览 • 1回复 待解决
组件如何设置模糊效果
706浏览 • 1回复 待解决
canvas如何实现水印效果
402浏览 • 1回复 待解决
如何实现星级评分效果
59浏览 • 1回复 待解决
图片模糊效果如何实现
346浏览 • 1回复 待解决
如何通过Progress实现loading效果
41浏览 • 1回复 待解决
如何等效实现JSONObejct效果
262浏览 • 1回复 待解决
panGesture结合动画实现fling效果
402浏览 • 1回复 待解决