HarmonyOS 鸿蒙Next Swiper有办法分滑动方向分开控制EdgeEffect吗?

发布于 1周前 作者 yibo5220 来自 鸿蒙OS

HarmonyOS 鸿蒙Next Swiper有办法分滑动方向分开控制EdgeEffect吗?

在swiper中,希望滑动到最顶上元素时,顶上往下拉时没有边缘效果;滑动到最下面元素时,往上拉有边缘效果。
要怎么实现呢?

2 回复

可根据index的坐标确认effectMode属性的类型,可参考以下demo


// xxx.ets

class MyDataSource0725 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](/user/Entry)

[@Component](/user/Component)

struct SwiperExample0725 {

  private swiperController: SwiperController = new SwiperController()

  private data: MyDataSource0725 = new MyDataSource0725([])

  [@State](/user/State) controlNumber: number = 0;

  [@State](/user/State) needEffect: boolean = true;

  [@State](/user/State) curIndex: number = 0;

  aboutToAppear(): void {

    let list: number[] = []

    for (let i = 1; i <= 4; i++) {

      list.push(i);

    }

    this.data = new MyDataSource0725(list)

  }

  build() {

    Column({ space: 5 }) {

      Swiper(this.swiperController) {

        LazyForEach(this.data, (item: string) => {

          Text(item.toString())

            .width('90%')

            .height(160)

            .backgroundColor(0xAFEEEE)

            .textAlign(TextAlign.Center)

            .fontSize(30)

        }, (item: string) => item)

      }

      .vertical(true)

      .effectMode(this.curIndex === 0 ? EdgeEffect.None : EdgeEffect.Spring )

      .cachedCount(2)

      .index($$this.curIndex)

      .autoPlay(false)

      .loop(false)

      .indicatorInteractive(true)

      .itemSpace(0)

      .indicator( // 设置圆点导航点样式

        new DotIndicator()

          .itemWidth(15)

          .itemHeight(15)

          .selectedItemWidth(15)

          .selectedItemHeight(15)

          .color(Color.Gray)

          .selectedColor(Color.Blue))

      .curve(Curve.Linear)

      .onChange((index: number) => {

        console.info(index.toString())

      })

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

    .margin({ top: 5 })

  }

}

通过手势拦截增强能力实现onGestureRecognizerJudgeBegin,参考demo:


// xxx.ets

class MyDataSource0725 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](/user/Entry)

[@Component](/user/Component)

struct SwiperExample0725 {

  private swiperController: SwiperController = new SwiperController()

  private data: MyDataSource0725 = new MyDataSource0725([])

  [@State](/user/State) controlNumber: number = 0;

  [@State](/user/State) needEffect: boolean = true;

  [@State](/user/State) curIndex: number = 0;

  aboutToAppear(): void {

    let list: number[] = []

    for (let i = 1; i <= 1; i++) {

      list.push(i);

    }

    this.data = new MyDataSource0725(list)

  }

  build() {

    Column({ space: 5 }) {

      Swiper(this.swiperController) {

        LazyForEach(this.data, (item: string) => {

          Text(item.toString())

            .width('90%')

            .height(160)

            .backgroundColor(0xAFEEEE)

            .textAlign(TextAlign.Center)

            .fontSize(30)

        }, (item: string) => item)

      }

      .vertical(true)

      .effectMode(EdgeEffect.Spring)

      .cachedCount(2)

      .index($$this.curIndex)

      .autoPlay(false)

      .loop(false)

      .indicatorInteractive(true)

      .itemSpace(0)

      .indicator( // 设置圆点导航点样式

        new DotIndicator()

          .itemWidth(15)

          .itemHeight(15)

          .selectedItemWidth(15)

          .selectedItemHeight(15)

          .color(Color.Gray)

          .selectedColor(Color.Blue))

      .curve(Curve.Linear)

      .onChange((index: number) => {

        console.info(index.toString())

      })

      .onGestureRecognizerJudgeBegin((event: BaseGestureEvent, current: GestureRecognizer, )=>{

        if (current.isBuiltIn() && current.getType() == GestureControl.GestureType.PAN_GESTURE) {

          let panEvent = event as PanGestureEvent;

          if (this.curIndex === 0 && panEvent.velocityY > 0) {

            return GestureJudgeResult.REJECT;

          }

        }

        return GestureJudgeResult.CONTINUE;

      })

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

    .margin({ top: 5 })

  }

}

更多关于HarmonyOS 鸿蒙Next Swiper有办法分滑动方向分开控制EdgeEffect吗?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙系统中,针对Next Swiper组件实现分滑动方向控制EdgeEffect,可以通过自定义Swiper的行为来实现。具体来说,你可以通过监听滑动事件(如onTouchEvent或onFling),判断滑动的方向(左滑、右滑、上滑、下滑),然后根据滑动方向分别设置EdgeEffect。

鸿蒙系统提供了EdgeEffect类用于处理边缘发光效果,你可以通过控制EdgeEffect的实例和参数,来分别处理不同滑动方向上的边缘效果。例如,在检测到左滑时,启动左侧EdgeEffect;在检测到右滑时,启动右侧EdgeEffect。

实现这一功能需要深入了解Swiper组件的事件处理机制,以及EdgeEffect的使用。你可能需要重写Swiper的部分方法,或者在Swiper的外部添加逻辑来监听滑动事件并控制EdgeEffect。

由于鸿蒙系统的API和组件可能随着版本更新而变化,具体实现细节可能需要参考最新的鸿蒙开发文档和API说明。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部