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、アニメーションを開始する前に、コードの後半に来ます)

編集:私がアニメーション化しているものを表示するように求められたので、ここにあります:

これは、アニメーションから値を取得するセッター関数です。

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

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);
}
于 2016-04-23T14:23:25.057 に答える
1

を定義しAnimatorSetて Interpolator を設定すると、問題が解決する場合があります。

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 に答える
0

アニメーションの途中でのジャンプは、アニメーション化された値「mapRotation」を受け取っている、rotationController クラスの何かによって引き起こされる可能性が高くなります。または、レイアウトに関係している可能性があります。

ジャタリングの原因となっている、メモリまたはCPUに関して非常に激しい何かがあると思います。

レイアウトがたくさんあるものをアニメーション化する場合、それが原因である可能性があります。コード内に、アニメーションの結果として呼び出される findViewByID が多数ある場合、速度が低下する可能性があります。

単純な画像をアニメーション化するだけの場合、問題が何であるかは完全にはわかりません。

個人的には、あなたのコードはうまく見えると思います。おそらく、あなたのアニメーションを表示/説明してください。

[編集] キャンバスを使ったアニメーションについての知識が限られているので、以前に見たことのない canvas.save() と canvas.restoreToCount() をどのように使用しているかを簡単に調べました。

いくつかのチュートリアルが回転を作成するためにボールの画像ではなくキャンバスを回転させるのは奇妙だと思いますが、すべてがうまく見えます。それでも、アニメーションを改善するために私が見つけた唯一の参考文献は、postInvalidateOnAnimation() の使用を提案した次のリンクのコメントでした。ただし、おそらくinvalidate()の代わりに、どこにあるのかわかりません。

于 2013-01-12T14:46:37.527 に答える