我正在开发一个应用程序,它需要我手动处理fling过程而不是将其提供给框架。我想要实现的是基本上计算listview在收到fling动作时移动的像素数量。由于滚动方法已经提供了三角形的距离,我已经轻松处理了它。但是有没有办法获得投掷距离,因为只有速度参数在超级方法中传递。
注意 - 我必须根据投掷距离移动另一个视图,所以我需要同时获取它,就像onScroll提供它一样。 感谢。
答案 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);