如何自定义模拟Tabs组件

自定义模拟Tabs组件

HarmonyOS
2024-05-26 16:06:00
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
wngsheng

有些场景需要Tabs页签在页面左侧,从左到右排列,不需要现在系统Tabs组件的平分Tabs区域,该自定义Tabs组件页签区域完全由自己实现,只是和TabContent的滑动事件进行绑定,可以满足上述要求。

需求图片:

核心代码

// xxx.ets 
import display from '@ohos.display'; 
@Entry 
@Component 
struct TabsExample { 
  @State currentIndex: number = 0 
  @State offsetX: number = 0; 
  startOffsetX: number = 0; 
  itemWidth: number = 0; 
  tabHeads: string[] = ['green', 'blue', 'yellow', 'pink']; 
  tabContents: string[] = ['#00CB87', '#007DEF', '#FFBF00', '#E67C92']; 
  
  aboutToAppear() { 
    //计算屏幕宽度 
    let displayClass = display.getDefaultDisplaySync(); 
    if (displayClass) { 
      this.itemWidth = displayClass.width / displayClass.densityPixels; 
    } 
  } 
  
  build() { 
    Column() { 
  
      Column() { 
        Text('自定义模拟Tabs组件') 
          .fontSize(36) 
          .fontColor(Color.Brown) 
          .padding({top: 20}) 
  
        //tabs页签 
        Row() { 
          ForEach(this.tabHeads, (item, index) => { 
            Button(item) 
              .onClick(() => { 
                this.currentIndex = index; 
                this.offsetX = index * (-this.itemWidth); 
                this.startOffsetX = this.offsetX; 
              }) 
              .backgroundColor(this.currentIndex == index ? '#ffcdb499' : '#ffcfc5c5') 
          }) 
        } 
        .padding({top: 40}) 
        .width('96%') 
        .align(Alignment.Start) 
      } 
      .height('20%') 
  
      //标签页内容 
      Row() { 
        ForEach(this.tabContents, (item, index) => { 
          CustomTabContent({bcgColor: item, index: index}) 
            .gesture( 
              PanGesture() 
                .onActionUpdate((event) => { 
                  this.offsetX = this.startOffsetX + event.offsetX; 
                }) 
                .onActionEnd(() => { 
                  let tempIndex = -(Math.round(this.offsetX / this.itemWidth)); 
                  if (tempIndex >= 0 && tempIndex < this.tabHeads.length) { 
                    this.offsetX = Math.round(this.offsetX / this.itemWidth) * this.itemWidth; 
                    this.startOffsetX = this.offsetX; 
                    this.currentIndex = -Math.round(this.offsetX / this.itemWidth) 
                  } else { 
                    this.offsetX = this.startOffsetX; 
                  } 
                }) 
            ) 
        }) 
      } 
      .height('80%') 
      .translate({ 
        x: this.offsetX 
      }) 
      .backgroundColor(Color.Brown) 
      .animation({ 
        duration: 700 
      }) 
    }.width('100%') 
  } 
} 
  
@Component 
struct CustomTabContent { 
  @Prop bcgColor: string; 
  @Prop index: number; 
  build() { 
    Column() { 
      // Text(this.bcgColor) 
      //   .fontSize(36) 
      Video({ 
        src: '' 
      }) 
    } 
    .backgroundColor(this.bcgColor) 
    .width('100%') 
    .height('100%') 
  } 
} 
 

截图效果

分享
微博
QQ
微信
回复
2024-05-27 21:27:41
相关问题
Tabs组件自定义导航栏UI问题
430浏览 • 1回复 待解决
ArkTs如何自定义容器组件
1533浏览 • 1回复 待解决
如何自定义组件原型菜单
397浏览 • 1回复 待解决
自定义组件如何导出、引入?
819浏览 • 1回复 待解决
自定义组件嵌套子组件
7837浏览 • 3回复 待解决
如何设置自定义组件height缺省
491浏览 • 1回复 待解决
自定义组件如何添加图片?
1102浏览 • 1回复 待解决
js 自定义组件如何传递方法?
4524浏览 • 2回复 待解决
如何自定义Video组件控制栏样式
799浏览 • 1回复 待解决
自定义弹窗自定义转场动画
382浏览 • 1回复 待解决
鸿蒙组件toast自定义样式
7154浏览 • 1回复 待解决
JAVA卡片怎么用自定义组件
4775浏览 • 1回复 待解决
自定义组件是否支持renderFit属性
534浏览 • 1回复 待解决
自定义组件什么时候销毁
590浏览 • 1回复 待解决
Grid组件的scrollBar是否支持自定义
800浏览 • 1回复 待解决
自定义组件如何增加自己的对外方法
591浏览 • 1回复 待解决
如何访问自定义文件?
317浏览 • 1回复 待解决
如何自定义Component 属性
13357浏览 • 3回复 待解决
提问
该提问已有0人参与 ,帮助了0人