Zmień rozmiar obrazu na pełną szerokość i stałą wysokość za pomocą Picassa

164

Mam pionowy LinearLayout, w którym jeden z elementów jest ImageViewładowany za pomocą Picassa. Muszę zwiększyć szerokość obrazu do pełnej szerokości urządzenia i wyświetlić środkową część obrazu przyciętego o ustaloną wysokość (150 dp). Obecnie mam następujący kod:

Picasso.with(getActivity()) 
    .load(imageUrl) 
    .placeholder(R.drawable.placeholder) 
    .error(R.drawable.error) 
    .resize(screenWidth, imageHeight)
    .centerInside() 
    .into(imageView);

Jakie wartości powinienem wpisać screenWidthi imageHeight(= 150 dp)?

David Rabinowitz
źródło

Odpowiedzi:

486

Szukasz:

.fit().centerCrop()

Co to oznacza:

  • fit- poczekaj, aż ImageViewzostanie zmierzony i zmień rozmiar obrazu, aby dokładnie odpowiadał jego rozmiarowi.
  • centerCrop- skaluj obraz z zachowaniem proporcji, aż wypełni cały rozmiar. Przytnij górną i dolną część lub lewą i prawą, tak aby dokładnie pasowała do rozmiaru.
Jake Wharton
źródło
5
Jaka powinna być wysokość imageView? Nie chcę mieć stałej wysokości dla mojego imageView. Powinien zmieniać się w zależności od wysokości obrazu.
Chetna,
4
.fit().centerInside()zadziałało dla mnie, gdzie samo użycie .centerInside()powodowało awarię z Center inside requires calling resize with positive width and height.komunikatem o błędzie.
Rock Lee
@Rock Lee, musisz zmienić jego rozmiar: '.load (url) .resize (targetWidth, targetHeight)' .........
FRK
8
.fit().centerCrop()lub .fit().centerInside()nie działa. Obraz się nie ładuje imageView. bez .fit()obrazu ładuje się dobrze. Nie używam .resize()w obu przypadkach.
Nishant Bhakta,
jak zmienić jego rozmiar bez przycinania go z dowolnej strony, a także zachowując aspekt
Rohit Sharma
1

W niektórych przypadkach funkcja fit () jest bezużyteczna. Zanim będziesz musiał zaczekać na zakończenie pomiaru szerokości i wysokości. Możesz więc użyć globallayoutlistener. na przykład;

imageView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            public void onGlobalLayout() {
                Picasso.with(getActivity())
                        .load(imageUrl)
                        .placeholder(R.drawable.placeholder)
                        .error(R.drawable.error)
                        .resize(screenWidth, imageHeight)
                        .fit
                        .centerInside()
                        .into(imageView);
                imageView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
        });
Umut ADALI
źródło