HarmonyOS TabContent嵌套Swiper,如何处理滑动问题
// xxx.ets
import ComponentUtils from '@ohos.arkui.UIContext';
@Component
export struct TabsExample {
@State currentIndex: number = 0
@State animationDuration: number = 300
@State indicatorLeftMargin: number = 0
@State indicatorWidth: number = 0
private tabsWidth: number = 0
private componentUtils: ComponentUtils.ComponentUtils = this.getUIContext().getComponentUtils()
@Builder
tabBuilder(index: number, name: string) {
Column() {
Text(name)
.fontSize(16)
.fontColor(this.currentIndex === index ? '#007DFF' : '#182431')
.fontWeight(this.currentIndex === index ? 500 : 400)
.id(index.toString())
.onAreaChange((oldValue: Area,newValue: Area) => {
if (this.currentIndex === index && (this.indicatorLeftMargin === 0 || this.indicatorWidth === 0)){
if (newValue.position.x != undefined) {
let positionX = Number.parseFloat(newValue.position.x.toString())
this.indicatorLeftMargin = Number.isNaN(positionX) ? 0 : positionX
}
let width = Number.parseFloat(newValue.width.toString())
this.indicatorWidth = Number.isNaN(width) ? 0 : width
}
})
}.width('100%')
}
build() {
Stack({ alignContent: Alignment.TopStart }) {
Tabs({ barPosition: BarPosition.Start }) {
TabContent() {
Swiper() {
Text('0')
.width('90%')
.height('100%')
.backgroundColor(Color.Gray)
.textAlign(TextAlign.Center)
.fontSize(30)
Text('1')
.width('90%')
.height('100%')
.backgroundColor(Color.Green)
.textAlign(TextAlign.Center)
.fontSize(30)
Text('2')
.width('90%')
.height('100%')
.backgroundColor(Color.Pink)
.textAlign(TextAlign.Center)
.fontSize(30)
}
.loop(false)
}.tabBar(this.tabBuilder(0, 'green'))
TabContent() {
Column().width('100%').height('100%').backgroundColor('#007DFF')
}.tabBar(this.tabBuilder(1, 'blue'))
}
.onAreaChange((oldValue: Area,newValue: Area)=> {
let width = Number.parseFloat(newValue.width.toString())
this.tabsWidth = Number.isNaN(width) ? 0 : width
})
.barWidth('100%')
.barHeight(56)
.width('100%')
.height(296)
.backgroundColor('#F1F3F5')
.animationDuration(this.animationDuration)
.onChange((index: number) => {
this.currentIndex = index // 监听索引index的变化,实现页签内容的切换。
})
.onAnimationStart((index: number, targetIndex: number, event: TabsAnimationEvent) => {
// 切换动画开始时触发该回调。下划线跟着页面一起滑动,同时宽度渐变。
this.currentIndex = targetIndex
let targetIndexInfo = this.getTextInfo(targetIndex)
this.startAnimateTo(this.animationDuration, targetIndexInfo.left, targetIndexInfo.width)
})
.onAnimationEnd((index: number,event: TabsAnimationEvent) => {
// 切换动画结束时触发该回调。下划线动画停止。
let currentIndicatorInfo = this.getCurrentIndicatorInfo(index,event)
this.startAnimateTo(0,currentIndicatorInfo.left,currentIndicatorInfo.width)
})
.onGestureSwipe((index: number,event: TabsAnimationEvent) => {
// 在页面跟手滑动过程中,逐帧触发该回调。
let currentIndicatorInfo = this.getCurrentIndicatorInfo(index,event)
this.currentIndex = currentIndicatorInfo.index
this.indicatorLeftMargin = currentIndicatorInfo.left
this.indicatorWidth = currentIndicatorInfo.width
})
Column()
.height(2)
.width(this.indicatorWidth)
.margin({ left: this.indicatorLeftMargin, top:48})
.backgroundColor('#007DFF')
}.width('100%')
}
private getTextInfo(index: number): Record<string, number> {
let rectangle = this.componentUtils.getRectangleById(index.toString())
return { 'left': px2vp(rectangle.windowOffset.x), 'width': px2vp(rectangle.size.width) }
}
private getCurrentIndicatorInfo(index: number, event: TabsAnimationEvent): Record<string, number> {
let nextIndex = index
if (index > 0 && event.currentOffset > 0) {
nextIndex--
} else if (index < 3 && event.currentOffset < 0) {
nextIndex++
}
let indexInfo = this.getTextInfo(index)
let nextIndexInfo = this.getTextInfo(nextIndex)
let swipeRatio = Math.abs(event.currentOffset / this.tabsWidth)
let currentIndex = swipeRatio > 0.5 ? nextIndex : index // 页面滑动超过一半,tabBar切换到下一页。
let currentLeft = indexInfo.left + (nextIndexInfo.left - indexInfo.left) * swipeRatio
let currentWidth = indexInfo.width + (nextIndexInfo.width - indexInfo.width) * swipeRatio
return { 'index': currentIndex, 'left': currentLeft, 'width': currentWidth }
}
private startAnimateTo(duration: number, leftMargin: number, width: number) {
animateTo({
duration: duration, // 动画时长
curve: Curve.Linear, // 动画曲线
iterations: 1, // 播放次数
playMode: PlayMode.Normal, // 动画模式
onFinish: () => {
console.info('play end')
}
}, () => {
this.indicatorLeftMargin = leftMargin
this.indicatorWidth = width
})
}
}
以上代码,有一个tabs,里面是2个TabContent,第一个TabContent里面有1个Swiper
第一个TabContent里面有1个Swiper,请问如何让swiper滑到最后一个卡片的时候可以丝滑的滑到第2个TabContent
HarmonyOS
赞
收藏 0
回答 1
待解决
相关问题
HarmonyOS 嵌套滑动问题
374浏览 • 1回复 待解决
TabContent内web组件滑动问题
261浏览 • 2回复 待解决
如何处理tabs嵌套web滑动场景
550浏览 • 1回复 待解决
HarmonyOS list嵌套tabs,tabs嵌套web,滑动问题
459浏览 • 1回复 待解决
HarmonyOS Tabs和Web嵌套左右滑动问题
367浏览 • 1回复 待解决
HarmonyOS 关于Tabs、TabContent组件滑动联动问题的咨询
665浏览 • 1回复 待解决
HarmonyOS 滑动问题
81浏览 • 1回复 待解决
HarmonyOS Slider滑动问题
396浏览 • 1回复 待解决
HarmonyOS scroll滑动问题
484浏览 • 1回复 待解决
HarmonyOS list滑动问题
847浏览 • 1回复 待解决
HarmonyOS onToch事件滑动问题
42浏览 • 1回复 待解决
滑动嵌套事件冲突处理
289浏览 • 0回复 待解决
Swiper滑动过程中出现卡顿,对滑动体验造成负面影响时如何处理?
960浏览 • 1回复 待解决
HarmonyOS Swiper嵌套RichEditor的问题
14浏览 • 1回复 待解决
HarmonyOS .bindSheet() 绑定控件弹窗滑动问题
59浏览 • 1回复 待解决
HarmonyOS Refresh跟list组件惯性滑动问题
132浏览 • 1回复 待解决
仿射变换后列表滑动问题
315浏览 • 1回复 待解决
Grid嵌套滚动问题有知道的吗?
2667浏览 • 1回复 待解决
webView 的左右滑动 和 pageslide冲突如何处理
5764浏览 • 1回复 待解决
HarmonyOS Swiper嵌套图片,滑动过程中圆角失效
30浏览 • 1回复 待解决
HarmonyOS webview嵌套在布局中间,高度和滚动问题
587浏览 • 1回复 待解决
如何处理json 涉及多次嵌套结构的动态数据
1759浏览 • 1回复 待解决
HarmonyOS list 嵌套web滑动切换问题
511浏览 • 1回复 待解决
HarmonyOS Refresh组件嵌套滑动冲突问题
1032浏览 • 1回复 待解决
.nestedScroll(SwiperNestedScrollMode.SELF_FIRST)