2011-03-13 4 views
0

Android 용 게임을 만들고있어 이미지를 회전해야합니다. 그것이 분명히 회전 할 때 치수가 바뀝니다. 예를 들어 그것이 45도 회전하면 (사각형이지만 사각형 대신 사용할 수 있기 때문에 좀 더 일반적인 해결책입니다) 폭과 높이가 대각선의 길이가되어 원본보다 길어집니다. 일부 대수가 끝나면 스케일 인자는 sqrt (2)라고 계산할 수 있습니다. 그러나 비트 맵을 회전하는 방법을 알고있는 유일한 방법은 행렬을 사용하는 것입니다. 예 :이 방법은 비트 맵의 ​​크기를 사용이미지가 회전하면서 크기가 변합니다. 어떻게 그만합니까?

matrix.postRotate(degrees); 
rotated = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, true); 

정도로 수축해야하는 화상의 내용으로 회전 된 이미지에 맞게 일정하게 유지된다. 내 문제가 생겼어.

내가 지금해야하는 것은 작동해야하지만 실행하지 않아야합니다. 그것이 지나치게 복잡한 결코 적은이다 아마 때문에, 여기있다 :

 float totalRotated = 0; 

public void rotate(float degrees){ 
    if(mBitmap != null){ 
     float increment = (float)((mBitmap.getWidth()/45.0)*(Math.sqrt(2)-1)); 
     totalRotated += degrees; 
     totalRotated -= (float)((int)totalRotated/360)*360; 
     matrix.reset(); 
     matrix.setRotate(totalRotated); 
     rotated = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, true); 
     rotated = Bitmap.createScaledBitmap(rotated, (int)(mBitmap.getWidth()+(((Math.abs(Math.abs(((int)totalRotated%90)-45)-45)))*increment)), (int)(mBitmap.getHeight()+(((Math.abs(Math.abs(((int)totalRotated%90)-45)-45)))*increment)), true); 
    } 
} 

내가 마지막 문에 설정된 치수는 내가 그들로 기대 것을 확인할 수 있었다 Log.d 기능을 사용하지만 이미지는 '아무튼 t 크기를 변경하십시오. 이 방법은 효과가 없기 때문에이 방법이나 내 방법을 수정하는 방법이 필요합니다. 또한 내 방법은 사각형에 대해서만 작동합니다. 그래서, 어떻게해야합니까?

편집 : 내 방법이 작동하지만 방금 호출하지 않았습니다. setBounds() 이렇게하는 것이 유일한 방법 일 수는 없습니다. 너무 비효율적입니다.

+0

귀하의 질문이 무엇인지 명확히하십시오. 나는 꽤 말할 수 없다. – Gabe

답변

1

찾고자하는 것이 명확하지 않으므로 새 비트 맵의 ​​적절한 너비와 높이를 계산하고 단일 비트 맵을 만들어 회전을 시도하는 함수를 기반으로하는 함수가 있습니다.

float totalRotated = 0; 

public void rotate(float degrees){ 
    if(mBitmap != null){ 
     // compute the absolute rotation 
     totalRotated = (totalRotated + degrees) % 360; 
     // precompute some trig functions 
     double radians = Math.toRadians(totalRotated); 
     double sin = Math.abs(Math.sin(radians)); 
     double cos = Math.abs(Math.cos(radians)); 
     // figure out total width and height of new bitmap 
     int newWidth = mBitmap.getWidth() * cos + mBitmap.getHeight() * sin; 
     int newHeight = mBitmap.getWidth() * sin + mBitmap.getHeight() * cos; 
     // set up matrix 
     matrix.reset(); 
     matrix.setRotate(totalRotated); 
     // create new bitmap by rotating mBitmap 
     rotated = Bitmap.createBitmap(mBitmap, 0, 0, 
             newWidth, newHeight, matrix, true); 
    } 
} 
+1

계산이 훨씬 덜 복잡하고 정확할 수도 있습니다. 첫 번째 정수와 세 번째 정수 (x + width)를 더한 값이 인수로 전달한 비트 맵의 ​​너비보다 작거나 같지 않으면 createBitmap 메서드가 잘못된 인수 예외를 throw하기 때문입니다. 이 방법을 사용하면 예외가 발생합니다. 이제는 경계 사각형을 수정해야한다는 것을 알았습니다. 그래서 저는 그 라인을 추가하고 여러분의 계산을 사용했습니다. 이제 스케일링이 생성하는 오프셋을 수정하면됩니다. 너무 열심히해서는 안됩니다. – Fsmv

+0

@Fsmv : 아마도 그냥 matrix.postTranslate ((newWidth - mBitmap.getWidth())/2, (newHeight - mBitmap.getHeight())/2)가 필요합니다. ' – Gabe

+0

나는 ur 코드를 시험해 보았습니다. : 잘못된 인수 예외 (x + 너비) 덜 .... 도와주세요 –

관련 문제