2014-10-05 4 views
3

У меня есть фиксированный заголовок в моей деятельности, который мне нужно динамически загружать изображения в него. Мне нужны эти изображения, чтобы полностью заполнить этот заголовок, соблюдайте пропорции ширины и высоты.Установить максимальную ширину для загрузки изображений с помощью 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; 
    } 

ответ

3

Использование .Поставить() centerCrop(), он должен делать то, что вы ищете.

+0

Я пробовал как centerCrop(), так и centerInside(). –

+0

Хорошо, но так вы это делаете, если я не полностью неверно истолковал ваш вопрос. Может, у вас есть еще одна проблема? –

+0

*** ВАЖНО *** @ Jacob опубликовал обходной путь к этой проблеме на GitHub: https://github.com/square/picasso/issues/691 –

2

ImageView должен быть добавлен к ViewFlipper перед загрузкой изображения. Это так, что Пикассо знает высоту/ширину ImageView, которая должна масштабировать изображение должным образом до размера ImageView.

Изменить его:.

final ImageView imageView = new ImageView(SuggestionActivity.this); 
imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 

mViewFlipper.addView(imageView); 

Picasso.with(SuggestionActivity.this).load(selectedImageUri) 
     .fit().centerInside() 
     .into(imageView); 
+0

Такая же проблема все еще. –

+0

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

+0

Перед загрузкой изображения вам нужно добавить ImageView в макет. Он не измерял ширину/высоту ImageView в точке загрузки изображения, поэтому он не может масштабировать изображение до того же размера. –

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