2011-11-15 23 views
5

tôi muốn bitmap của tôi ở trung tâm của screen..im tôi cố gắng nó theo cách đó, nhưng nó không làm việc ...Làm cách nào để căn giữa giữa bitmap?

Bitmap myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.compass); 

      int w = canvas.getWidth(); 
      int h = canvas.getHeight(); 

      int bw=myBitmap.getWidth(); 
      int bh=myBitmap.getHeight(); 

      int cx = w/2; 
      int cy = h/2; 

      Display d = getWindowManager().getDefaultDisplay(); 
      int x = d.getWidth(); 
      int y = d.getHeight(); 
      int dx = x/2; 
      int dw = y /2; 
      canvas.translate(cx, cy);  
      if (mValues != null) { 
       canvas.rotate(-mValues[0]); 
      } 

      int centreX = (x - bw) /2; 

       int centreY = (cy - bh) /2; 
      //canvas.drawPath(mPath, mPaint); 
      canvas.drawBitmap(myBitmap, centreX,centreY, null); 
+0

Kết quả cuối cùng với mã này là gì? (Làm thế nào là hình ảnh liên kết) –

+0

Trong đó lớp và chức năng nào bạn sử dụng mã này? (Hoạt động/Xem, onDraw ...) –

+0

tôi sử dụng nó trong bảo vệ void onDraw (Canvas canvas). kết quả là trên cùng/bên trái của hình ảnh của tôi trong 0,0 –

Trả lời

9

Dưới đây là đoạn code mà bạn cần trong tầm nhìn của bạn:

private int mWidth; 
private int mHeight; 
private float mAngle; 

@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{ 
    mWidth = View.MeasureSpec.getSize(widthMeasureSpec); 
    mHeight = View.MeasureSpec.getSize(heightMeasureSpec); 

    setMeasuredDimension(mWidth, mHeight); 
} 

@Override protected void onDraw(Canvas canvas) 
{ 
    super.onDraw(canvas); 
    Bitmap myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.compass); 

    // Here's the magic. Whatever way you do it, the logic is: 
    // space available - bitmap size and divide the result by two. 
    // There must be an equal amount of pixels on both sides of the image. 
    // Therefore whatever space is left after displaying the image, half goes to 
    // left/up and half to right/down. The available space you get by subtracting the 
    // image's width/height from the screen dimensions. Good luck. 

    int cx = (mWidth - myBitmap.getWidth()) >> 1; // same as (...)/2 
    int cy = (mHeight - myBitmap.getHeight()) >> 1; 

    if (mAngle > 0) { 
     canvas.rotate(mAngle, mWidth >> 1, mHeight >> 1); 
    } 

    canvas.drawBitmap(myBitmap, cx, cy, null); 
} 

Ảnh chụp màn hình chỉ để cho vui: http://imgur.com/EYpMJ
(Đường chéo không phải là một phần của mã được đăng tại đây)

EDIT: Đã thêm giải pháp của NickT.
CHỈNH SỬA 2: Thay đổi giá trị [0] thành mAngle và biến nó thành có điều kiện. Thay đổi chia cho 2 thao tác thành bithifts. Hủy bỏ mã quay nếu bạn không cần nó.

+1

Điều này sẽ hoạt động OK, nhưng điểm xoay cho xoay sẽ cần thay đổi thành canvas.rotate (-mValues ​​[0], mWidth/2, mHeight/2), nếu không nó sẽ pivot trên một góc, không phải là trung tâm – NickT

+0

cảm ơn !! điều này đang làm việc tốt! một câu trả lời cuối cùng xin vui lòng.không có vấn đề im không sử dụng canvas.translate (cx, cy); if (mValues! = Null) { canvas.rotate (-mValues ​​[0]); } –

+0

Cảm ơn @NickT cho vòng xoay. Đã chỉnh sửa câu trả lời. –

3

Bạn có thể thử này:

 int width = containerBitmap.getWidth(); 
     int height = containerBitmap.getHeight(); 
     float centerX = (width - centeredBitmap.getWidth()) * 0.5f; 
     float centerY = (height- centeredBitmap.getHeight()) * 0.5f; 

Bạn có thể sử dụng nó để vẽ một bitmap ở trung tâm của bitmap khác.

Các vấn đề liên quan