Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Detect Fling distance android

Tags:

android

I am working on an application which requires me to manually handle the fling process rather than giving it to the framework. What I want to achieve is basically calculate the amount of pixels a listview moves when it receives a fling action. As the scroll method already provides distance in form of delta, I have handled it easily. But is there a way to get fling distance as only velocity parameter is being passed in the super method.

Note- I have to move another view in accordance with the fling distance, so I need to get it simultaneously just like onScroll provides it. Thanks.

like image 774
gaurav jain Avatar asked May 30 '14 10:05

gaurav jain


2 Answers

It is passed 3 years but no answer yet. I found some workaround to achieve it.

Actually it is kind of advanced topic as there are a lot of nuances but basically you can refer to Android source code(OverScroller class in particular) and use this method. You will need to copy it into your class and use it.

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

Other methods and values can be obtained from the same class. The link to the source code: https://android.googlesource.com/platform/frameworks/base/+/jb-release/core/java/android/widget/OverScroller.java

Keep in mind that in some devices the value can be different (not too much). Some vendors change the formula depending on their requirements and hardware to make it more smooth.

like image 181
Adil Aliyev Avatar answered Nov 11 '22 06:11

Adil Aliyev


It looks like the original question ended up with nothing, but it was formulated pretty good, so I landed here and started my research. Here are my results.

My question was: What is the final value at the end of Android standard FlingAnimation?

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

I needed that value before animation start based on the start velocity to make some preparations at the destination point of the FlingAnimation.

Actually I started with Overscroller.java mentioned by @Adil Aliyev. I collected all the portions of code, but the result was way less, that came from the animation.

Then I took a look into FlingAnimation.java in pair with DynamicAnimation.java.

The key function in FlingAnimation.java to start the research was:

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

After playing with some equations I composed this final code. It gives not totally exact estimation to the last digit, but very close. I will use it for my needs. You are welcome too:

    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);
like image 4
user10475643 Avatar answered Nov 11 '22 06:11

user10475643