5

私はAndroidを初めて使用し、キャンバスをアニメーション化する方法を理解するのに問題があります。基本的に私はボールが階段から落ちるはずのときに赤いボールと階段を描きました

これがその様子です。

ここに画像の説明を入力してください

誰かが私がどの方法を使うべきかについて私を助けることができますか?非常に役立つソースコードを提供していただければ幸いです。

これが私のソースコードです:

DrawingView.java

package com.ballandstair;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.view.View;

public class DrawingView extends View {
    DrawingView(Context context) {
        super(context);
    }

    protected void onDraw(Canvas canvas){
        super.onDraw(canvas);
        Paint paint = new Paint();
        Path path = new Path();

        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.RED);
        paint.setAntiAlias(true);
        canvas.drawCircle(100, 50, 25, paint);

        paint.setColor(Color.BLUE);
        paint.setStyle(Paint.Style.FILL);
        path.moveTo(75, 75);
        path.lineTo(125, 75);
        path.lineTo(125, 125);
        path.lineTo(175, 125);
        path.lineTo(175, 175);
        path.lineTo(225, 175);
        path.lineTo(225, 225);
        path.lineTo(275, 225);
        path.lineTo(275, 275);
        path.lineTo(325, 275);
        path.lineTo(325, 325);
        path.lineTo(75, 325);
        path.close();
        canvas.drawPath(path, paint);

    }
}

MainActivity.java

package com.ballandstair;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DrawingView drawing = new DrawingView(this);
        setContentView(drawing);


    }
}
4

2 に答える 2

2

基本的に、アニメーション ロジックは 3 つのコンポーネントで構成されます。

  • パラメータ: 描画するオブジェクトの位置、回転、スケール。

  • スレッド: 2 つのスレッドを使用して、オブジェクトのプロパティ (位置、回転、スケール) を個別に描画および更新するか、1 つのスレッドで実行するかを選択できます。

  • 無限ループ: 描画 -> 更新 -> 描画 ... を無限に繰り返すループ

それらを実装するには多くの方法がありますが、使用できるいくつかの API のみを提案できます。

  • View.invalidate()、これを使用して、フレームワークにビューを再描画するように要求します。これにより、 onDraw() メソッドが呼び出されます。

  • [View.postDelayed()](http://developer.android.com/reference/android/view/View.html#postDelayed(java.lang.Runnable, long)) 、これを使用して、最後に無限ループを作成しますView.invalidate() を呼び出す onDraw() メソッド。

于 2012-08-10T02:35:38.867 に答える
1

(少なくとも) 2 つのことを行う必要があります。

  1. ボールの位置が可変になるようにコードを変更します。これは難しすぎてはいけません。
  2. ボールの位置を定義する変数を更新し、カスタム ビューの再描画をトリガーする方法を用意して、時間の経過とともにボールが目的のパスをたどるように見えるようにします。

2番目のステップは少し注意が必要です。Thread.sleep(frameRate)(frameRateはフレーム間のミリ秒数) を呼び出し、ボールの位置を更新しinvalidate()、カスタム ビューを呼び出して再描画をトリガーするループを書きたくなるかもしれません。これの問題は、イベント スレッドを一時停止できないことです。これに対処するには、(再び) 2 つの方法があります。

  1. アニメーション ループを持つワーカー スレッドを作成します。invalidate()直接呼び出すことはできませんがpostInvalidate()、同じ効果を呼び出すことができます。
  2. メソッド内でボールの位置を更新するRunnableことを宣言し、を呼び出し、 ( を呼び出して)の遅延後にビュー自体を再度実行するように要求します。run()invalidate()RunnableframeRatepostDelayed()

どちらの方法も合理的なアプローチです。また、アニメーションがいつ終了するかを知るためのロジックも必要です。また、いつ開始するか、または再生を許可するかをユーザーが制御できるようにすることもできます。

于 2012-08-10T02:38:45.790 に答える