2011-06-13 125 views
1

我想要根據發送到更新函數的水平大小將圖像縮放到一定的大小,但下面的代碼似乎沒有正確確定圖像的大小。爲什麼我的圖像不能正確縮放?

編輯:代碼:

public class GlassesView extends View { 

    private Paint paint; 
    private BitmapFactory.Options options; 
    private Bitmap bitmapOrg; 
    private Bitmap target; 
    private Bitmap bitmapRev; 
    private Bitmap resizedBitmap; 

    private int currY; 

    public int glassesX; 
    public int glassesY; 
    public float glassesSizeX; 
    public float glassesSizeY; 
    private boolean drawGlasses; 
    private boolean glassesMirrored; 

    public GlassesView(Context context) { 
     super(context); 
     paint = new Paint(); 
     paint.setDither(false); 
     paint.setAntiAlias(false); 

     options = new BitmapFactory.Options(); 
     options.inDither = false; 
     options.inScaled = false; 

     bitmapOrg = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), 
       R.drawable.micro_glasses, options), 32, 5, false); 
     bitmapRev = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), 
       R.drawable.glasses_reverse, options), 32, 5, false); 
     drawGlasses = false; 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.drawBitmap(target, 0, 0, paint); 

     boolean moving = currY < glassesY; 
     if (moving) { 
      currY++; 
     } 
     if (drawGlasses) { 
      int newWidth = resizedBitmap.getWidth(); 
      int newHeight = resizedBitmap.getHeight(); 
      Paint bluey = new Paint(); 
      bluey.setColor(Color.argb(64, 0, 0, 255)); 
      canvas.drawRect(new Rect(glassesX, currY, glassesX + newWidth, 
        currY + newHeight), bluey); 

      canvas.drawBitmap(resizedBitmap, glassesX, currY, paint); 
     } 
     if (moving) { 
      invalidate(); 
     } 
    } 

    public void drawGlasses(int x1, int x2, int y, boolean mirror) { 
     drawGlasses = true; 
     glassesMirrored = mirror; 
     if (!mirror) { 
      glassesSizeX = (float) (x2 - x1)/(float) (25 - 16); 
      glassesSizeY = glassesSizeX; 
      glassesY = y - (int)(1*glassesSizeX); 
      glassesX = (int) (x1 - (glassesSizeX * 16)); 
     } else { 
      glassesSizeX = (float) (x1 - x2)/(float) (25 - 16); 
      glassesSizeY = glassesSizeX; 
      glassesY = y - (int)(1*glassesSizeX); 
      glassesX = (int) (x1 - (glassesSizeX * 16)); 
     } 

     currY = -1; 

     if (!glassesMirrored) { 
      resizedBitmap = Bitmap.createScaledBitmap(bitmapOrg, 
        (int) (bitmapOrg.getWidth() * glassesSizeX), 
        (int) (bitmapOrg.getHeight() * glassesSizeY), false); 
     } else { 
      resizedBitmap = Bitmap.createScaledBitmap(bitmapRev, 
        (int) (bitmapRev.getWidth() * glassesSizeX), 
        (int) (bitmapRev.getHeight() * glassesSizeY), false); 
     } 
    } 

    public void setTargetPic(Bitmap targetPic) { 
     target = targetPic; 
    } 

} 

The result.(藍色矩形作爲圖像的預期尺寸的邊框),難道我要去

哪一部分錯了嗎?

編輯2: 這裏是眼鏡:glasses

編輯3: 出於好奇,我跑了我的實際的手機上,並得到了much different result,圖像被拉伸過預期的藍盒子。

編輯4: 我試着在幾個模擬器上運行該應用程序,看看它是否是一個Android版本不兼容的東西,但他們似乎都工作得很好。縮放問題只發生在我的手機(充滿活力,根源,CM7)和我的表弟(Droid,也紮根)。這些是我測試過的唯一物理設備,但它們似乎都有相同的問題。 如果有人能夠幫助我,我真的很感激,這是我項目中的一個巨大障礙,沒有其他論壇或消息組織正在迴應。

編輯5: 我應該提到,在更新4中,代碼發生了一些變化,這就解決了仿真器中的問題(如我所述),但不適用於物理設備。更改在上面的代碼中更新。 *絕望的求救*:P

編輯6: 另一個更新,我測試了我的舊G1相同的代碼,並預期它完美的作品。我現在完全沒有線索。

+0

爲什麼不在這裏發佈你的代碼? – Atreys 2011-06-13 03:54:38

+0

我認爲它會太長,不是嗎? – 2011-06-13 04:10:59

+0

您被允許/鼓勵直接在您的問題中發佈代碼。如果它太長,它會自動設置爲滾動(如果你格式正確!)這就是說,我不認爲你的代碼在其他地方是值得的票。 – Haphazard 2011-06-13 04:12:44

回答

0

發現問題所在。圖像必須位於名爲「drawable-nodpi」的文件夾中,否則將根據DPI進行縮放。

0
Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, glassesWidth, 
              glassesHeight, matrix, false); 

將最後一個參數從false更改爲true。 你可以試試。

該遵循的是我用放大方法,通過規模:

private void small() { 
    int bmpWidth=bmp.getWidth(); 
    int bmpHeight=bmp.getHeight(); 

    Log.i(TAG, "bmpWidth = " + bmpWidth + ", bmpHeight = " + bmpHeight); 

    /* 設置圖片縮小的比例 */ 
    double scale=0.8; 
    /* 計算出這次要縮小的比例 */ 
    scaleWidth=(float) (scaleWidth*scale); 
    scaleHeight=(float) (scaleHeight*scale); 
    /* 產生reSize後的Bitmap對象 */ 
    Matrix matrix = new Matrix(); 
    matrix.postScale(scaleWidth, scaleHeight); 
    Bitmap resizeBmp = Bitmap.createBitmap(bmp,0,0,bmpWidth, 
      bmpHeight,matrix,true); 
+0

不幸的是,所有這些改變都是反鋸齒和抖動我的圖像(我試圖避免,因爲眼鏡應該是像素化的)。儘管如此,眼鏡仍保持相同的尺寸。 – 2011-06-13 04:17:52

+0

我也知道調整大小的位圖對象是正確的大小,因爲在我的代碼中,我使用它的尺寸來創建藍色矩形。 – 2011-06-13 17:35:09

1

你一直使用/ RES /繪製-nodpi /目錄來存放你的作品?

顯然,如果您使用/ drawable-ldpi /,/ drawable-mdpi /或/ drawable-hdpi /文件夾,Android會根據設備對圖像應用縮放比例。您的G1可能工作的原因是它可能不需要任何縮放,具體取決於您使用的文件夾。

此外,您的IMGUR鏈接已損壞...您的代碼似乎也不正確......您可以調用DrawGlasses而不帶任何參數。

+0

謝謝你的作品!是的,鏈接過期了,我沒有在這個java文件中調用方法,所以我不知道你指的是什麼,我沒有參數調用它。 無論如何,再次感謝你! – 2011-06-20 05:33:44

+0

哦,我看到...你有一個名爲drawGlasses和一個私人成員的方法...可能不是最好的做法,因爲當查看代碼以在相同類中具有相同名稱的變量/函數時,它會引起混淆。 – CatalystNZ 2011-06-23 00:07:59

相關問題