我正在开发一个应用程序,它要求我手动处理抛出过程,而不是将它交给框架。我想要实现的基本上是计算像素的数量,当一个列表视图移动时,它收到一个抛出的动作。由于滚动方法已经以增量的形式提供了距离,所以我很容易处理它。但是,是否有一种方法来获得抛距,因为在超级方法中只传递速度参数。
注-我必须移动另一个视图,根据抛出的距离,所以我需要得到它的同时,就像onScroll提供的。谢谢。
发布于 2017-02-24 05:14:43
三年过去了,但还没有答案。我找到了一些解决办法来达到这个目的。
实际上,这是一种高级的主题,因为有很多细微差别,但是基本上您可以参考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
请记住,在某些设备中,值可能会有所不同(不要太大)。一些供应商根据他们的需求和硬件改变公式,使其更加流畅。
发布于 2020-08-19 00:08:46
看起来,最初的问题最终一无所获,但它的表述很好,所以我来到这里,开始了我的研究。这是我的结果。
我的问题是:在Android标准value的末尾,最终的FlingAnimation是什么?
new FlingAnimation(new FloatValueHolder(0f))
.addEndListener((animation, canceled, value, velocity) -> {
? value在动画开始之前,我需要这个值,根据启动速度在FlingAnimation的目标点做一些准备。
实际上,我从@ Aliyev提到的Overscroller.java开始。我收集了代码的所有部分,但是从动画中得到的结果要少得多。
然后,我和DynamicAnimation.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);https://stackoverflow.com/questions/23952293
复制相似问题