panGesture结合动画实现fling效果

希望自定义一个组件,通过手势可以滑动该组件,然后手指离屏之后组件带有惯性的滑动,实现fling的效果。这样可以给用户更好更真实的体验感。

HarmonyOS
2024-05-26 15:17:20
浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
小小肉蟹

使用的核心API

  • panGesture
  • animateTo

核心代码解释

通过在组件上绑定panGesture,在panGesture的回调方法onUpdateAction中添加animateTo方法,使组件的滑动出现一个动画效果,设置动画的延迟事件来达到fling的效果。

// xxx.ets 
@Entry 
@Component 
struct PanGestureExample { 
  @State offsetX: number = 0 
  @State offsetY: number = 0 
  @State positionX: number = 0 
  @State positionY: number = 0 
  private panOption: PanGestureOptions = new PanGestureOptions({ direction: PanDirection.Up | PanDirection.Down }) 
  
  build() { 
    Column() { 
        Text('PanGesture offset:\nX: ' + this.offsetX + '\n' + 'Y: ' + this.offsetY) 
      } 
      .height(300) 
      .width(300) 
      .padding(20) 
      .border({ width: 3 }) 
      .margin(50) 
      .translate({ x: this.offsetX, y: this.offsetY, z: 0 }) // 以组件左上角为坐标原点进行移动 
      // 上下拖动触发该手势事件 
      .gesture( 
        PanGesture(this.panOption) 
          .onActionStart((event?: GestureEvent) => { 
            console.info('Pan start') 
          }) 
          .onActionUpdate((event?: GestureEvent) => { 
            if (event) { 
              // this.offsetX = this.positionX + event.offsetX 
              // this.offsetY = this.positionY + event.offsetY 
              console.log('yeyouzhi offsetY>>>'+event.offsetY) 
              animateTo({ 
                duration: 2000, 
                curve: Curve.EaseOut, 
                iterations: 1 , 
                playMode: PlayMode.Normal, 
                onFinish: () => { 
                  console.info('play end') 
                } 
              }, () => { 
  
                this.offsetX = this.positionX + event.offsetX 
                this.offsetY = this.positionY + event.offsetY 
              }) 
            } 
          }) 
          .onActionEnd(() => { 
            this.positionX = this.offsetX 
            this.positionY = this.offsetY 
            console.info('Pan end') 
          }) 
      ) 
  
    } 
  
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.

注明适配的版本信息

· IDE: 4.1.1.300

· SDK: 4.0.10.15

分享
微博
QQ
微信
回复
2024-05-27 20:20:14


相关问题
tabs结合scroll实现吸顶效果
1998浏览 • 1回复 待解决
Refresh结合lottie实现下拉刷新动画
1589浏览 • 1回复 待解决
HarmonyOS 动画效果实现
620浏览 • 1回复 待解决
如何实现动画转场效果
1362浏览 • 1回复 待解决
属性动画如何实现宽高动画效果
2407浏览 • 1回复 待解决
文字动画效果如何实现
2240浏览 • 0回复 待解决
HarmonyOS clipShape 动画效果实现
165浏览 • 0回复 待解决
在 ArkUl中如何实现动画效果?
361浏览 • 0回复 待解决
鸿蒙中怎么实现动画翻转效果
10933浏览 • 2回复 待解决
如何实现list的折叠动画效果
944浏览 • 1回复 待解决
HarmonyOS 实现按钮长按动画效果
708浏览 • 1回复 待解决
Scroller的fling实现有什么好的方案
1107浏览 • 1回复 待解决
HarmonyOS List动画效果
498浏览 • 1回复 待解决
HarmonyOS 动画效果+手势
471浏览 • 1回复 待解决
HarmonyOS 列表动画效果
513浏览 • 1回复 待解决
HarmonyOS 旋转动画效果
387浏览 • 1回复 待解决