2011-01-25 2 views
1

Странная вещь случается - по крайней мере, я ее не понимаю.Android - масштабирование изображения после того, как я сделал это программно

У меня есть изображение (w: 120px, h: 63px), которое представлено на одном ImageButton. Единственный вариант этого изображения, который у меня есть, помещается в drawable-hdpi (и нет другого доступного каталога). Все в порядке с этим изображением, и каждое разрешение (плотность), Android позаботится об этом очень красиво.

Но проблема в том, что, когда я снимаю с альбома (например, очень большое фото), масштабируйте его до размеров кнопки (ранее упоминалось, w: 120px h: 63px) и установите это маленькое изображение как ImageButton background.

В случае, если я тестирую эмулятор со средней плотностью (160), это нормально, но при тестировании на устройстве с высокой плотностью кнопка изменяется, поскольку масштабированное изображение оказывается меньше.

Кто-нибудь имеет представление о том, что происходит, и почему размер изображения изменился еще раз после того, как я его масштабировал?

Любая подсказка будет высоко оценена.

Вот код, я использую для изменения размера изображения:

public static void resizeAndSaveImage(String pathToResize, int newWidth, int newHeight, FileOutputStream output) { 
try { 
    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inSampleSize = 8; 
    Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(pathToResize), null, options); 
    if (bitmap != null) { 
     int width = bitmap.getWidth(); 
     int height = bitmap.getHeight(); 
     float scaleWidth = ((float) newWidth)/width; 
     float scaleHeight = ((float) newHeight)/height; 
     Matrix matrix = new Matrix(); 
     matrix.postScale(scaleWidth, scaleHeight); 
     Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); 
     resizedBitmap.compress(Bitmap.CompressFormat.PNG, 100, output); 
     output.close(); 
    } 
} catch (Exception e) { 
    // ... 
} 

параметры измерения передаются в следующим образом: newWidth = 120, newHeight = 63.

+0

Установите api на 1.5, это остановит андроид от изменения размера, но означает, что вам нужно будет это сделать. –

ответ

1

Для того, чтобы достичь того, чего вы хотите, вы необходимо использовать независимые от плотности пиксели (dp), а не физические пиксели. Чтение из here:

Плотность-независимый пиксель эквивалентен одному физическому пикселя на дюйм экрана 160, базовая плотность предполагается платформой (как описано далее в этом документе). Во время работы платформа прозрачно обрабатывает любые масштабирование необходимых единиц измерения, основанных на , на фактической плотности экрана в . Преобразование единиц dp в пиксели пикселей прост: пиксели = dps * (плотность/160). Например, на экране с разрешением 240 точек на дюйм 1 dp будет равняться 1,5 физическим пикселям. Использование модулей dp для определяет пользовательский интерфейс вашего приложения, очень рекомендуется , чтобы обеспечить правильное отображение вашего пользовательского интерфейса на разных экранах .

Чтобы более подробно объяснить, почему это происходит с одним изображением (фотографией альбома), а не с ресурсом изображения, вам нужно опубликовать код, который вы используете для масштабирования.

+0

Я добавил фрагмент кода, который я использую для изменения размера - надеюсь, что это будет полезно. – ezamur