2014-09-26 17 views
6

Sto tentando di ritagliare un'immagine e quindi arrotondare gli angoli in modo che appaia più gradevolmente sullo schermo.ImageView con angoli arrotondati dopo il ridimensionamento con ScaleType.CenterCrop

Ciò che sono stato in grado di fare è arrotondare gli angoli dell'immagine, ma il taglio a volte taglierà i lati dell'immagine (a seconda delle dimensioni/proporzioni dell'immagine).

Quindi quello che mi piacerebbe fare è eseguire il ritaglio, POI applicare gli angoli arrotondati. Come posso fare questo?

A completare gli angoli dell'immagine:

private Bitmap getRoundedCornerBitmap(Bitmap bitmap) { 
    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); 
    Canvas canvas = new Canvas(output); 

    final int color = 0xff000000; 
    final Paint paint = new Paint(); 
    final Rect rect = new Rect(0,0,bitmap.getWidth(), bitmap.getHeight()); 
    final RectF rectF = new RectF(rect); 
    final float roundpx = 20; 

    paint.setAntiAlias(true); 
    canvas.drawARGB(0, 0, 0, 0); 
    paint.setColor(color); 
    canvas.drawRoundRect(rectF, roundpx, roundpx, paint); 

    paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 
    canvas.drawBitmap(bitmap, rect, rect, paint); 

    return output; 
} 

E poi ho impostato scaletype del imageview in questo modo: imageView.setScaleType(ScaleType.CENTER_CROP)

+0

Hai trovato una soluzione? – enl8enmentnow

risposta

4

se avvolgi la tua visualizzazione di immagini con cardview, lo raggiungi.

<android.support.v7.widget.CardView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    card_view:cardCornerRadius="4dp" 
    card_view:cardElevation="4dp" 
    card_view:cardUseCompatPadding="true"> 
     <ImageView 
      android:id="@+id/ivImage" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:src="@drawable/your_image" /> 
</android.support.v7.widget.CardView> 
+1

Questa è una soluzione abbastanza decente! Nota che se vuoi solo angoli arrotondati e nessuna ombra, imposta 'cardElevation' su 0 o lascialo fuori. Inoltre, nella maggior parte dei casi al giorno d'oggi, probabilmente lascerai fuori 'cardUseCompatPadding' (l'impostazione predefinita è false). – Jonik

+0

Soluzione molto semplice ed efficace! Stavo impazzendo con soluzioni complesse che non mantenevano le proporzioni. Inoltre, sto usando un 'cardCornerRadius' che è la metà delle dimensioni del layout per un effetto cerchio. –

1

provare questo:

public class RoundedImageView extends ImageView { 

private Path mMaskPath; 
private Paint mMaskPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
private int mCornerRadius = 10; 

public RoundedImageView(Context context) { 
    super(context); 

    init(); 
} 

public RoundedImageView(Context context, AttributeSet attributeSet) { 
    super(context, attributeSet); 

    init(); 
} 

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

    init(); 
} 

private void init() { 
    ViewCompat.setLayerType(this, ViewCompat.LAYER_TYPE_SOFTWARE, null); 
    mMaskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); 
} 


public void setCornerRadius(int cornerRadius) { 
    mCornerRadius = cornerRadius; 
    generateMaskPath(getWidth(), getHeight()); 
    invalidate(); 
} 

@Override 
protected void onSizeChanged(int w, int h, int oldW, int oldH) { 
    super.onSizeChanged(w, h, oldW, oldH); 

    if (w != oldW || h != oldH) { 
     generateMaskPath(w, h); 
    } 
} 

private void generateMaskPath(int w, int h) { 
    mMaskPath = new Path(); 
    mMaskPath.addRoundRect(new RectF(0,0,w,h), mCornerRadius, mCornerRadius, Path.Direction.CW); 
    mMaskPath.setFillType(Path.FillType.INVERSE_WINDING); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    if(canvas.isOpaque()) { // If canvas is opaque, make it transparent 
     canvas.saveLayerAlpha(0, 0, canvas.getWidth(), canvas.getHeight(), 255, Canvas.HAS_ALPHA_LAYER_SAVE_FLAG); 
    } 

    super.onDraw(canvas); 

    if(mMaskPath != null) { 
     canvas.drawPath(mMaskPath, mMaskPaint); 
    } 
} 

e

<your.pack.name.RoundedImageView 
      android:id="@+id/image_id" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:scaleType="centerCrop" /> 

RoundedImageView iconImage = (RoundedImageView)findViewById(R.id.image_id); 
iconImage.setImageBitmap(bitmap);