2016-01-25 1 views
0

У меня этот код работает. То, что я делаю, это загрузка изображения с помощью Picasso и загрузка его в imageView, который находится внутри элемента RecyclerView.Fit image width of imageView в ReyclerView item

Ресайклер Item XML

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.CardView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/card_item" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:cardPreventCornerOverlap="false" 
    app:cardElevation="4dp" 
    app:cardCornerRadius="4dp" 
    app:cardUseCompatPadding="true"> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <!-- Loading View --> 
     <com.wang.avi.AVLoadingIndicatorView 
      android:id="@+id/avloadingitem" 
      android:layout_width="50dp" 
      android:layout_height="50dp" 
      android:layout_gravity="center" 
      android:visibility="gone" 
      app:indicator="BallClipRotate" 
      app:indicator_color="@color/colorAccent"/> 

     <!-- Imagen --> 
     <com.wallakoala.wallakoala.Views.ProductImageView 
      android:id="@+id/grid_image" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      app:riv_corner_radius_bottom_left="4dp" 
      app:riv_corner_radius_bottom_right="4dp" 
      app:riv_corner_radius_top_left="4dp" 
      app:riv_corner_radius_top_right="4dp"/> 

     <!-- Pie de foto --> 
     <RelativeLayout 
      android:id="@+id/footer" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="bottom" 
      android:alpha="0.75"> 

      <!-- Info extra --> 
      <include android:id="@+id/extraInfo" 
       layout="@layout/product_footer_extra" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:visibility="visible"/> 

      <!-- Info principal --> 
      <include android:id="@+id/mainFooter" 
       layout="@layout/product_footer" 
       android:layout_height="@dimen/footer_height" 
       android:layout_width="match_parent" 
       android:layout_below="@id/extraInfo"/> 

     </RelativeLayout> 

    </FrameLayout> 

</android.support.v7.widget.CardView> 

Это мой обычай ImageView.

public class ProductImageView extends RoundedImageView 
{ 
    public ProductImageView(Context context) 
    { 
     super(context); 
    } 

    public ProductImageView(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
    } 

    public ProductImageView(Context context, AttributeSet attrs, int defStyle) 
    { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
    { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

     setMeasuredDimension(getMeasuredWidth(), (int)(getMeasuredWidth() * 1.32f)); 
    } 
} 

Я знаю, соотношение сторон изображений, так что я могу сделать это в методе onMeasure сказать Android высоты я хочу:

setMeasuredDimension(getMeasuredWidth(), (int)(getMeasuredWidth() * 1.32f)); 

Так что теперь она прекрасно работает с изображениями с этим соотношением сторон , однако, я хочу избавиться от этого, так как хочу загружать изображения с разными пропорциями. Итак, как я могу сказать Android, чтобы он соответствовал ширине и регулировал высоту изображенияView, поддерживая соотношение сторон?

Спасибо заранее,

ответ

2

Думаю, вы должны добавить adjustViewBounds атрибут тега изображения

<ImageView 
       android:id="@+id/thumbview" 
       android:layout_width="120dp" 
       android:layout_height="120dp" 
       android:layout_gravity="center" 
       android:adjustViewBounds="true"/> 
+0

Ницца! Это прекрасно работает, даст ему попробовать разные пропорции – cuoka

1

Вы ImageView в XML должны иметь высоту wrap_content, как это ..

<ImageView 
      android:id="@+id/grid_image" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:scaleType="fitXY"/> 

тогда, вы должны использовать пост() метод с Picasso Lib загрузить изображение с сервера.

imageView.post(new Runnable() { 
           @Override 
           public void run() { 
            Picasso.with(mActivity).load(path).resize(imageView.getWidth(), 0).into(imageView); 
           } 
          }); break; 
+0

Я думаю, что размер не может быть получен как параметр. – cuoka

1

Существует lib под названием '' Glide ''. Вы можете сделать это, просто загрузив изображение в изображение и вызовите .centercrop ex: Glide.with (yourFragment) .load (yourUrl) .centerCrop() .into (yourView);

шрифт>https://github.com/bumptech/glide/wiki/Transformations

+0

ОП спросил Пикассо, и он может сделать то же самое с Пикассо. –

0

Что вы ищете это: .fit().centerCrop() или .fit().centerInside()

Picasso 
    .with(context) 
    .load(imageUrl) 
    .fit() 
    .centerCrop() 
    // or .centerInside() 
    .into(myImageView) 
  • подходят: ждать, пока размер ImageView не может быть измерена, и изменить размер изображения в установите ImageView
  • centerInside: Изображение будет отображаться полностью, bu т не может заполнить весь ImageView (отношение Mantains аспект)
  • centerCrop: масштабирует изображение так, чтобы оно заполнило, кадрирование дополнительный