2016-08-31 4 views
0

J'ai une méthode pour recadrer l'image pour encercler et fonctionne bien, mais j'ai besoin de type d'échelle pour centrer la culture ou le centre de l'image, mais ne fonctionne pas si je définis dans le fichier XML.Android Image Cercle de type recadré Ajouter échelle

En valeur xml = SCALE TYPE = CENTER_CROP OU SCALE_TYPE CENTRE
Ceci est mon bouton de classe:

public class CircleImage extends ImageView { 

public CircleImage(Context context) { 
    super(context); 
} 

public CircleImage(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

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

@Override 
protected void onDraw(Canvas canvas) { 

    Drawable drawable = getDrawable(); 

    if (drawable == null) { 
     return; 
    } 

    if (getWidth() == 0 || getHeight() == 0) { 
     return; 
    } 
    Bitmap b = ((BitmapDrawable) drawable).getBitmap(); 
    Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true); 

    int w = getWidth(), h = getHeight(); 

    Bitmap roundBitmap = getCroppedBitmap(bitmap, w); 
    canvas.drawBitmap(roundBitmap, 0, 0, null); 

} 

public static Bitmap getCroppedBitmap(Bitmap bmp, int radius) { 
    Bitmap sbmp; 

    if (bmp.getWidth() != radius || bmp.getHeight() != radius) { 
     float smallest = Math.min(bmp.getWidth(), bmp.getHeight()); 
     float factor = smallest/radius; 
     sbmp = Bitmap.createScaledBitmap(bmp, (int)(bmp.getWidth()/factor), (int)(bmp.getHeight()/factor), false); 
    } else { 
     sbmp = bmp; 
    } 

    Bitmap output = Bitmap.createBitmap(radius, radius, 
      Config.ARGB_8888); 
    Canvas canvas = new Canvas(output); 

    final int color = 0xffa19774; 
    final Paint paint = new Paint(); 
    final Rect rect = new Rect(0, 0, radius, radius); 

    paint.setAntiAlias(true); 
    paint.setFilterBitmap(true); 
    paint.setDither(true); 
    canvas.drawARGB(0, 0, 0, 0); 
    paint.setColor(Color.parseColor("#BAB399")); 
    canvas.drawCircle(radius/2 + 0.7f, 
      radius/2 + 0.7f, radius/2 + 0.1f, paint); 
    paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 
    canvas.drawBitmap(sbmp, rect, rect, paint); 

    return output; 
} 

} 

Répondre

0

Passer une classe complète et fixe pour l'image du cercle et le type d'échelle centre

public class CircleImage extends ImageView { 

public CircleImage(Context context) { 
    super(context); 
} 

public CircleImage(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

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

@Override 
protected void onDraw(Canvas canvas) { 

    Drawable drawable = getDrawable(); 

    if (drawable == null) { 
     return; 
    } 

    if (getWidth() == 0 || getHeight() == 0) { 
     return; 
    } 
    Bitmap b = ((BitmapDrawable) drawable).getBitmap(); 
    Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true); 

    int w = getWidth(), h = getHeight(); 

    Bitmap bm_scale_center_crop; 
    if (bitmap.getWidth() >= bitmap.getHeight()){ 

     bm_scale_center_crop = Bitmap.createBitmap(
       bitmap, 
       bitmap.getWidth()/2 - bitmap.getHeight()/2, 
       0, 
       bitmap.getHeight(), 
       bitmap.getHeight() 
     ); 

    }else{ 

     bm_scale_center_crop = Bitmap.createBitmap(
       bitmap, 
       0, 
       bitmap.getHeight()/2 - bitmap.getWidth()/2, 
       bitmap.getWidth(), 
       bitmap.getWidth() 
     ); 
    } 
    Bitmap roundBitmap = getCroppedBitmap(bitmap, w); 
    canvas.drawBitmap(roundBitmap, 0, 0, null); 

}