1

どこかで見つけた既製のソリューションを使用してビットマップを回転させようとしています。コードは以下のとおりです。

      public void onDraw(Canvas canvas) {
                float x = ship.Position.left;
                float y = ship.Position.top;
                canvas.drawBitmap(ship.ship, x,y,null);
                invalidate();
      }

ただし、これを行うと、X 軸と Y 軸の方向が変わります。Y を大きくすると、画像は画面の下部ではなく上部に移動します。X を 90 度回転させると、同じことが起こります。

Y軸とX軸の方向を変えずに回転させる必要があります。

回転しても、Y を大きくするとビットマップを下に移動し、X を大きくすると右に移動します。

     public void update()
     {
       if(!moving)
         {
           fall();
         }
       else //moving
         {
           move();
          faceDirection();
         }
       Position.top += Speed;
      }

private void move() {
   if(Speed < MAXSPEED)
        Speed -= 0.5f;  
 }
private void fall() {
    if(Speed > MAXSPEED*-1)
    Speed += 0.2f;  
 }
private void faceDirection() {

    double OldDiretion = Direction;
    Direction = DirectionHelper.FaceObject(Position, ClickedDiretion);
    if (Direction != OldDiretion)
    {
        Matrix matrix = new Matrix();
        matrix.postRotate((float)Direction);
        ship = Bitmap.createBitmap(ship, 0, 0, ship.getWidth(),ship.getHeight(), matrix, false);
    }

上記のコードを試してみましたが、まだ Y 方向が変更されています。画面の下部ではなく、ビットマップの下部になります。

プロジェクトは次のとおりです: https://docs.google.com/file/d/0B8V9oTk0eiOKOUZJMWtsSmUtV3M/edit?usp=sharing

4

2 に答える 2

1

翻訳するよりも、最初に回転する必要があります。

matrix.postTranslate(x, y);
matrix.postRotate(degree);

preRotate()の代わりに使用することもできますpostRotate()

また、描画中にオリジナルを平行移動/回転することを強くお勧めします。したがって、createBitmap()呼び出しで向きを変更するべきではありません。少なくとも、ユーザーの操作で動的に変更する場合はそうではありません。そうしないと、多くのビットマップを作成して回転を何度も表現し、パフォーマンスに影響を与えることになります。

于 2013-03-22T16:50:03.363 に答える