1

我有一个属性动画,但它并不流畅,即我在动画中跳跃。我尝试使用动画器的参数,例如插值器、持续时间和帧延迟,但无法获得平滑的效果。有没有人有一些技巧/例子?这是我当前设置动画师的代码:

rotationAnimator=new ObjectAnimator();
rotationAnimator.setTarget(rotationController);
rotationAnimator.setPropertyName("mapRotation");
rotationAnimator.setInterpolator(new LinearInterpolator());
ValueAnimator.setFrameDelay(24);
rotationAnimator.setDuration(ROTATION_DURATION);
rotationAnimator.setRepeatCount(ValueAnimator.INFINITE);
rotationAnimator.setRepeatMode(ValueAnimator.RESTART);

(还有一个调用setFloatValues,但它在代码的后面,在我开始动画之前)

编辑:我被要求展示我正在制作的动画,所以这里是:

这是从动画中获取值的 setter 函数:

public void setMapRotation(float rotationDegrees)
{
    if ((rotationAnimator!=null)&&(rotationAnimator.isRunning()))
        rotationAnimator.cancel();
    rotationDegrees%=360;
    if (rotationDegrees<0) rotationDegrees+=360;
    rotationView.setRotationDegrees(rotationDegrees);
    if (rotationDegrees!=oldRotationDegrees)
    {
        notifyRotationListeners();
        oldRotationDegrees=rotationDegrees;
    }
}

如果您查看代码,您会看到另一个函数被调用 (setRotationDegrees),所以它是:

public void setRotationDegrees(float rotationDegrees)
{ 
    this.rotationDegrees=rotationDegrees%360;
    if (this.rotationDegrees<0) this.rotationDegrees+=360;
    Log.i("MapView","View degrees: " + this.rotationDegrees);
    invalidate();
}

这就是失效后发生的情况:

@Override protected void dispatchDraw(Canvas canvas)
{
    Log.i("MapView","Redrawing");
    int saveCount=canvas.save(Canvas.MATRIX_SAVE_FLAG);
    canvas.rotate(rotationDegrees,getWidth()/2,getHeight()/2);
    canvas.setDrawFilter(drawFilter);
    canvas.getMatrix(rotationMatrix);
    super.dispatchDraw(canvas);
    canvas.restoreToCount(saveCount);
}

我不知道这里有没有特别重的东西,但我可能错了......

4

3 回答 3

1

在其上定义AnimatorSet并设置插值器可能会解决您的问题:

rotationAnimator=new ObjectAnimator();
rotationAnimator.setTarget(rotationController);
rotationAnimator.setPropertyName("mapRotation");
ValueAnimator.setFrameDelay(24);
rotationAnimator.setDuration(ROTATION_DURATION);
rotationAnimator.setRepeatCount(ValueAnimator.INFINITE);
rotationAnimator.setRepeatMode(ValueAnimator.RESTART);

AnimatorSet animatorSet = new AnimatorSet();
animatorSet.getChildAnimations().add(rotationAnimator);
animatorSet.setInterpolator(new LinearInterpolator());
...
animatorSet.start();
于 2013-01-12T14:53:31.973 回答
1

我已经通过将硬件加速直接添加到我的动画视图和视图容器(myViewContainer - 在我的情况下为RelativeLayout)来解决:

if(!myViewContainer.isHardwareAccelerated())
{
    myViewContainer.setLayerType(View.LAYER_TYPE_HARDWARE, null);
    myAnimatedView1.setLayerType(View.LAYER_TYPE_HARDWARE, null);
    myAnimatedView2.setLayerType(View.LAYER_TYPE_HARDWARE, null);
}
于 2016-04-23T14:23:25.057 回答
0

动画中间的跳跃更有可能是由您的 rotationController 类中的任何一个东西引起的,即接收动画值“mapRotation”。或者它可能与您的布局有关。

我会想象有一些非常强烈的东西,内存或 CPU 明智,这会导致抖动。

如果您的动画有很多布局,那么这可能是原因。如果您的代码中有很多 findViewByID 由于动画而被调用,那么这可能会导致速度变慢。

如果您只是为一个简单的图像制作动画,那么我不完全确定问题是什么。

我个人认为你的代码看起来不错,也许显示/描述你的动画。

[编辑] 我对使用画布制作动画的知识有限,因此我快速了解了您是如何使用我以前从未见过的 canvas.save() 和 canvas.restoreToCount() 的。

一切看起来都不错,尽管我确实觉得奇怪的是几个教程旋转画布而不是球图像来创建旋转。尽管如此,我发现改进动画的唯一参考是以下链接中的评论,该评论建议使用 postInvalidateOnAnimation()。但不确定在哪里,也许不是 invalidate()。

于 2013-01-12T14:46:37.527 回答