2014-02-10 96 views
0

我得到了一張太陽圖片,860x860像素。 我想以錨點爲中心旋轉太陽。 這是我走到這一步:使用矩陣旋轉位圖後的比例和保持比例

class GraphicalMenu extends View{ 

    int screenH; 
    int screenW; 
    int angle; 
    Bitmap sun, monster; 

    public GraphicalMenu(Context context){ 
     super(context); 

     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inScaled = false; 
     sun = BitmapFactory.decodeResource(getResources(),R.drawable.sun,options); 
     monster = BitmapFactory.decodeResource(getResources(),R.drawable.monster,options); 
    } 

    @Override 
    public void onSizeChanged (int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 
     screenH = h; 
     screenW = w; 
     sun = Bitmap.createScaledBitmap(sun, w, h, true); 
     monster = Bitmap.createScaledBitmap(monster, w, h, true); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     //Increase rotating angle. 
     if (angle++ >360) 
      angle =0; 

     Matrix matrix = new Matrix(); 
     matrix.setRotate(angle , getWidth()/2, getHeight()/2); 
     canvas.drawBitmap(sun, matrix, new Paint()); 

     //Call the next frame. 
     canvas.drawBitmap(monster,0 , 0, null); 

     invalidate(); 
    } 
} 

我試圖改變這一行:

sun = Bitmap.createScaledBitmap(sun, w, h, true); 

到:

sun = Bitmap.createScaledBitmap(sun, h, h, true); 

但隨後太陽留下的中心屏幕並向遠處旋轉到右側。 如何讓太陽適應屏幕? 我怎樣才能保持它的比例?

編輯 從我的N5和太陽圖片上運行它的截圖。 screenshot

sun

回答

0

如果我理解正確的話,你有幾個問題與您的代碼:

  1. 如果你正在做多次調用onSizeChanged(),那麼你會希望保持原有的位圖(預縮放),否則當您再次升級位圖時,它們會看起來像素化,因爲每次縮減它們時,都會丟失信息。
  2. 當您提供一個矩陣,通過它來轉換您的位圖以繪製到畫布上時,該矩陣將應用於位圖本身,而不是整個屏幕。所以當你進行drawBitmap()調用時,你實際要求的是位圖圍繞本地點(getWidth()/ 2,getHeight()/ 2)旋轉,而不是屏幕點。
  3. 實際上,您並不是圍繞屏幕中心旋轉,而是圍繞視圖中心旋轉。除非視圖佔用整個屏幕,否則您將無法達到預期的效果。

我不能準確地確定你的問題是什麼,但上傳一些圖片可能會澄清你試圖達到的目標以及你目前的狀況。

+0

我設置畫布: \t \t GraphicalMenu gm = new GraphicalMenu(this); \t \t setContentView(gm);所以它覆蓋了整個屏幕。所以寬度和高度應該是正確的。我還更新了照片,希望能夠更容易理解我想實現的目標。 :) –