private void ComputeCurrentValue() { if (!(Math.Abs(mCurrentValue - mTargetValue) > 0.01f)) { return; } if (-1 != mNeedleLastMoved) { float time = (JavaSystem.CurrentTimeMillis() - mNeedleLastMoved) / 1000.0f; float direction = Math.Signum(mNeedleVelocity); if (Math.Abs(mNeedleVelocity) < 90.0f) { mNeedleAcceleration = 5.0f * (mTargetValue - mCurrentValue); } else { mNeedleAcceleration = 0.0f; } mNeedleAcceleration = 5.0f * (mTargetValue - mCurrentValue); mCurrentValue += mNeedleVelocity * time; mNeedleVelocity += mNeedleAcceleration * time; if ((mTargetValue - mCurrentValue) * direction < 0.01f * direction) { mCurrentValue = mTargetValue; mNeedleVelocity = 0.0f; mNeedleAcceleration = 0.0f; mNeedleLastMoved = -1L; } else { mNeedleLastMoved = JavaSystem.CurrentTimeMillis(); } Invalidate(); } else { mNeedleLastMoved = JavaSystem.CurrentTimeMillis(); ComputeCurrentValue(); } }