studio redondo redondeados redondeadas poner esquinas edittext como botones bordes bordear borde android android-layout android-view android-shape

redondo - esquinas redondeadas android studio



¿Cómo hacer una vista con esquinas redondeadas? (16)

Cree un archivo xml debajo de su carpeta dibujable con el siguiente código. (El nombre del archivo que creé es rounded_corner.xml)

rounded_corner.xml

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <!-- view background color --> <solid android:color="#a9c5ac" > </solid> <!-- view border color and width --> <stroke android:width="3dp" android:color="#1c1b20" > </stroke> <!-- If you want to add some padding --> <padding android:left="4dp" android:top="4dp" android:right="4dp" android:bottom="4dp" > </padding> <!-- Here is the corner radius --> <corners android:radius="10dp" > </corners> </shape>

Y mantenga este dibujo como fondo para la vista en la que desea mantener el borde de la esquina redondeada. Vamos a mantenerlo para un diseño lineal

<LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/rounded_corner" android:layout_centerInParent="true"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Hi, This layout has rounded corner borders ..." android:gravity="center" android:padding="5dp"/> </LinearLayout>

Estoy tratando de hacer una vista en Android con bordes redondeados. La solución que encontré hasta ahora es definir una forma con esquinas redondeadas y usarla como fondo de esa vista.

Esto es lo que hice, definí un dibujable como se muestra a continuación:

<padding android:top="2dp" android:bottom="2dp"/> <corners android:bottomRightRadius="20dp" android:bottomLeftRadius="20dp" android:topLeftRadius="20dp" android:topRightRadius="20dp"/>

Ahora usé esto como fondo para mi diseño de la siguiente manera:

<LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_marginBottom="10dp" android:clipChildren="true" android:background="@drawable/rounded_corner">

Esto funciona perfectamente bien, puedo ver que la vista tiene bordes redondeados.

Pero mi diseño tiene muchas otras vistas secundarias, digamos un ImageView o un MapView . Cuando ImageView un ImageView dentro del diseño anterior, las esquinas de la imagen no se recortan / recortan, sino que aparecen llenas.

He visto otras soluciones para que funcione como el explicado here .

¿Pero hay un método para establecer esquinas redondeadas para una vista y todas sus vistas secundarias están contenidas dentro de esa vista principal que tiene esquinas redondeadas?


Cree un archivo xml llamado round.xml en la carpeta round.xml y pegue este contenido:

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="#FFFFFF" /> <stroke android:width=".05dp" android:color="#d2d2d2" /> <corners android:topLeftRadius="5dp" android:topRightRadius="5dp" android:bottomRightRadius="5dp" android:bottomLeftRadius="5dp"/> </shape>

luego use round.xml como background para cualquier elemento. Entonces te dará esquinas redondeadas.


Diferencia de la respuesta de Jaap van Hengstum:

  1. Utilice BitmapShader en lugar de máscara de mapa de bits.
  2. Crear mapa de bits solo una vez.

public class RoundedFrameLayout extends FrameLayout { private Bitmap mOffscreenBitmap; private Canvas mOffscreenCanvas; private BitmapShader mBitmapShader; private Paint mPaint; private RectF mRectF; public RoundedFrameLayout(Context context) { super(context); init(); } public RoundedFrameLayout(Context context, AttributeSet attrs) { super(context, attrs); init(); } public RoundedFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { setWillNotDraw(false); } @Override public void draw(Canvas canvas) { if (mOffscreenBitmap == null) { mOffscreenBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888); mOffscreenCanvas = new Canvas(mOffscreenBitmap); mBitmapShader = new BitmapShader(mOffscreenBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setShader(mBitmapShader); mRectF = new RectF(0f, 0f, canvas.getWidth(), canvas.getHeight()); } super.draw(mOffscreenCanvas); canvas.drawRoundRect(mRectF, 8, 8, mPaint); } }


El enlace del tutorial que proporcionó parece sugerir que necesita establecer las propiedades layout_width y layout_height de sus elementos secundarios en match_parent.

<ImageView android:layout_width="match_parent" android:layout_height="match_parent">


En Android L podrás usar View.setClipToOutline para obtener ese efecto. En versiones anteriores no hay forma de recortar el contenido de un ViewGroup aleatorio en una determinada forma.

Tendrá que pensar en algo que le dé un efecto similar:

  • Si solo necesita esquinas redondeadas en ImageView, puede usar un sombreador para ''pintar'' la imagen sobre la forma que está usando como fondo. Eche un vistazo a esta biblioteca para ver un ejemplo.

  • Si realmente necesita que todos los niños sean recortados, ¿tal vez pueda ver otra vez su diseño? ¿Uno con un fondo de cualquier color que esté usando y un ''agujero'' redondo en el medio? En realidad, podría crear un ViewGroup personalizado que dibuje esa forma sobre cada elemento secundario anulando el método onDraw.


O puede usar un android.support.v7.widget.CardView manera:

<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:layout_width="wrap_content" android:layout_height="wrap_content" card_view:cardBackgroundColor="@color/white" card_view:cardCornerRadius="4dp"> <!--YOUR CONTENT--> </android.support.v7.widget.CardView>


Otro enfoque es crear una clase de diseño personalizada como la siguiente. Este diseño primero dibuja su contenido en un mapa de bits fuera de pantalla, enmascara el mapa de bits fuera de pantalla con un rect redondeado y luego dibuja el mapa de bits fuera de pantalla en el lienzo real.

Lo probé y parece funcionar (al menos para mi caso de prueba simple). Por supuesto, afectará el rendimiento en comparación con un diseño normal.

package com.example; import android.content.Context; import android.graphics.*; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.TypedValue; import android.widget.FrameLayout; public class RoundedCornerLayout extends FrameLayout { private final static float CORNER_RADIUS = 40.0f; private Bitmap maskBitmap; private Paint paint, maskPaint; private float cornerRadius; public RoundedCornerLayout(Context context) { super(context); init(context, null, 0); } public RoundedCornerLayout(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs, 0); } public RoundedCornerLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context, attrs, defStyle); } private void init(Context context, AttributeSet attrs, int defStyle) { DisplayMetrics metrics = context.getResources().getDisplayMetrics(); cornerRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, CORNER_RADIUS, metrics); paint = new Paint(Paint.ANTI_ALIAS_FLAG); maskPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); setWillNotDraw(false); } @Override public void draw(Canvas canvas) { Bitmap offscreenBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888); Canvas offscreenCanvas = new Canvas(offscreenBitmap); super.draw(offscreenCanvas); if (maskBitmap == null) { maskBitmap = createMask(canvas.getWidth(), canvas.getHeight()); } offscreenCanvas.drawBitmap(maskBitmap, 0f, 0f, maskPaint); canvas.drawBitmap(offscreenBitmap, 0f, 0f, paint); } private Bitmap createMask(int width, int height) { Bitmap mask = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8); Canvas canvas = new Canvas(mask); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.WHITE); canvas.drawRect(0, 0, width, height, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); canvas.drawRoundRect(new RectF(0, 0, width, height), cornerRadius, cornerRadius, paint); return mask; } }

Use esto como un diseño normal:

<com.example.RoundedCornerLayout android:layout_width="200dp" android:layout_height="200dp"> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/test"/> <View android:layout_width="match_parent" android:layout_height="100dp" android:background="#ff0000" /> </com.example.RoundedCornerLayout>


Si tiene problemas al agregar oyentes táctiles al diseño. Utilice este diseño como diseño principal.

import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.graphics.RectF; import android.graphics.Region; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.View; import android.widget.FrameLayout; public class RoundedCornerLayout extends FrameLayout { private final static float CORNER_RADIUS = 6.0f; private float cornerRadius; public RoundedCornerLayout(Context context) { super(context); init(context, null, 0); } public RoundedCornerLayout(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs, 0); } public RoundedCornerLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context, attrs, defStyle); } private void init(Context context, AttributeSet attrs, int defStyle) { DisplayMetrics metrics = context.getResources().getDisplayMetrics(); cornerRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, CORNER_RADIUS, metrics); setLayerType(View.LAYER_TYPE_SOFTWARE, null); } @Override protected void dispatchDraw(Canvas canvas) { int count = canvas.save(); final Path path = new Path(); path.addRoundRect(new RectF(0, 0, canvas.getWidth(), canvas.getHeight()), cornerRadius, cornerRadius, Path.Direction.CW); canvas.clipPath(path, Region.Op.REPLACE); canvas.clipPath(path); super.dispatchDraw(canvas); canvas.restoreToCount(count); } }

como

<?xml version="1.0" encoding="utf-8"?> <com.example.view.RoundedCornerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:id="@+id/patentItem" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingRight="20dp"> ... your child goes here </RelativeLayout> </com.example.view.RoundedCornerLayout>


Use la forma en xml con rectángulo.Ajuste la propiedad del radio inferior o superior como desee.A continuación, aplique ese xml como fondo para su vista ... o ... use gradientes para hacerlo desde el código.


pruebe esta propiedad con su diseño lineal, ayudará
herramientas: context = ". youractivity"


shape.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="#f6eef1" /> <stroke android:width="2dp" android:color="#000000" /> <padding android:bottom="5dp" android:left="5dp" android:right="5dp" android:top="5dp" /> <corners android:radius="5dp" /> </shape>

y dentro de ti diseño

<LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_marginBottom="10dp" android:clipChildren="true" android:background="@drawable/shape"> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/your image" android:background="@drawable/shape"> </LinearLayout>


siga este tutorial y toda la discusión debajo de él : http://www.curious-creature.org/2012/12/11/android-recipe-1-image-with-rounded-corners/ round - http://www.curious-creature.org/2012/12/11/android-recipe-1-image-with-rounded-corners/

De acuerdo con esta publicación escrita por Guy Romain, uno de los principales desarrolladores de todo el kit de herramientas de la interfaz de usuario de Android, es posible hacer un contenedor (y todas las vistas de su hijo) con esquinas redondeadas, pero explicó que es demasiado costoso (por las actuaciones de problemas de representación).

Le recomendaré que vaya de acuerdo con su publicación, y si desea esquinas redondeadas, implemente ImageView esquinas redondeadas de acuerdo con esta publicación. luego, puede colocarlo dentro de un contenedor con cualquier fondo, y obtendrá el efecto que desee.

eso es lo que hice también también eventualmente.


La respuesta de Jaap van Hengstum funciona muy bien, sin embargo, creo que es costosa y si aplicamos este método en un botón, por ejemplo, el efecto táctil se pierde ya que la vista se representa como un mapa de bits.

Para mí, el mejor método y el más simple consiste en aplicar una máscara en la vista, así:

@Override protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) { super.onSizeChanged(width, height, oldWidth, oldHeight); float cornerRadius = <whatever_you_want>; this.path = new Path(); this.path.addRoundRect(new RectF(0, 0, width, height), cornerRadius, cornerRadius, Path.Direction.CW); } @Override protected void dispatchDraw(Canvas canvas) { if (this.path != null) { canvas.clipPath(this.path); } super.dispatchDraw(canvas); }


CardView funcionó para mí en API 27 en Android Studio 3.0.1. Se colorPrimary referencia al res/values/colors.xml archivo res/values/colors.xml y es solo un ejemplo. Para el layout_width de 0dp , se extenderá al ancho del padre. Tendrá que configurar las restricciones y el ancho / alto según sus necesidades.

<android.support.v7.widget.CardView android:id="@+id/cardView" android:layout_width="0dp" android:layout_height="200dp" android:layout_marginEnd="8dp" android:layout_marginStart="8dp" android:layout_marginTop="8dp" app:cardCornerRadius="4dp" app:cardBackgroundColor="@color/colorPrimary"> <!-- put your content here --> </android.support.v7.widget.CardView>


public class RoundedCornerLayout extends FrameLayout { private double mCornerRadius; public RoundedCornerLayout(Context context) { this(context, null, 0); } public RoundedCornerLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } public RoundedCornerLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context, attrs, defStyle); } private void init(Context context, AttributeSet attrs, int defStyle) { DisplayMetrics metrics = context.getResources().getDisplayMetrics(); setLayerType(View.LAYER_TYPE_SOFTWARE, null); } public double getCornerRadius() { return mCornerRadius; } public void setCornerRadius(double cornerRadius) { mCornerRadius = cornerRadius; } @Override public void draw(Canvas canvas) { int count = canvas.save(); final Path path = new Path(); path.addRoundRect(new RectF(0, 0, canvas.getWidth(), canvas.getHeight()), (float) mCornerRadius, (float) mCornerRadius, Path.Direction.CW); canvas.clipPath(path, Region.Op.REPLACE); canvas.clipPath(path); super.draw(canvas); canvas.restoreToCount(count); } }


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