2014-09-26 6 views
6

Ich versuche ein Bild zuzuschneiden und dann die Ecken zu runden, so dass es besser auf dem Bildschirm erscheint.ImageView mit abgerundeten Ecken nach der Skalierung mit ScaleType.CenterCrop

Was konnte ich tun, ist um die Ecken des Bildes, aber das Zuschneiden wird manchmal die Seiten des Bildes abgeschnitten (abhängig von der Größe/Seitenverhältnis des Bildes).

Also, was ich tun möchte, ist die Ernte durchzuführen, dann wenden Sie die abgerundeten Ecken. Wie kann ich das machen?

Abrunden der Ecken des Bildes:

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; 
} 

Und dann stelle ich die Scaletype des Imageview etwa so: imageView.setScaleType(ScaleType.CENTER_CROP)

+0

Haben Sie eine Lösung gefunden? – enl8enmentnow

Antwort

4

Wenn Sie Ihre Bildansicht mit Cardview umhüllen, erreichen Sie.

<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

Dies ist eine ziemlich anständige Lösung! Beachten Sie, dass, wenn Sie nur abgerundete Ecken und keinen Schatten wünschen, "cardElevation" auf 0 setzen oder es weglassen soll. Außerdem würden Sie in den meisten Fällen "cardUseCompatPadding" wahrscheinlich weglassen (der Standardwert ist false). – Jonik

+0

Sehr einfache und effektive Lösung! Ich war verrückt nach komplexen Lösungen, bei denen das Seitenverhältnis nicht eingehalten wurde. Außerdem verwende ich einen 'cardCornerRadius', der die Hälfte der Layoutgröße für einen Kreiseffekt darstellt. –

1

versuchen Sie dieses:

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); 
    } 
} 

und

<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);