2012-06-25 21 views
5

Tôi đang cố gắng vẽ một bitmap xoay quanh tâm của nó và thực hiện xoay mà không thay đổi kích thước bitmap. Tôi đang vẽ tất cả các họa tiết của mình lên màn hình thông qua một chuỗi trò chơi, vì vậy tôi đang tìm một giải pháp kết hợp bitmap gốc chứ không phải khung vẽ.Xoay bitmap của Android xoay quanh tâm mà không thay đổi kích thước

Xin cảm ơn trước.

Đây là mã của tôi cho đến nay, nó biến một bitmap quanh tâm của nó, nhưng thay đổi kích thước nó.

i = i + 2; 
      transform.postRotate(i, Assets.scoresScreen_LevelStar.getWidth()/2, Assets.scoresScreen_LevelStar.getHeight()/2); 
      Bitmap resizedBitmap = Bitmap.createBitmap(Assets.scoresScreen_LevelStar, 0, 0, Assets.scoresScreen_LevelStar.getWidth(), Assets.scoresScreen_LevelStar.getHeight(), transform, true); 

      game.getGraphics().getCanvasGameScreen().drawBitmap(resizedBitmap, null, this.levelStar.getHolderPolygons().get(0), null); 

Cập nhật:

tôi đã nhận thấy đây không phải là dễ dàng như nó có vẻ. Mã quay của tôi không phải là vấn đề. Các bitmap quay, nhưng dst rect cũng sẽ phải tăng/giảm tùy thuộc vào góc quay, nếu không bimap sẽ xuất hiện nhỏ hơn, vì nó được vẽ thành một dst rect cố định. Vì vậy, tôi đoán tôi sẽ phải phát triển một số phương pháp mà sẽ trở lại một dst rect. Vì vậy, các phương pháp cần thiết để xoay một bitmap mà không xuất hiện thay đổi kích thước:

public static Bitmap rotateBitmap(Bitmap bitmap, int rotation) // I've got this method working 

public static Rect rotateRect(Rect currentDst, int rotation) // Don't got this 

Tôi hiểu điều này sẽ đòi hỏi một số môn toán (trang điểm), bất cứ ai lên cho thách thức? : P

+0

Bạn đã thử gì cho đến nay? Bạn có thể đăng một số ví dụ về những gì đã không làm việc cho bạn? –

+0

Android thẳng hoặc Cocos2d-x? – Fallenreaper

+0

Đã cập nhật câu hỏi với mã, @Fallenreaper, tôi đang sử dụng GE của riêng mình, vì vậy hãy chạy Android ngay lập tức. –

Trả lời

0

Điều này phù hợp với tôi!

Tôi đã tạo phương thức trả về ma trận. Ma trận có thể được sử dụng theo phương pháp vẽ sau:

public void drawBitmap (Bitmap bitmap, Matrix matrix, Paint paint) 

Ở đây bạn đi! (Hình dạng tham số có thể được thay thế một cách dễ dàng, nếu bạn muốn rằng, chỉ để lại nhận xét):

public static Matrix rotateMatrix(Bitmap bitmap, Shape shape, int rotation) { 

     float scaleWidth = ((float) shape.getWidth())/bitmap.getWidth(); 
     float scaleHeight = ((float) shape.getHeight())/bitmap.getHeight(); 

     Matrix rotateMatrix = new Matrix(); 
     rotateMatrix.postScale(scaleWidth, scaleHeight); 
     rotateMatrix.postRotate(rotation, shape.getWidth()/2, shape.getHeight()/2); 
     rotateMatrix.postTranslate(shape.getX(), shape.getY()); 


     return rotateMatrix; 

    } 

NB: Nếu bạn muốn có một vòng quay động, các thông số vòng quay sẽ phải được cập nhật với các giá trị mới mỗi khung ví dụ. 1 rồi 2 rồi 3 ...

7

Bạn nên vẽ bitmap bằng cách sử dụng lớp Matrix. Dưới đây là một ý tưởng rất cơ bản giả định rằng bạn muốn xoay một hình ảnh bên trong một lớp "Tàu". Bạn cập nhật Ma trận vị trí hiện tại bên trong phương thức cập nhật. Trong onDraw() bạn vẽ bitmap bằng cách sử dụng ma trận vị trí mới được cập nhật. Điều này sẽ vẽ bitmap xoay mà không thay đổi kích thước của nó.

public class Ship extends View { 

    private float x, y; 
    private int rotation; 
    private Matrix position;  
    private Bitmap bitmap; 

    ... 

    @Override 
    public void onDraw(Canvas canvas) { 
     // Draw the Bitmap using the current position 
     canvas.drawBitmap(bitmap, position, null); 
    } 

    public void update() { 
     // Generate a new matrix based off of the current rotation and x and y coordinates. 
     Matrix m = new Matrix(); 
     m.postRotate(rotation, bitmap.getWidth()/2, bitmap.getHeight()/2); 
     m.postTranslate(x, y); 

     // Set the current position to the updated rotation 
     position.set(m); 

     rotation += 2; 
    } 

    .... 

} 

Hy vọng điều đó sẽ hữu ích!

Cũng xin lưu ý rằng việc tạo đối tượng Bitmap mới trong vòng trò chơi bạn sẽ là tài nguyên chuyên sâu.

+0

Bạn có thể viết lại, mà tôi có thể gọi một phương pháp tĩnh gọi là rotateBitmap (bitmap bitmap, int xoay), mà sẽ trả về một bitmap xoay Bimap đối tượng? –

+0

phương pháp thay đổi bitmap mà bạn truyền vào, vì vậy biến riêng tư của tư nhân "bitmap bitmap riêng tư"; không được xoay.Chỉ cần làm "return bitmap;" và thay đổi chữ ký phương thức. – Aziz

+0

Xin lỗi, điều này không hiệu quả đối với tôi. –