3

ライブ壁紙を勉強していました。でもまずはキャンバスアニメーションを勉強しなきゃ。ここに正常に動作するコードがあります。math.random() を使用します。しかし、私が欲しいのはこのようなものです。 ここに画像の説明を入力

ここでは、上に示したパスのように画像を移動させたいと考えています。私の考えは、x と y に math.random を使用することです。しかし、それを使用する際の問題は、画像が画面のどこにでも表示されることです。ランダムなパスを作成するための画像が必要です。x座標とy座標については知っていますが、パスがどのようにランダムにトリガーされるかはわかりませんか? 私は実際にそれを説明することはできません。しかし、弾むボールについて知っていれば、ボールにはランダムな座標線があります。ちょうどそのように。これが私のコードです。

public class MainActivity extends Activity {

    private Game game;
     public Handler updateHandler = new Handler(){
            /** Gets called on every message that is received */
            // @Override
            public void handleMessage(Message msg) {
                game.update();
                game.invalidate();
                super.handleMessage(msg);
            }
        };
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        game = new Game(this);
        setContentView(game);

        Thread myThread = new Thread(new UpdateThread());
        myThread.start();
    }

    public class UpdateThread implements Runnable {

        @Override
        public void run() {

             while(true){
                 try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                 MainActivity.this.updateHandler.sendEmptyMessage(0);
            }
        }

    }

}


public class Game extends View {

    private Bitmap image;
    private Paint paint;
    private int x=0;

    public Game(Context context) {
        super(context);
        image = Bitmap.createBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.ic_launcher));
        paint = new Paint();
    }

    // called every Frame
    protected void onDraw(Canvas canvas) {

        canvas.drawBitmap(image, x, 0, paint);
    }

    // called by thread
    public void update() {
            x = 1;
            x += Math.random() * 100;

    }

}

ここで私を助けてくれることを願っています..ありがとう。

4

1 に答える 1

4

これは、無限の線形補間ループのコードです (後で滑らかな曲線に変更したい場合があります)。

PointF mImagePos = new PointF();
PointF mImageSource = new PointF();
PointF mImageTarget = new PointF();
long mInterpolateTime;

protected void onDraw(Canvas canvas) {
    canvas.drawBitmap(image, mImagePos.x, mImagePos.y, paint);
}

public void update() {
    final long INTERPOLATION_LENGTH = 2000;
    long time = SystemClock.uptimeMillis();
    if (time - mInterpolateTime > INTERPOLATION_LENGTH) {
        mImageSource.set(mImageTarget);
        mImageTarget.x = (float)(Math.random() * 100);
        mImageTarget.y = (float)(Math.random() * 100);
        mInterpolateTime = time;
    }

    float t = (float)(time - mInterpolateTime) / INTERPOLATION_LENGTH;
    // For some smoothness uncomment this line;
    // t = t * t * (3 - 2 * t);

    mImagePox.x = mImageSource.x + (mImageTarget.x - mImageSource.x) * t;
    mImagePos.y = mImageSource.y + (mImageTarget.y - mImageSource.y) * t;
}
于 2012-09-01T08:51:13.363 に答える