HarmonyOS 想要实现图中这样的UI

这边需要实现图中所示的卡片堆叠,并可以像swiper组件那样左右滑动丝滑切换卡片,这种在HarmonyOS原生api下如何实现?

HarmonyOS 想要实现图中这样的UI-鸿蒙开发者社区

HarmonyOS
2024-10-15 10:23:15
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
FengTianYa

可以参考以下demo,具体细节可自行进行优化:

@Entry  
@Component  
struct SwiperCustomAnimationExample {  
  private DISPLAY_COUNT: number = 1  
  private MIN_SCALE: number = 0.75  
  @State backgroundColors: Color[] = [Color.Green, Color.Blue, Color.Yellow, Color.Pink, Color.Gray, Color.Orange]  
  @State opacityList: number[] = []  
  @State scaleList: number[] = []  
  @State translateList: number[] = []  
  @State zIndexList: number[] = []  
  aboutToAppear(): void {  
    for (let i = 0; i < this.backgroundColors.length; i++) {  
      this.opacityList.push(1.0)  
      this.scaleList.push(1.0)  
      this.translateList.push(0.0)  
      this.zIndexList.push(0)  
    }  
  }  
  build() {  
    Column() {  
      Swiper() {  
        ForEach(this.backgroundColors, (backgroundColor: Color, index: number) => {  
          Text(index.toString()).width('100%').height('100%').fontSize(50).textAlign(TextAlign.Center)  
            .backgroundColor(backgroundColor)  
              // 自定义动画变化透明度、缩放页面、抵消系统默认位移、渲染层级等  
            .opacity(this.opacityList[index])  
            .scale({ x: this.scaleList[index], y: this.scaleList[index] })  
            .translate({ x: this.translateList[index] })  
            .zIndex(this.zIndexList[index])  
        })  
      }  
      .height(300)  
      .indicator(false)  
      .displayCount(this.DISPLAY_COUNT, true)  
      .nextMargin(20)  
      .customContentTransition({  
        // 页面移除视窗时超时1000ms下渲染树  
        timeout: 1000,  
        // 对视窗内所有页面逐帧回调transition,在回调中修改opacity、scale、translate、zIndex等属性值,实现自定义动画  
        transition: (proxy: SwiperContentTransitionProxy) => {  
          if (proxy.position <= proxy.index % this.DISPLAY_COUNT || proxy.position >= this.DISPLAY_COUNT + proxy.index % this.DISPLAY_COUNT) {  
            // 同组页面往左滑或往右完全滑出视窗外时,重置属性值  
            this.opacityList[proxy.index] = 1.0  
            this.scaleList[proxy.index] = 1.0  
            this.translateList[proxy.index] = 0.0  
            this.zIndexList[proxy.index] = 0  
          } else {  
            // 同组页面往右滑且未滑出视窗外时,对同组中左右两个页面,逐帧根据position修改属性值,实现两个页面往Swiper中间靠拢并透明缩放的自定义切换动画  
            if (proxy.index % this.DISPLAY_COUNT === 0) {  
              this.opacityList[proxy.index] = 1 - proxy.position / this.DISPLAY_COUNT  
              this.scaleList[proxy.index] = this.MIN_SCALE + (1 - this.MIN_SCALE) * (1 - proxy.position / this.DISPLAY_COUNT)  
              this.translateList[proxy.index] = - proxy.position * proxy.mainAxisLength + (1 - this.scaleList[proxy.index]) * proxy.mainAxisLength / 2.0  
            } else {  
              this.opacityList[proxy.index] = 1 - (proxy.position - 1) / this.DISPLAY_COUNT  
              this.scaleList[proxy.index] = this.MIN_SCALE + (1 - this.MIN_SCALE) * (1 - (proxy.position - 1) / this.DISPLAY_COUNT)  
              this.translateList[proxy.index] = - (proxy.position - 1) * proxy.mainAxisLength - (1 - this.scaleList[proxy.index]) * proxy.mainAxisLength / 2.0  
            }  
            this.zIndexList[proxy.index] = -1  
          }  
        }  
      })  
      .onContentDidScroll((selectedIndex: number, index: number, position: number, mainAxisLength: number) => {  
        // 监听Swiper页面滑动事件,在该回调中可以实现自定义导航点切换动画等  
        console.info("onContentDidScroll selectedIndex: " + selectedIndex + ", index: " + index + ", position: " + position + ", mainAxisLength: " + mainAxisLength)  
      })  
    }.width('100%')  
  }  
}
分享
微博
QQ
微信
回复
2024-10-15 16:07:14
相关问题
HarmonyOS 如何实现图中input控件效果
400浏览 • 1回复 待解决
HarmonyOS图中是否支持海量marker
309浏览 • 0回复 待解决
想要实现一个图片裁剪功能
374浏览 • 1回复 待解决
想要Harmonyos实战
9582浏览 • 3回复 待解决
HarmonyOS ArkTS扫描UI该如何实现
0浏览 • 1回复 待解决
基于UI Observer实现UI组件埋点
511浏览 • 1回复 待解决
Mysql如何用sql语句删除这样内容?
1835浏览 • 1回复 待解决
鸿蒙怎么接入realtek这样厂家wifi?
8061浏览 • 3回复 待解决
鸿蒙平台 UI审核如何实现
4994浏览 • 1回复 待解决