2013-07-15 1 views
1

Все, что я использовал, чтобы получить изображение в качестве фона на холстеКак масштабировать фоновое изображение на холсте в зависимости от размера устройства в андроиде

canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.help_4, 0, 0, null); 

И я получаю большое изображение. Так может любое pls. предоставить мне решение, чтобы получить набор изображений в соответствии с размером устройства. Как я новичок в кодировании подробного объяснения будет оценен :)

Спасибо

+0

bitmap класс имеет метод createScaledBitmap – njzk2

ответ

0

Вы почти там. Вам просто нужно настроить переменную BitmapFactory.Options, установив ширину вывода и высоту (в зависимости от размера экрана):

BitmapFactory.Options options = new BitmapFactory.Options(); 
Display display = getWindowManager().getDefaultDisplay(); 
Point size = new Point(); 
display.getSize(size); 
options.outHeight = size.x; 
options.outWidth = size.y; 
canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.help_4, options)); 
0

Определить ширину устройства и высоту и масштабировать его:

int deviceWidth = getWindowManager().getDefaultDisplay() 
.getWidth(); 
int deviceHeight = getWindowManager().getDefaultDisplay() 
.getHeight(); 

Таким образом, в комплекте вы можете использовать следующую готовую к употреблению фрагмент, взятый из here:

public Bitmap scaleToActualAspectRatio(Bitmap bitmap) { 
if (bitmap != null) { 
boolean flag = true; 

int deviceWidth = getWindowManager().getDefaultDisplay() 
.getWidth(); 
int deviceHeight = getWindowManager().getDefaultDisplay() 
.getHeight(); 

int bitmapHeight = bitmap.getHeight(); 
int bitmapWidth = bitmap.getWidth(); 

if (bitmapWidth > deviceWidth) { 
flag = false; 

// scale According to WIDTH 
int scaledWidth = deviceWidth; 
int scaledHeight = (scaledWidth * bitmapHeight)/bitmapWidth; 

try { 
if (scaledHeight > deviceHeight) 
    scaledHeight = deviceHeight; 
    bitmap = Bitmap.createScaledBitmap(bitmap, scaledWidth, 
    scaledHeight, true); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
} 

if (flag) { 
    if (bitmapHeight > deviceHeight) { 
    // scale According to HEIGHT 
    int scaledHeight = deviceHeight; 
    int scaledWidth = (scaledHeight * bitmapWidth)/bitmapHeight; 

    try { 
     if (scaledWidth > deviceWidth) 
     scaledWidth = deviceWidth; 
     bitmap = Bitmap.createScaledBitmap(bitmap, scaledWidth, 
     scaledHeight, true); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
    } 
    } 
return bitmap; 
} 

Так Finaly использование:

myCanvas.drawBitmap(scaleToActualAspectRatio(myBitmap), X, Y, null) 
0

процесс будет выглядеть примерно так:

  1. Получить размер экрана
  2. Рассчитайте новый размер изображения (сохраняя соотношение сторон)
  3. Decode растровое изображение нового размера.

Получить размер экрана

Чтобы получить точный размер экрана устройства, используйте DisplayMetrics ...

DisplayMetrics metrics = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(metrics); 

Переменная metrics теперь будет содержать размеры экрана в пикселях. Вы можете получить значения с помощью metrics.widthPixels и metrics.heightPixels.

Рассчитайте новый размер изображения (сохраняя соотношение сторон)

Чтобы рассчитать новый размер изображения, мы можем использовать BitmapFactory.Options и сказать ему, чтобы масштабировать изображение вниз на коэффициент x. Чтобы вычислить этот фактор (также называемый, как inSampleSize), используйте следующий метод ...

public static int calculateInSampleSize(
      BitmapFactory.Options options, int reqWidth, int reqHeight) { 
    // Raw height and width of image 
    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 

    if (height > reqHeight || width > reqWidth) { 

     // Calculate ratios of height and width to requested height and width 
     final int heightRatio = Math.round((float) height/(float) reqHeight); 
     final int widthRatio = Math.round((float) width/(float) reqWidth); 

     // Choose the smallest ratio as inSampleSize value, this will guarantee 
     // a final image with both dimensions larger than or equal to the 
     // requested height and width. 
     inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; 
    } 

    return inSampleSize; 
} 

Decode Bitmap на новый размер

// First decode with inJustDecodeBounds=true to check dimensions 
final BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inJustDecodeBounds = true; 
BitmapFactory.decodeResource(getResources(), R.drawable.help_4, options); 

// Calculate inSampleSize 
options.inSampleSize = calculateInSampleSize(options, metrics.widthPixels, metrics.heightPixels); 

// Decode bitmap with inSampleSize set 
options.inJustDecodeBounds = false; 
return BitmapFactory.decodeResource(getResources(), R.drawable.help_4, options); 

Опции inJustDecodeBounds сообщающие рамки обнулять битмап чтобы исключить исключения OOM, поскольку нас интересуют только размеры, а не фактическое изображение.

Этот метод гарантирует, что битмап масштабируется эффективно.Подробнее читайте здесь: http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

Смежные вопросы