0

こんにちは、回転に関して問題があります。現在、キャンバス上にいくつかのオブジェクトを描画しています。現在、この「オブジェクト」は単なるビットマップです。回転を計算してマトリックス内に渡した後、回転させるために新しいビットマップを作成する必要があります。小さなスニペットでこれが明確になります。

public void onDraw(Canvas canvas){
    mMatrix = new Matrix();
    mMatrix.postRotate(getRotation());
    Bitmap rotateBmp = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), mMatrix, true);
    canvas.drawBitmap(rotateBmp, mCoords.x -(mBitmap.getWidth() / 2), mCoords.y - ( mBitmap.getHeight() / 2), null);
    rotateBmp.recycle();
}

メモリを節約するためにできることは、でrecycleを呼び出すことだけrotateBmpで、ほとんどの場合正しく実行されます。回転させたいビットマップ「オブジェクト」が10個あると仮定します。つまり、10個のビットマップを「サンプル」として保持し、描画サイクルごとに10個の新しいビットマップと追加の新しいマトリックスを作成する必要があります(「リセット」する方法が見つかりませんでした)。これは私には非常に奇妙に聞こえます。回転の制御を維持しながら、「キャンバスに描画できるもの」をその場で(XMLなしで)作成する別の方法はありますか。どんなアイデアでも大歓迎です。ビュー、Drawable、または別のCustomClassは関係ありません。たぶん、getRotation描かれるべきすべての「何か」についてすべて同じであることが重要です。それを行うためのベストプラクティスは何ですか?

4

2 に答える 2

1

@Jason Robinson と キャンバスでテキストを回転する方法の多大な助けを借りて、私はそれを行う方法を見つけました。これは短いスニペットです。

Bitmap mBitmap = getResources()...
int xPositionOfBitmap
int yPositionOfBitmap
public void onDraw(Canvas canvas) {
    int bitmapCenterX = xPositionOfBitmap + (mBitmap.getWidth() / 2)
    int bitmapCenterY = yPositionOfBitmap + (mBitmap.getHeight() / 2)
    canvas.save()
    canvas.rotate(getRotation(),bitmapCenterX, bitmapCenterY)
    canvas.drawBitmap(mBitmap, xPositionOfBitmap, yPositionOfBitmap)
    canvas.restore()
}
于 2012-04-30T09:37:13.333 に答える
1

Canvasを使用して回転させることができますcanvas.rotate(float degrees)

public void onDraw(Canvas canvas) {
    canvas.drawBitmap(mBitmap, mCoords.x -(mBitmap.getWidth() / 2), mCoords.y - ( mBitmap.getHeight() / 2), null);
    canvas.rotate(getRotation());
}
于 2012-04-27T16:27:57.687 に答える