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>
}
我有一个 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>
}