1

Picasso로 이미지를로드하기 전에 ImageView 높이를 설정하려고합니다. 상위 뷰가 이미지 높이를 변경하지 못하게하려고합니다. 나는 이미지의 높이와 너비를 얻고 Picasso 내부에 설정 한 다음 크기를 줄입니다.Recyccerview StaggeredGridLayout 내부에서 Picasso로 이미지를로드하기 전에 ImageView 높이 및 너비를 설정하는 방법

크기 조정을 방지하기 위해 Picasso로 이미지를로드하기 전에 "webformatHeight"및 "webformatWidth"를 기반으로 ImageView의 배율을 조정하는 방법은 무엇입니까?

images changing after Picasso loads

데이터

{ 
    ... 
    "hits":[ 
     { 
      "webformatHeight":426, 
      "webformatWidth":640, 
      "webformatURL":"https://pixabay.com/get/eb32b5062dfd013ed95c4518b74a4291ea77ead204b0144190f8c478a2ebb3_640.jpg", 
      ... 
     }, 
     ... 
    ] 
} 

리사이클 구현

RecyclerView recycler = (RecyclerView) findViewById(R.id.recycler); 
mPixabayAdapter = new PixabayAdapter(); 
recycler.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)); 
recycler.setAdapter(mPixabayAdapter); 

ViewHolder

,
class ViewHolder extends RecyclerView.ViewHolder { 

    private ImageView mImage; 
    private TextView mTitle; 

    private ViewHolder(View view) { 
     super(view); 
     mImage = view.findViewById(R.id.image); 
     mTitle = view.findViewById(R.id.title); 
    } 

    void bindView() { 
     ColorDrawable[] shotLoadingPlaceholders = new ColorDrawable[]{new ColorDrawable(ContextCompat.getColor(itemView.getContext(), R.color.background_light))}; 
     Hit hit = mHitList.get(getAdapterPosition()); 
     mTitle.setText(hit.getUser()); 
     Picasso 
       .with(mImage.getContext()) 
       .load(hit.getWebformatURL()) 
       .placeholder(shotLoadingPlaceholders[0]) 
       .resize(hit.getImageWidth(), hit.getImageHeight()) 
       .priority(Picasso.Priority.HIGH) 
       .onlyScaleDown() 
       .into(mImage); 
    } 
} 

XML

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:padding="4dp"> 

    <ImageView 
     android:id="@+id/image" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:adjustViewBounds="true" /> 

    <TextView 
     android:id="@+id/title" 
     android:layout_width="match_parent" 
     android:layout_height="48dp" 
     android:layout_below="@+id/image" 
     android:background="@color/background_light" 
     android:fontFamily="sans-serif-medium" 
     android:gravity="center_vertical" 
     android:maxLines="1" 
     android:paddingLeft="16dp" 
     android:paddingRight="16dp" 
     android:textColor="@color/white_light" 
     android:textSize="13sp" /> 
</RelativeLayout> 

답변

1

석회질과 같은 화면 width/height하여 이미지의 비율과 뭔가 내부에 이미지 뷰를 포장 :

public class PixabayImageView extends AppCompatImageView { 
    private float aspectRatio = 1.77f; 

    public PixabayImageView(Context context) { 
     super(context); 
    } 

    public PixabayImageView(Context context, @Nullable AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public void setAspectRatio(float ratio) { 
     aspectRatio = ratio; 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     final int width = MeasureSpec.getSize(widthMeasureSpec); 
     heightMeasureSpec = MeasureSpec.makeMeasureSpec((int) (width * aspectRatio), MeasureSpec.EXACTLY); 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    } 
} 

이 작동하지 않습니다 ViewHolder

class ViewHolder extends RecyclerView.ViewHolder { 

    private PixabayImageView mImage; 
    ... 
    private ViewHolder(View view) { 
     super(view); 
     mImage = view.findViewById(R.id.image); 
     ... 
    } 

    private void bindView() { 
     final Hit hit = mHitList.get(getAdapterPosition()); 
     float p1 = (float) hit.getWebformatHeight()/hit.getWebformatWidth(); 
     mImage.setAspectRatio(p1); 
     ... 
    } 
} 
+0

대단히 고마워요. 다른 사람들이 같은 문제를 겪는다면 도움이 될 수 있도록 코드를 정리했습니다. –

0

는 폭과의 Bindview에 이미지 뷰의의 LayoutParams를 설정하고 다음과 같이 히트 클래스를 우리 hight 수 있습니다.

RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(hit.getImageWidth(), hit.getImageHeight()); 
mImage.setLayoutParams(layoutParams); 

으로합니다.

+0

내부의 화면 비율을 생성합니다. 이미지가있는 뷰보다 훨씬 큽니다. 크기를 조정해야합니다. –