RotateAnimation :聆听每一个角度变化

RotateAnimation : Listen to every Angle Change

我有一个 View,我在其中添加了一个 RotateAnimation,它运行良好。我唯一的问题是,有没有办法聆听每一个角度变化。我知道我可以添加一个 AnimationListener 并使用以下侦听器,

rotateAnimation.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {

        }

        @Override
        public void onAnimationEnd(Animation animation) {

        }

        @Override
        public void onAnimationRepeat(Animation animation) {

        }
    });

而且我还可以使用 View.getRotation() 来获取视角。但是应用程序的功能会更改 w.r.t 根据用户选择的首选项计算的时间。

我要找的是一个能听到每一个角度变化的监听器。 类似于 onRotateAngleChange(int currentAngle)。 任何此类方法的任何指示或我可以使用的任何解决方法都会有很大帮助。

此致。

编辑:最终 Hint/Code 有效。 感谢@yakobom 的指点。

rotateAnimation = new RotateAnimation(fromDegrees, toDegrees){
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            super.applyTransformation(interpolatedTime, t);
            float degrees = fromDegrees + ((toDegrees - fromDegrees) * interpolatedTime);
            //Do what you want to do with your angle here.
        }
    };

无法为 RotationAnimation 添加更新侦听器,但是您可以使用 ObjectAnimator

获得相同的结果
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "rotation", initialValue, finalValue);
animator.setDuration(duration);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            currentRotation = valueAnimator.getAnimatedValue("rotation");
            //do something
        }
    });

或者,如果您的目标是 API 19 或更高版本,您可以使用添加的 Kitkat 中的动画 api 来简化操作,如下所示:

view.animate().rotationBy(finalValue - initalValue).setUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            currentRotation = valueAnimator.getAnimatedValue("rotation");
            //do something
        }
    });

您需要做的就是实现 applyTransformation,像这样:

    RotateAnimation rotateAnim = new RotateAnimation (...) {
                 @Override
                 public void applyTransformation(float interpolatedTime, Transformation t)              
                 {
                      super.applyTransformation(interpolatedTime, t); 

                       <your code here>
                 }