2012-11-15 3 views
7

사용자 클릭을 기준으로 10 도씩 비트 맵 이미지를 회전하고 싶습니다. 수많은 stackoverflow 및 google 답변에 이어 Matrix 순환 게재의 다양한 조합을 시도했습니다.진동 운동없이 이미지 중심에 대해 안드로이드에서 비트 맵을 부드럽게 회전하는 방법

그러나 실제로 이미지가 예상대로 회전하지 않으며 캔버스 중심에 대한 회전 + 진동의 시야를 제공합니다. 테스트하려면 개체의 그리기 메서드가 호출 될 때마다 회전 각을 클릭 대신 10 ° 씩 증가시킵니다. 이미지는 [64x64 사각형을 포함하는 대칭 원형]이며, 휠과 같이 자신의 중심에 대해 화면 중심에서 회전하려고하지만 회전 및 대각선 방향으로 오른쪽 아래로 이동하고 진동 중심으로 화면의 중심까지 움직입니다. .

public void draw(Canvas canvas) { 
    Matrix matrix = new Matrix(); 

    rotation += 10; 
    float px = this.viewWidth/2; 
    float py = this.viewHeight/2; 
    matrix.setRotate(rotation, bitmap.getWidth()/2, bitmap.getHeight()/2); 
    Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, getImgWidth(), getImgHeight(), matrix, true); 
    canvas.drawBitmap(newbmp, px - (getImgWidth()/2), py - (getImgHeight()/2), null); 

} 

답변

18

다음은 예입니다. 나는 그것을 3 단계로 나눴다. 첫 번째 번역은 비트 맵을 움직여 중심이 0 인 다음 회전 ( )하고 마지막으로 비트 맵 중심을 캔버스에서 원하는 위치로 이동합니다. 두 번째 비트 맵이 필요하지 않습니다.

Matrix matrix = new Matrix(); 
rotation += 10; 
float px = this.viewWidth/2; 
float py = this.viewHeight/2; 
matrix.postTranslate(-bitmap.getWidth()/2, -bitmap.getHeight()/2); 
matrix.postRotate(rotation); 
matrix.postTranslate(px, py); 
canvas.drawBitmap(bitmap, matrix, null); 

최적화,이 방법 밖에 한 번 매트릭스를 생성하는 단계는 matrix.reset()

+2

감사합니다. 매트릭스를 'draw'메소드 밖으로 이동하고 매트릭스가 재설정되지 않도록 보장하여 [부드러운 회전 효과를 제공합니다.] 또한 처음 두 개의 post * 메소드 대신'matrix.setRotate (rotation, bitmap.getWidth()/2, bitmap.getHeight()/2); – Anshul

+0

답장을 보내 주셔서 감사합니다. 그것은 내 하루를 저장합니다. – Siddharth

+0

여기이보기는 어느 것입니까? –

0

당신은 같은 0,0 점에 비트 맵 변환 (또는 0,0를 그릴)과 거기 회전, 다시 번역해야합니다

canvas.save(); 
    canvas.translate(this.viewWidth, this.viewHeight); 
    canvas.rotate(rotation); 
    canvas.drawBitmap(newbmp, -(getImgWidth()/2), -(getImgHeight()/2), null); 
canvas.restore(); 

여기에 내가 0,0에서 중심을 그립니다 (생각합니다). 왜냐하면 회전 할 때 화면의 중심이 아닌 0,0 정도이기 때문입니다. 중심을 0,0에 그릴 경우 비트 맵의 ​​중심을 기준으로 회전합니다.

내 코드가 0,0에서 비트 맵 중심을 그리는 것을 완료하지 못하면 내 코드를 가운데로 그릴 수 있으며 원하는대로 작동합니다.

희망이 도움이됩니다.

+0

:(복원 이미지

  • 을 그립니다. 위의 방법으로 상황이 악화되었습니다. 이제 내 바퀴가 오른쪽 아래 모퉁이를 돌면서 오른쪽 하단 모서리를 중심으로 진동하고 나머지 배경과 물체는 그대로 보입니다. canvas.translate는 단순히 바퀴 중심을 이동합니다 – Anshul

  • +0

    이것은 뷰 치수 대신에'getImgWidth()/2'와'getImgHeight()/2'를 번역 할 때 실제로 작동합니다. –

    0
    // x : x coordinate of image position 
    // y : y coordinate of image position 
    // w : width of canvas 
    // h : height of canvas 
    canvas.save(); 
    canvas.rotate(angle, x + (w/2), y + (h/2)); 
    canvas.drawBitmap(image, x, y, null); 
    canvas.restore(); 
    

    에 대한 호출로 생성을 대체

    1. 저장 기존의 캔버스
    2. 회전 각도로 캔버스에 그릴 비트 맵의 ​​중심에 대해 캔버스를 회전합니다.
    3. ,
    4. 이미지