您当前的位置: 首页 >  面试
  • 0浏览

    0关注

    674博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

面试:Android Fling 惯性滑动原理

沙漠一只雕得儿得儿 发布时间:2021-12-23 10:50:13 ,浏览量:0

一、RecyclerView中触发Fling操作

先看下RecyclerViewonTouch方法:

@Override
public boolean onTouchEvent(MotionEvent e) {
            case MotionEvent.ACTION_UP: {
                mVelocityTracker.addMovement(vtev);
                eventAddedToVelocityTracker = true;
                mVelocityTracker.computeCurrentVelocity(1000, mMaxFlingVelocity);
                final float xvel = canScrollHorizontally
                        ? -mVelocityTracker.getXVelocity(mScrollPointerId) : 0;
                final float yvel = canScrollVertically
                        ? -mVelocityTracker.getYVelocity(mScrollPointerId) : 0;
                if (!((xvel != 0 || yvel != 0) && fling((int) xvel, (int) yvel))) {
                    setScrollState(SCROLL_STATE_IDLE);
                }
                resetTouch();
            } break;
}

在up触发的时候会调用native方法去获得X和Y方向的速率:

根据收集的点计算流速。仅当您实际想要检索速度信息时才调用此函数,因为它相对比较昂贵。然后可以使用{@link#getXVelocity()}和{@link#getYVelocity()}检索速度。
@param units您想要的速度单位。值为1表示每秒像素数,1000表示每秒像素数,等等@param maxVelocity此方法可计算的最大速度。此值必须以与units参数相同的单位声明。此值必须为正值。

public void computeCurrentVelocity(int units, float maxVelocity) {
        nativeComputeCurrentVelocity(mPtr, units, maxVelocity);
    }

如果有其中一个不为0就会调用fling操作,如果滑动速率小于50的话就不会触发fling操作。

二、Android 如何知道fling velocity的距离、时间 根据滑动距离得到velocity

//通过初始速度获取最终滑动距离

//通过需要滑动的距离获取初始速度

//获取滑动的时间

要做到惯性滑动,我们需要做到:

  • 得到手指抬起时的速度
  • 将速度转换成具体的位移

获取速度

首先,关于如何在ACTION_UP中得到速度。VelocityTrackerCompatgetYVelocity可以获得指定ID的手指当前Y轴上的速度。向上为负,向下为正。

自定义控件的惯性滑动 - 简书

关注
打赏
1657159701
查看更多评论
立即登录/注册

微信扫码登录

0.0365s