У меня есть фиксированный заголовок в моей деятельности, который мне нужно динамически загружать изображения в него. Мне нужны эти изображения, чтобы полностью заполнить этот заголовок, соблюдайте пропорции ширины и высоты.Установить максимальную ширину для загрузки изображений с помощью Picasso
Если я загружаю изображение раньше, я получаю OutOfMemoryException. Если я использую метод fit() Picasso, в области будут пустое пространство. И если я использую Transformation, как предполагали некоторые люди в StackOverflow, я также получаю OutOfMemoryException.
Как я могу это решить?
Заголовок XML:
<FrameLayout
android:id="@+id/headerContainer"
android:layout_width="match_parent"
android:layout_height="140dp"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:background="#ffd5d5d5">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView4"
android:layout_gravity="center"
android:src="@drawable/background_camera" />
<ViewFlipper
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/viewFlipper"
android:layout_gravity="center" >
</ViewFlipper>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Adicionar foto do estacionamento"
android:id="@+id/textAddPhotos"
android:layout_gravity="center"
android:textColor="#ff757575"
android:padding="10dp" />
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"
android:id="@+id/addPhotosArea"></RelativeLayout>
</FrameLayout>
Изображения добавляются в ViewFlipper программно, используя следующий код:
final ImageView imageView = new ImageView(SuggestionActivity.this);
imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
Picasso.with(SuggestionActivity.this).load(selectedImageUri)
.fit().centerInside()
.into(imageView);
mViewFlipper.addView(imageView);
UPDATE
я понял, что Пикассо переоценивает при загрузке изображения с ориентацией exif = 90º.
Я пытаюсь изменить его источник, но логика довольно запутанна.
Я думаю, что проблема в этой функции файла BitmapHunter.java:
static Bitmap transformResult(Request data, Bitmap result, int exifRotation) {
int inWidth = result.getWidth();
int inHeight = result.getHeight();
int drawX = 0;
int drawY = 0;
int drawWidth = inWidth;
int drawHeight = inHeight;
Matrix matrix = new Matrix();
if (data.needsMatrixTransform()) {
int targetWidth = data.targetWidth;
int targetHeight = data.targetHeight;
float targetRotation = data.rotationDegrees;
if (targetRotation != 0) {
if (data.hasRotationPivot) {
matrix.setRotate(targetRotation, data.rotationPivotX, data.rotationPivotY);
} else {
matrix.setRotate(targetRotation);
}
}
if (data.centerCrop) {
float widthRatio = targetWidth/(float) inWidth;
float heightRatio = targetHeight/(float) inHeight;
float scale;
if (widthRatio > heightRatio) {
scale = widthRatio;
int newSize = (int) Math.ceil(inHeight * (heightRatio/widthRatio));
drawY = (inHeight - newSize)/2;
drawHeight = newSize;
} else {
scale = heightRatio;
int newSize = (int) Math.ceil(inWidth * (widthRatio/heightRatio));
drawX = (inWidth - newSize)/2;
drawWidth = newSize;
}
matrix.preScale(scale, scale);
} else if (data.centerInside) {
float widthRatio = targetWidth/(float) inWidth;
float heightRatio = targetHeight/(float) inHeight;
float scale = widthRatio < heightRatio ? widthRatio : heightRatio;
matrix.preScale(scale, scale);
} else if (targetWidth != 0 && targetHeight != 0 //
&& (targetWidth != inWidth || targetHeight != inHeight)) {
// If an explicit target size has been specified and they do not match the results bounds,
// pre-scale the existing matrix appropriately.
float sx = targetWidth/(float) inWidth;
float sy = targetHeight/(float) inHeight;
matrix.preScale(sx, sy);
}
}
if (exifRotation != 0) {
matrix.preRotate(exifRotation);
}
Bitmap newResult =
Bitmap.createBitmap(result, drawX, drawY, drawWidth, drawHeight, matrix, true);
if (newResult != result) {
result.recycle();
result = newResult;
}
return result;
}
Я пробовал как centerCrop(), так и centerInside(). –
Хорошо, но так вы это делаете, если я не полностью неверно истолковал ваш вопрос. Может, у вас есть еще одна проблема? –
*** ВАЖНО *** @ Jacob опубликовал обходной путь к этой проблеме на GitHub: https://github.com/square/picasso/issues/691 –