studio rounded redondeados redondeadas programacion pro pantalla móviles esquinas desarrollo curso cornerfly corner bordes aplicaciones android bitmap border rounded-corners

android - rounded - pantalla esquinas redondeadas apk



Borde sobre un mapa de bits con esquinas redondeadas en Android (6)

¿Qué tal preparar una imagen de 9 parches como la de abajo y establecerla como fondo usando android:background

Utilicé el siguiente para hacer un mapa de bits con esquinas redondeadas. Ahora quiero dibujar una línea alrededor del mapa de bits.

private BitmapDrawable roundCornered(BitmapDrawable scaledBitmap, int i) { Bitmap bitmap = scaledBitmap.getBitmap(); result = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); canvas = new Canvas(result); color = 0xff424242; paint = new Paint(); rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); rectF = new RectF(rect); roundPx = i; paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(Color.BLUE); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); BitmapDrawable finalresult = new BitmapDrawable(result); return finalresult; }

Tengo la imagen de abajo, pero mi necesidad real es que debo dibujar un borde alrededor de la imagen.


Desafortunadamente, no hay un parámetro de "borde" agradable y limpio en Android, pero la forma más sencilla de hacerlo es encerrarlo dentro de otro diseño, establecer el fondo del diseño principal en su color de borde / dibujable y luego establecer un relleno en él. El relleno aparecerá alrededor de tu BitmapDrawable.


Hice muchas búsquedas para implementar ese efecto por código, antes de encontrar otra manera pero no es lo suficientemente perfecta, puedes ver el jaggy en cada esquina, establezco Paint.setAntiAlias ​​(true), Paint.setDither (true), Paint.setFilterBitmap (cierto), pero no funciona, así que espero que alguien pueda ayudarme.

RectF roundRect = new RectF(itemRect); Bitmap bitmap = scheme.getSchemeBitmap(getResources()); mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(mSchemeSelectedColor); canvas.drawRoundRect(roundRect, mSchemeCornerRadius, mSchemeCornerRadius, mPaint); roundRect.set(itemRect.left + mBorderSize, itemRect.top + mBorderSize, itemRect.right - mBorderSize, itemRect.bottom - mBorderSize); Path clipPath = new Path(); clipPath.addRoundRect(roundRect, mSchemeCornerRadius, mSchemeCornerRadius, Path.Direction.CW); canvas.save(Canvas.CLIP_SAVE_FLAG); canvas.clipPath(clipPath); canvas.drawBitmap(bitmap, null, roundRect, mPaint); canvas.restore();


Pongo lo siguiente juntos para mí.

public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int color, int cornerDips, int borderDips, Context context) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); final int borderSizePx = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, (float) borderDips, context.getResources().getDisplayMetrics()); final int cornerSizePx = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, (float) cornerDips, context.getResources().getDisplayMetrics()); final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(rect); // prepare canvas for transfer paint.setAntiAlias(true); paint.setColor(0xFFFFFFFF); paint.setStyle(Paint.Style.FILL); canvas.drawARGB(0, 0, 0, 0); canvas.drawRoundRect(rectF, cornerSizePx, cornerSizePx, paint); // draw bitmap paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); // draw border paint.setColor(color); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth((float) borderSizePx); canvas.drawRoundRect(rectF, cornerSizePx, cornerSizePx, paint); return output; }

Créditos, por supuesto, a http://ruibm.com/?p=184


Utilizo BitmapShader y drawRoundRect lo hago y me funciona, mira la captura de pantalla

RectF roundRect; // the Rect you have to draw into Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); // draw the border at bottom mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(mBorderColor); canvas.drawRoundRect(roundRect, mRadius, mRadius, mPaint); // ------------------ draw scheme bitmap roundRect.set(itemRect.left + mBorderSize, itemRect.top + mBorderSize, itemRect.right - mBorderSize, itemRect.bottom - mBorderSize); Shader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); mPaint.setShader(shader); canvas.drawRoundRect(roundRect, mRadius, mRadius, mPaint); mPaint.setShader(null);


mi manera:

public static Bitmap getRoundedCornerBitmap1(Bitmap bitmap, int color, int cornerDips, int borderDips) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth()+2*borderDips, bitmap.getHeight()+2*borderDips, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); canvas.drawColor(Color.TRANSPARENT); final RectF rectF = new RectF(0, 0, output.getWidth(), output.getHeight()); final Paint paint = new Paint(); // prepare canvas for transfer paint.setAntiAlias(true); paint.setStrokeWidth((float) borderDips); paint.setColor(Color.WHITE); paint.setStyle(Paint.Style.FILL); canvas.drawRoundRect(rectF, borderDips, borderDips, paint); canvas.drawBitmap(bitmap, borderDips, borderDips, null); bitmap.recycle(); return output; }

Resultado