2012-05-02 7 views
10

Poniższy kod definiuje moją bitmapę:Narysuj skalowaną bitmapę na płótnie?

Resources res = context.getResources(); 

    mBackground = BitmapFactory.decodeResource(res, 
      R.drawable.bg2); 

    //scale bitmap 
    int h = 800; // height in pixels 
    int w = 480; // width in pixels  
    Bitmap scaled = Bitmap.createScaledBitmap(mBackground, w, h, true); // Make sure w and h are in the correct order 

... A Poniższy kod służy do wykonywania/remis to (nieskalowany bitmapy):

c.drawBitmap(mBackground, 0, 0, null); 

Moje pytanie brzmi, jak mogę ustawić, aby narysować skalowaną bitmapę zwróconą w postaci "Bitmapy skalowanej", a nie oryginału?

Odpowiedz

25

zdefiniować nową zmienną składową klasy: Bitmap mScaledBackground; Następnie przypisać nowo utworzonego skalowany bitmapę do niego: mScaledBackground = scaled; Następnie zadzwonić metodę Draw: c.drawBitmap(mScaledBackground, 0, 0, null);

pamiętać, że nie jest dobrym pomysłem do rozmiaru ekranu twardego kodu, tak jak w powyższym fragmencie. Lepiej byłoby sprowadzić rozmiar ekranu urządzenia w następujący sposób:

int width = getWindowManager().getDefaultDisplay().getWidth(); 
int height = getWindowManager().getDefaultDisplay().getHeight(); 

I byłoby chyba lepiej nie zadeklarować nową bitmapę do jedynego celu opracowania oryginalnego tła w skalowany sposób. Bitmapy zużywają wiele cennych zasobów, a zwykle telefon jest ograniczony do kilku mb bitmap, które możesz załadować zanim twoja aplikacja nie zawodzi. Zamiast tego można zrobić coś takiego:

Rect src = new Rect(0,0,bitmap.getWidth()-1, bitmap.getHeight()-1); 
Rect dest = new Rect(0,0,width-1, height-1); 
c.drawBitmap(mBackground, src, dest, null); 
+1

Twoja odpowiedź zadziałała, ale odjęcie 1 od szerokości i wysokości w argumentach wyświetlało linię (z innej bitmapy w tle) po prawej i na dole wyświetlanej bitmapy, usunięcie -1 działało poprawnie. – akshay7692

+1

Wiem, że jest to starszy post teraz. Jednak w systemie Android 7.0+ możesz nie móc polegać na pełnej szerokości/wysokości wyświetlania w trybie podzielonego ekranu. Tak więc, dla każdego, kto korzysta z tego rozwiązania, należy o tym pamiętać. – MCLLC

+0

w ten sposób narysować bitmap bardzo wolno? – Amos

2

Aby narysować skalowane bitmapy chcesz zapisać skalowane bitmapy w polu gdzieś (tutaj nazywa mScaled) i zadzwonić:

c.drawBitmap(mScaled,0,0,null); 

w swojej metody Draw (lub gdziekolwiek teraz to nazwiesz).