检测Fling距离android

时间:2014-05-30 10:21:52

标签: android

我正在开发一个应用程序,它需要我手动处理fling过程而不是将其提供给框架。我想要实现的是基本上计算listview在收到fling动作时移动的像素数量。由于滚动方法已经提供了三角形的距离,我已经轻松处理了它。但是有没有办法获得投掷距离,因为只有速度参数在超级方法中传递。

注意 - 我必须根据投掷距离移动另一个视图,所以我需要同时获取它,就像onScroll提供它一样。 感谢。

2 个答案:

答案 0 :(得分:3)

它通过了3年但尚无答案。我找到了一些解决方法来实现它。

实际上它是一种高级主题,因为有很多细微差别,但基本上你可以参考Android源代码(特别是OverScroller类)并使用这种方法。您需要将其复制到您的班级并使用它。

 private double getSplineFlingDistance(int velocity) {
            final double l = getSplineDeceleration(velocity);
            final double decelMinusOne = DECELERATION_RATE - 1.0;
            return mFlingFriction * PHYSICAL_COEF * Math.exp(DECELERATION_RATE / decelMinusOne * l);
        }

其他方法和值可以从同一个类中获得。 源代码的链接:https://android.googlesource.com/platform/frameworks/base/+/jb-release/core/java/android/widget/OverScroller.java

请记住,在某些设备中,值可能不同(不是太多)。一些供应商根据他们的要求和硬件更改公式,以使其更加顺畅。

答案 1 :(得分:2)

看起来原始问题一无所获,但它的表述非常好,所以我来到了这里开始研究。这是我的结果。

我的问题是:Android标准FlingAnimation末尾的最后value是什么?

    new FlingAnimation(new FloatValueHolder(0f))
        .addEndListener((animation, canceled, value, velocity) -> {
            ? value

在动画开始之前,我需要根据开始速度使用该值,以便在FlingAnimation的目标点进行一些准备。

实际上,我从@Adil Aliyev提到的Overscroller.java开始。我收集了所有代码部分,但结果却少得多,它们来自动画。

然后,我与FlingAnimation.java一起对DynamicAnimation.java进行了研究。

FlingAnimation.java中开始研究的关键功能是:

    MassState updateValueAndVelocity(float value, float velocity, long deltaT) {

在玩了一些方程式之后,我编写了此最终代码。它不能完全精确地估计最后一位数字,但非常接近。我将根据需要使用它。也欢迎您:

    final float DEFAULT_FRICTION = -4.2f;
    final float VELOCITY_THRESHOLD_MULTIPLIER = 1000f / 16f;
    float mFriction = 1.1f * DEFAULT_FRICTION; // set here friction that you set in .setFriction(1.1f) or 1 by default
    final float THRESHOLD_MULTIPLIER = 0.75f;
    float mVelocityThreshold = THRESHOLD_MULTIPLIER * VELOCITY_THRESHOLD_MULTIPLIER;
    
    double time = Math.log(mVelocityThreshold / startVelocity) * 1000d / mFriction;
    double flingDistance = startVelocity / mFriction * (Math.exp(mFriction * time / 1000d) - 1);