HarmonyOS 鸿蒙Next Tabs组件滑动页面切换时如何阻止左滑效果

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

HarmonyOS 鸿蒙Next Tabs组件滑动页面切换时如何阻止左滑效果 如图一,标签显示[首页]时, 继续左滑还有效果,这个该如何取消? 或者是否有其他组件可以代替它?

图二: 标签显示[发现]时, 继续右滑也有效果!

14 回复

给Tabs设置onContentWillChange就可以了,api12亲测有效

更多关于HarmonyOS 鸿蒙Next Tabs组件滑动页面切换时如何阻止左滑效果的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这个可以哦!感谢!之前API10的时候用手势拦截的!哈哈哈,

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:BV1S4411E7LY/?p=17

compatibleSdkVersion: “5.0.0(12)” 使用这个方法怎么没效果,

这个方法不好使啦!可以使用 .edgeEffect(EdgeEffect.None)

另外去掉滑动切换的效果可以使用下面的属性并设置为0

scss
.animationDuration(0) //animationDuration为0关闭动画

最开始的解决办法,是设置tabs中第一个和最后一个,只允许右滑和左滑

@Entry
@Component
export default struct TabsModel {
  @State @Watch('onBasketUpdated') currentIndex: number = 0
  controller: TabsController = new TabsController()

  onBasketUpdated() {
    // TODO 通过@watch监听,这个值改变后,通过tabs的控制器中changeIndex方法,切换到制定页面
    this.controller.changeIndex(this.currentIndex)
  }

  build() {
    Column() {
      Tabs({ controller: this.controller }) {
        TabContent() {
        }
        .backgroundColor('#77FF')
        .tabBar(this.TabBuilder(0, '综合'))
        .gesture(PanGesture(new PanGestureOptions({ direction: PanDirection.Right })))

        TabContent() {
        }.tabBar(this.TabBuilder(1, '用户'))

        TabContent() {
        }.tabBar(this.TabBuilder(2, '讲股堂'))

        TabContent() {
        }.tabBar(this.TabBuilder(3, '资讯'))

        TabContent() {
        }.tabBar(this.TabBuilder(4, '社区'))

        TabContent() {
        }
        .backgroundColor('#FF77')
        .tabBar(this.TabBuilder(5, '话题'))
        .gesture(PanGesture(new PanGestureOptions({ direction: PanDirection.Left })))
      }
      .onChange((index: number) => {
        this.currentIndex = index // 把当前页签的数值传给currentIndex,来修改选定的页签的样式
      })
      .barMode(BarMode.Scrollable)
    }
  }

  @Builder
  TabBuilder(index: number, name: string) {
    Column() {
      Text(name)
        .width(60)
        .textAlign(TextAlign.Center)
        .fontSize(this.currentIndex === index ? 18 : 14)
        .fontWeight(this.currentIndex === index ? 700 : 400)

      if (this.currentIndex === index) {
        Divider().width(20).color('#ff5500').strokeWidth(2).margin({ top: 3 })
      } else {

      }
    }
  }
}

群里老哥,给的办法,确实没有滑动留白了,但是基本的滑动效果都没有了,滑的很突然

.onTouch(e => {
  switch (e.type) {
    case TouchType.Down:
      this.startP = e.touches[0].x
      break;

    case TouchType.Up:
      this.endP = e.touches[0].x
      if (this.startP < this.endP) {
        if (this.currentIndex > 0) {
          this.currentIndex--;
        }
      } else if (this.startP > this.endP) {
        if (this.currentIndex < 2) {
          this.currentIndex++
        }
      }
      break;

    case TouchType.Move:
      break;
  }
})

.scrollable( boolean ) 这个方法可以控制是否能左右滑动

可以在 touch 事件的 move 中判断当前 Tab 的 index 是最大或者最小。如果在 move 中有滑动超出边界的趋势,可以将 .scrollable( false ) 阻止滑动。

以上我没有实践,仅仅是思路···🤪

这个思路俺们也想到了,实践后,发现个问题!

①在把scrollable设置为false后,左右滑动就失效了,有办法让其生效,但是就会有各种问题: 举例一个具体的场景:刚进入tabs页,把index等于0的scrollable设置为false 记录手指按下和抬起的距离,取移动距离绝对值大于100并且index等于0,并且按下的x轴距离要大于抬起x轴的距离(只允许右滑不允许左滑),让scrollable等于true,然后让index++

②问题:index++,只能完成跳转,没有右滑的动效里, 移动距离绝对值是100,这个值不能这么设置吧,对右滑性能也有影响,

我设想的是xindex=0的时候不用吧scrollable设置为false这时候还是可以滑动的,而是在move的过程中·判断滑动的趋势在考虑是否要吧scrollable设置为false/true,

navigation组件好些不能左右切换!而且布局太乱了,真看不懂! cke_159.png

在HarmonyOS鸿蒙系统中,如果你想要阻止Next Tabs组件的左滑效果,可以通过以下方式实现:

Next Tabs组件的滑动行为通常是由其内部的滚动视图(ScrollView或类似组件)控制的。为了阻止左滑,你可以尝试以下几种方法:

  1. 设置滚动方向:检查Next Tabs组件或其父容器的滚动视图设置,看是否有属性可以控制滚动方向。如果可以将滚动方向限制为仅向右,那么左滑效果就会被自然阻止。

  2. 拦截触摸事件:如果直接设置滚动方向不可行,你可以尝试在Next Tabs组件上自定义一个触摸事件监听器,通过重写onTouchEvent方法来拦截并处理左滑手势,阻止其传递给内部的滚动视图。

  3. 使用自定义逻辑:在Next Tabs组件的切换逻辑中,添加判断条件,当检测到左滑手势时,不执行页面切换操作,从而间接实现阻止左滑的效果。

请注意,由于鸿蒙系统的UI组件库和API可能随着版本更新而发生变化,上述方法的具体实现可能会因系统版本和组件库的不同而有所差异。

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

回到顶部