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') 
          }) 
      ) 
  
    } 
  
}

注明适配的版本信息

· IDE: 4.1.1.300

· SDK: 4.0.10.15

分享
微博
QQ
微信
回复
2024-05-27 20:20:14
相关问题
tabs结合scroll实现吸顶效果
1219浏览 • 1回复 待解决
Refresh结合lottie实现下拉刷新动画
1037浏览 • 1回复 待解决
如何实现动画转场效果
771浏览 • 1回复 待解决
属性动画如何实现宽高动画效果
1906浏览 • 1回复 待解决
文字动画效果如何实现
1841浏览 • 0回复 待解决
在 ArkUl中如何实现动画效果?
37浏览 • 0回复 待解决
鸿蒙中怎么实现动画翻转效果
10317浏览 • 2回复 待解决
如何实现list的折叠动画效果
404浏览 • 1回复 待解决
Scroller的fling实现有什么好的方案
711浏览 • 1回复 待解决
Tabs 出现/消失转场动画效果
283浏览 • 1回复 待解决
求助动画效果问题有懂的吗?
4127浏览 • 1回复 待解决
ListItemGroup 和Lazyforeach结合场景
887浏览 • 1回复 待解决
如何应用属性动画实现宽高的动画
302浏览 • 1回复 待解决
HarmonyOS 如何实现RippleView动画
231浏览 • 1回复 待解决