Изображение, полученное из ресурсов, будет увеличено, если его не найти по плотности dpi целевого устройства.Например, если вы работаете на устройстве с DisplayMetrics.DENSITY_HIGH
(hdpi), но у вас есть изображение только в /res/drawable-mdpi
, это изображение будет автоматически увеличено при извлечении через что-то вроде getDrawable()
.
Однако для загруженного изображения система не знает, для какой плотности предназначено изображение, поскольку оно не содержится в папке ресурсов, в которой указана его плотность, поэтому масштабирование не может быть выполнено автоматически.Вы должны определить плотность вручную, используя BitmapFactory.Options
.Рассмотрим следующую функцию:
/**
* Downloads an image for a specified density DPI.
* @param context the current application context
* @param url the url of the image to download
* @param imgDensity the density DPI the image is designed for (DisplayMetrics.DENSITY_MEDIUM, DisplayMetrics.DENSITY_HIGH, etc.)
* @return the downloaded image as a Bitmap
*/
public static Bitmap loadBitmap(Context context, String url, int imgDensity) {
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
BitmapFactory.Options options = new BitmapFactory.Options();
// This defines the density DPI the image is designed for.
options.inDensity = imgDensity;
// These define the density DPI you would like the image to be scaled to (if necessary).
options.inScreenDensity = metrics.densityDpi;
options.inTargetDensity = metrics.densityDpi;
try {
// Download image
InputStream is = new java.net.URL(url).openStream();
return BitmapFactory.decodeStream(is, null, options);
}
catch(Exception ex) {
// Handle error
}
return null;
}
Таким образом, если ваше изображение по указанному URL предназначено для экрана с разрешением mdpi, вы должны передать DisplayMetrics.DENSITY_MEDIUM
для параметра imgDensity
.Если текущий контекст имеет большую плотность DPI (например, DisplayMetrics.DENSITY_HIGH
), изображение будет соответственно увеличено.