2015-05-08 24 views
7

Jak używać pikselu do przycinania obrazu do widoku obrazu?Przycinanie Picasso do widoku

Domyślnie wydaje się skalować w dół, więc całość pokazuje dopasowanie wydaje się ją rozciągać. Centercrop sama się zrywa. dopasowanie centercrop wydaje się być taka sama jak po prostu dopasować

Dzięki

+6

Wykorzystanie '.fit(). CenterCrop()' [odpowiedź, która mi wiele pomóc] (http://stackoverflow.com/a/20824141/5439793) – Chack

Odpowiedz

6

Spróbuj użyć centerCrop()

Picasso.with(mContext) 
.load(url) 
.centerCrop() 
.resize(yourImageView.getMeasuredWidth(),yourImageView.getMeasuredHeight()) 
.error(R.drawable.error) 
.placeholder(R.drawable.blank_img) 
.into(yourImageView); 

Trzeba dodać addOnPreDrawListener słuchacza inaczej dostaniesz 0 dla szerokości i wysokości, gdy ImageView nie jest pociągnięty. Przejdź na stronę here, aby uzyskać szczegółowe informacje na temat korzystania z usługi addOnPreDrawListener.

+2

centercrop sama daje java błędzie. lang.IllegalStateException: Center crop wymaga wywoływania resize z dodatnią szerokością i wysokością. Co oznacza błąd Picassa? –

+0

@FrickenHamster masz rację. Musisz dodać rozmiar. Sprawdź moją edycję. –

+0

To rozwiązanie wydaje się po prostu ustawić przycinanie na podstawie dowolnych wartości, które mam w zmianie rozmiaru. Chciałbym ją przyciąć w oparciu o rozmiar widoku obrazu, który znajduje się w widoku z karty –

3

Należy zadzwonić rozmiaru przed wywołaniem centerCrop lub centerInside() metody inaczej Picasso narzeka szerokość docelowa/wysokości będącej 0.

public class MainActivity extends Activity { 
ImageView imageView; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    imageView = (ImageView) findViewById(R.id.imageView); 
} 

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    if (hasFocus) { 
     Picasso.with(this) 
       .load("http://i.imgur.com/removed.png") 
       .resize(imageView.getMeasuredWidth(), imageView.getMeasuredHeight()) 
       .centerCrop() // or centerInside() 
       .into(imageView); 
    } 
    super.onWindowFocusChanged(hasFocus); 
} 
} 

A oto ImageView zdefiniowane w układzie:

<ImageView 
    android:layout_width="160dp" 
    android:layout_height="160dp" 
    android:id="@+id/imageView" 
    /> 
+2

Mam rzeczywiście widok obrazu wewnątrz widoku recyklingu, , więc getmeasuredwidth i wysokość kończy się na wartości 0 w onBindViewHolder. Jak wtedy uzyskać rozmiar? dzięki –

+3

@Fricken Hamster, może za późno, ale możesz użyć '.fit()' Picassa. Czeka aż do 'getMeasure', a następnie zajmie się resztą. – Nexen

1

CenterCrop() jest techniką kadrowania, która skaluje obraz tak, aby wypełniał wymagane granice ImageView, a następnie przycina go. Numer ImageView zostanie całkowicie wypełniony, ale cały obraz może nie być wyświetlany.

Picasso 
.with(context) 
.load(UsageExampleListViewAdapter.eatFoodyImages[0]) 
.resize(600, 200) // resizes the image to these dimensions (in pixel) 
.centerCrop() 
.into(imageViewResizeCenterCrop); 

CenterInside() jest techniką przycinania, która wspina się na obraz w taki sposób, że oba te wymiary są takie same lub niższe od wymaganych granicach od ImageView. Obraz zostanie wyświetlony w całości, ale może nie wypełnić całego ImageView.

Picasso 
.with(context) 
.load(UsageExampleListViewAdapter.eatFoodyImages[0]) 
.resize(600, 200) 
.centerInside() 
.into(imageViewResizeCenterInside); 

Omówione opcje powinny uwzględniać potrzeby dotyczące funkcjonalności dotyczącej zmiany rozmiaru i skalowania obrazu. Jest jeszcze jedna funkcja pomocnicza Picassa, która może być bardzo przydatna: fit().

Picasso 
.with(context) 
.load(UsageExampleListViewAdapter.eatFoodyImages[0]) 
.fit() 
// call .centerInside() or .centerCrop() to avoid a stretched image 
.into(imageViewFit);