首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >探测Fling距离android

探测Fling距离android
EN

Stack Overflow用户
提问于 2014-05-30 10:21:52
回答 2查看 2.2K关注 0票数 9

我正在开发一个应用程序,它要求我手动处理抛出过程,而不是将它交给框架。我想要实现的基本上是计算像素的数量,当一个列表视图移动时,它收到一个抛出的动作。由于滚动方法已经以增量的形式提供了距离,所以我很容易处理它。但是,是否有一种方法来获得抛距,因为在超级方法中只传递速度参数。

注-我必须移动另一个视图,根据抛出的距离,所以我需要得到它的同时,就像onScroll提供的。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-24 05:14:43

三年过去了,但还没有答案。我找到了一些解决办法来达到这个目的。

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

代码语言:javascript
复制
 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

请记住,在某些设备中,值可能会有所不同(不要太大)。一些供应商根据他们的需求和硬件改变公式,使其更加流畅。

票数 4
EN

Stack Overflow用户

发布于 2020-08-19 00:08:46

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

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

代码语言:javascript
复制
    new FlingAnimation(new FloatValueHolder(0f))
        .addEndListener((animation, canceled, value, velocity) -> {
            ? value

在动画开始之前,我需要这个值,根据启动速度在FlingAnimation的目标点做一些准备。

实际上,我从@ Aliyev提到的Overscroller.java开始。我收集了代码的所有部分,但是从动画中得到的结果要少得多。

然后,我和DynamicAnimation.java成对地查看了一下DynamicAnimation.java

FlingAnimation.java启动研究的关键功能是:

代码语言:javascript
复制
    MassState updateValueAndVelocity(float value, float velocity, long deltaT) {

在处理了一些方程式之后,我编写了最后的代码。它不是给出对最后一个数字的完全精确的估计,而是非常接近。我会用它来满足我的需要。我们也欢迎你:

代码语言:javascript
复制
    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);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23952293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档