panGesture结合动画实现fling效果

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

HarmonyOS
2024-05-26 15:17:20
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
wingcky

使用的核心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
相关问题
Refresh结合lottie实现下拉刷新动画
481浏览 • 1回复 待解决
tabs结合scroll实现吸顶效果
407浏览 • 1回复 待解决
属性动画如何实现宽高动画效果
675浏览 • 1回复 待解决
如何实现动画转场效果
385浏览 • 1回复 待解决
鸿蒙中怎么实现动画翻转效果
8933浏览 • 2回复 待解决
文字动画效果如何实现
796浏览 • 0回复 待解决
求助动画效果问题有懂的吗?
3011浏览 • 1回复 待解决
Scroller的fling实现有什么好的方案
404浏览 • 1回复 待解决
ListItemGroup 和Lazyforeach结合场景
406浏览 • 1回复 待解决
canvas如何实现水印效果
402浏览 • 1回复 待解决
如何实现星级评分效果
58浏览 • 1回复 待解决
如何实现组件水波纹动画案例
451浏览 • 1回复 待解决
图片模糊效果如何实现
346浏览 • 1回复 待解决
使用swiper组件实现viewPager效果
521浏览 • 1回复 待解决
如何通过Progress实现loading效果
41浏览 • 1回复 待解决
如何等效实现JSONObejct效果
262浏览 • 1回复 待解决
鸿蒙如何实现动画值变化
8143浏览 • 1回复 待解决
求教ArkUI如何实现组合动画
4232浏览 • 1回复 待解决
二级浮层的出场动画实现
336浏览 • 1回复 待解决
如何实现从底部缓慢上升的弹窗动画
673浏览 • 1回复 待解决