Mapa de bits en ImageView con esquinas redondeadas

Tengo un ImageView y quiero hacerlo con rounded corners .

Yo uso esto:

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="@null"/> <stroke android:width="1dp" android:color="#ff000000"/> <corners android:radius="62px"/> </shape> 

Y establecer este código como fondo de mi imagen. Funciona, pero la imagen src que pongo en el ImageView está saliendo de las fronteras y no se adapta a la nueva forma.

¿Cómo puedo solucionar el problema?

Pruebe este

 public class CustomImageView extends ImageView { public static float radius = 18.0f; public CustomImageView(Context context) { super(context); } public CustomImageView(Context context, AttributeSet attrs) { super(context, attrs); } public CustomImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onDraw(Canvas canvas) { //float radius = 36.0f; Path clipPath = new Path(); RectF rect = new RectF(0, 0, this.getWidth(), this.getHeight()); clipPath.addRoundRect(rect, radius, radius, Path.Direction.CW); canvas.clipPath(clipPath); super.onDraw(canvas); } } 

y

 <your.pack.name.CustomImageView android:id="@+id/selectIcon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:scaleType="centerCrop" /> CustomImageView iconImage = (CustomImageView )findViewById(R.id.selectIcon); iconImage.setImageBitmap(bitmap); 

o,

 ImageView iv= new CustomImageView(this); iv.setImageResource(R.drawable.pic); 

Hacer una función que redondee a su mapa de bits utilizando lienzo.

 public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int pixels) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap .getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; 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 = pixels; 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; } 

Para más información:> aquí

Es extraño que nadie aquí haya mencionado RoundedBitmapDrawable de Android Support Library v4. Para mí es la forma más sencilla de obtener esquinas redondeadas sin fronteras. He aquí un ejemplo de uso:

 RoundedBitmapDrawable roundedBitmapDrawable = RoundedBitmapDrawableFactory.create(getResources(), bitmap); final float roundPx = (float) bitmap.getWidth() * 0.06f; roundedBitmapDrawable.setCornerRadius(roundPx); 

La respuesta aceptada utiliza el recorte de ruta de acceso, pero no admite el suavizado. Ver comentarios de Romain Guy sobre su puesto. "El recorte de ruta no admite el antialiasing y obtiene bordes dentados."

http://www.curious-creature.com/2012/12/11/android-recipe-1-image-with-rounded-corners/

Hay una buena biblioteca (vinc3m1's RoundedImageView) que supone esquinas redondeadas en ImageView, pero sólo admite los mismos radios en cada esquina. Así que hice uno que puede establecer diferentes radios en cada esquina.

No se basa en el recorte de trayectoria ni en el redibujo. Sólo dibuja una vez con el método canvas.drawPath() . Así que finalmente conseguí el resultado que quería como a continuación.

Introduzca aquí la descripción de la imagen

Consulte: https://github.com/pungrue26/SelectableRoundedImageView

Si usted necesita la frontera también entonces usted puede utilizar una imagen redondeada del rectángulo con el cuerpo transparente y blanco de hacia fuera side.For ejemplo:

Caja redondeada

Y utilizar esto con la imagen de destino como a continuación:

 <FrameLayout android:layout_width="100px" android:layout_height="100px" > <ImageView android:id="@+id/targetImage" android:layout_width="100px" android:layout_height="100px" android:src="@drawable/app_icon" android:layout_gravity="center" /> <ImageView android:id="@+id/boxImage" android:layout_width="fill_parent" android:layout_height="fill_parent" android:scaleType="fitXY" android:src="@drawable/box" /> 

¡Gracias!

Si necesitas hacer Bitmap con radios de esquina diferentes y te recomiendo seguir el código:

 private static Bitmap createRoundedRectBitmap(@NonNull Bitmap bitmap, float topLeftCorner, float topRightCorner, float bottomRightCorner, float bottomLeftCorner) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = Color.WHITE; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(rect); Path path = new Path(); float[] radii = new float[]{ topLeftCorner, bottomLeftCorner, topRightCorner, topRightCorner, bottomRightCorner, bottomRightCorner, bottomLeftCorner, bottomLeftCorner }; paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); path.addRoundRect(rectF, radii, Path.Direction.CW); canvas.drawPath(path, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } 

El método para hacer esquinas redondeadas para imageview en android no es chicos de ciencia de cohetes! Sólo tiene que utilizar un png con las curvas requeridas con el mismo color que su fondo y establecer la superposición de FITXY.!

 public class RoundedImageView extends ImageView { public RoundedImageView(Context context) { super(context); } public RoundedImageView(Context context, AttributeSet attrs) { super(context, attrs); } public RoundedImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Bitmap rounder = Bitmap.createBitmap(getWidth(),getHeight(),Bitmap.Config.ARGB_8888); Canvas canvasRound = new Canvas(rounder); Paint xferPaint = new Paint(Paint.ANTI_ALIAS_FLAG); xferPaint.setColor(Color.BLACK); final int rx = this.getWidth(); //our x radius final int ry = this.getHeight(); //our y radius canvasRound.drawRoundRect(new RectF(0,0,rx,ry), rx, ry, xferPaint); xferPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); canvas.drawBitmap(rounder, 0, 0, xferPaint); } } 
 public void drawRoundImage(boolean isEditPicEnable){ if(originalImageBitmap != null){ setBackgroundResource(R.drawable.ic_account_user_outer_circle_blue); if (isEditPicEnable) { setBackgroundResource(R.drawable.ic_account_user_outer_circle_white); Bitmap mask = BitmapFactory.decodeResource(getResources(), R.drawable.ic_account_white_mask); Bitmap mask1 = BitmapFactory.decodeResource(getResources(), R.drawable.ic_account_pencil_bg); originalImageBitmap = Bitmap.createScaledBitmap(originalImageBitmap, mask.getWidth(), mask.getHeight(), true); Bitmap result = Bitmap.createBitmap(mask.getWidth(), mask.getHeight(), Bitmap.Config.ARGB_8888); Canvas mCanvas = new Canvas(result); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); mCanvas.drawBitmap(originalImageBitmap, 0, 0, null); mCanvas.drawBitmap(mask, 0, 0, paint); mCanvas.drawBitmap(mask1, 0, 0, null); Bitmap mask2 = BitmapFactory.decodeResource(getResources(), R.drawable.ic_account_pencil); mCanvas.drawBitmap(mask2, 0, 0, null); setImageBitmap(result); setScaleType(ScaleType.FIT_XY); } else { Bitmap mask = BitmapFactory.decodeResource(getResources(),R.drawable.ic_account_white_mask); originalImageBitmap = Bitmap.createScaledBitmap(originalImageBitmap, mask.getWidth(),mask.getHeight(), true); Bitmap result = Bitmap.createBitmap(mask.getWidth(), mask.getHeight(),Bitmap.Config.ARGB_8888); Canvas mCanvas = new Canvas(result); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); mCanvas.drawBitmap(originalImageBitmap, 0, 0, null); mCanvas.drawBitmap(mask, 0, 0, paint); paint.setXfermode(null); setImageBitmap(result); setScaleType(ScaleType.FIT_XY); } }else{ setBackgroundResource(R.drawable.ic_account_user_outer_circle_blue); setImageResource(R.drawable.my_ac_default_profile_pic); } } 
  • Cómo teñir un mapa de bits de Android en blanco?
  • Combinación de 2 imágenes superpuestas
  • Cómo convertir un mapa de bits en Drawable en android?
  • ¿Cómo cargar imágenes grandes en Android y evitar el error de memoria?
  • Crear Bitmap de byteArray en android
  • Fábrica de mapas de bits de Android sin memoria Segunda foto
  • La compresión de mapa de bits no cambia el tamaño de byte de mapa de bits
  • Cómo obtener Bitmap de MapView desde Android Google Maps API V2
  • PackageManager.getApplicationIcon () devolver el icono predeterminado?
  • Java.lang.OutOfMemoryError al intentar cargar un mapa de bits en imageView
  • Recorte de mapa de bits
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.