我有一个属性动画,但它并不流畅,即我在动画中跳跃。我尝试使用动画师的参数,例如插补器,持续时间和帧延迟,但无法获得平滑的效果。有没有人有一些技巧/例子?这是我当前设置动画师的代码:
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);
}
我不知道这里有什么特别重的东西,但我可能错了......
答案 0 :(得分: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();
答案 1 :(得分:1)
我已经解决了将HW加速直接添加到我的动画视图和视图容器(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);
}
答案 2 :(得分:0)
动画中间的跳转更可能是由你的rotationController类中的某个东西引起的,即接收动画值“mapRotation”。或者它可能与您的布局有关。
我会想象有一些非常激烈的,内存或cpu明智的东西,这导致了juttering。
如果您制作了具有大量布局的动画,那么这可能就是原因。如果你的代码中有很多findViewByID被动画调用,那么这会导致速度变慢。
如果你只想制作一个简单的图像,那我就不能完全确定问题是什么了。
就我个人而言,我认为你的代码看起来很好,也许可以显示/描述你的动画效果。
[编辑] 我对画布的动画知识有限,所以我快速浏览一下你如何使用canvas.save()和canvas.restoreToCount(),这是我以前从未见过的。
这一切看起来都不错,虽然我觉得奇怪的是,几个教程旋转画布而不是球形图像来创建旋转。尽管如此,我发现改进动画的唯一参考是在以下link中使用postInvalidateOnAnimation()建议的注释。不知道在哪里,也许不是invalidate()。