2015-05-08 19 views
7

Come utilizzerei Picasso per ritagliare un'immagine in un'immagine?Ritaglio di picasso su una vista

Il valore predefinito sembra ridimensionarlo in modo che tutto ciò che mostra sembra adattarlo. centercrop da solo si rompe. centercrop in forma sembra essere la stessa solo in forma

Grazie

+6

Usa '.fit(). CenterCrop()' [risposta, che mi aiuta un sacco] (http://stackoverflow.com/a/20824141/5439793) – Chack

risposta

6

Provare a utilizzare centerCrop()

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

È necessario aggiungere addOnPreDrawListener ascoltatore altrimenti si ottiene 0 per la larghezza e l'altezza quando l'ImageView non è disegnato. Vai a here per dettagli su come utilizzare addOnPreDrawListener.

+2

centercrop di per sé dà un java errore. lang.IllegalStateException: il ritaglio centrale richiede il richiamo del ridimensionamento con larghezza e altezza positive. Qual è l'errore di Picasso? –

+0

@FrickenHamster hai ragione. È necessario aggiungere il ridimensionamento. Controlla la mia modifica. –

+0

Questa soluzione sembra semplicemente impostare il ritaglio in base ai valori che ho in ridimensionamento. Mi piacerebbe che venisse ritagliato in base alla dimensione della vista di immagini, che si trova in una cardview –

3

È necessario chiamare ridimensionare prima di chiamare centerCrop o centerInside() metodi altrimenti Picasso lamenta larghezza target/altezza essendo 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); 
} 
} 

Ed ecco l'ImageView definito all'interno di layout:

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

Ho effettivamente la visualizzazione di immagini all'interno di una vista di riciclaggio, , quindi getmeasuredwidth e height diventano 0 a onBindViewHolder. Come potrei ottenere la dimensione allora? grazie –

+3

@ Hamster criceto, forse troppo tardi, ma puoi usare '.fit()' di Picasso. Aspetta fino a "getMeasure" e poi al resto. – Nexen

1

CenterCrop() è una tecnica di ritaglio che ridimensiona l'immagine in modo da riempire i limiti richiesti dello ImageView e quindi ritaglia l'extra. Il ImageView verrà riempito completamente, ma l'intera immagine potrebbe non essere visualizzata.

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

CenterInside() è una tecnica che ritaglio dimensioni dell'immagine in modo che entrambe le dimensioni sono uguali o inferiori ai limiti richiesti del ImageView. L'immagine verrà visualizzata completamente, ma potrebbe non riempire l'intero ImageView.

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

Le opzioni discusse dovrebbero coprire le esigenze di funzionalità relative al ridimensionamento e al ridimensionamento delle immagini. C'è un'ultima funzionalità di supporto di Picasso, che può essere molto utile: fit().

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