Cómo redondear esquinas mediante programación y establecer colores de fondo aleatorios


114

Me gustaría redondear las esquinas de una vista y también cambiar el color de la vista según el contenido en tiempo de ejecución.

TextView v = new TextView(context);
v.setText(tagsList.get(i));
if(i%2 == 0){
    v.setBackgroundColor(Color.RED);
}else{
    v.setBackgroundColor(Color.BLUE);
}

v.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
v.setPadding(twoDP, twoDP, twoDP, twoDP);               
v.setBackgroundResource(R.drawable.tags_rounded_corners);

Tenía la esperanza de establecer un dibujo y el color se superpondría, pero no es así. Cualquiera que ejecute en segundo lugar es el fondo resultante.

¿Hay alguna forma de crear esta vista mediante programación, teniendo en cuenta que el color de fondo no se decidirá hasta el tiempo de ejecución?

editar: solo estoy cambiando entre rojo y azul ahora para probar. Posteriormente, el usuario podrá elegir el color.

editar:

tags_unded_corners.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <corners 
         android:bottomRightRadius="2dp" 
         android:bottomLeftRadius="2dp" 
         android:topLeftRadius="2dp" 
         android:topRightRadius="2dp"/>
</shape>

Por supuesto, el color de fondo y la imagen de fondo se anulan entre sí. ¿Qué estás intentando lograr? ¿Qué es tags_rounded_corners?
Alex MDC

¿Podrías mostrar más códigos? Se ve bien, así que me pregunto si puede usar una especie de listView o reutilizar la vista de texto existente.
Chansuk

Respuestas:


211

En lugar de setBackgroundColor, recupere el fondo dibujable y establezca su color:

v.setBackgroundResource(R.drawable.tags_rounded_corners);

GradientDrawable drawable = (GradientDrawable) v.getBackground();
if (i % 2 == 0) {
  drawable.setColor(Color.RED);
} else {
  drawable.setColor(Color.BLUE);
}

Además, puede definir el relleno dentro de su tags_rounded_corners.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
  <corners android:radius="4dp" />
  <padding
    android:top="2dp"
    android:left="2dp"
    android:bottom="2dp"
    android:right="2dp" />
</shape> 

¡Perect respuesta! también funcionó con strock, pero ¿podemos hacer esto usando algo como colorDrawable = resources.getDrawable (R.drawable.x_sd_circle); colorDrawable.setColorFilter (color, PorterDuff.Mode.SRC_ATOP); si no tenemos frontera. Pero en caso de borde, ¿puede informarme el modo PorterDuff.Mode para que el color del trazo no cambie
Akhil Dad

¿Cómo agregar color de fondo también a través de XML?
Lenin Raj Rajasekaran

2
Si "v" es el TextView, entonces v.getBackground () emitirá "java.lang.ClassCastException: android.graphics.drawable.StateListDrawable no se puede convertir en android.graphics.drawable.GradientDrawable" ¿Realmente estaba funcionando en el '13?
sonavolob

@sonavolob tienes razón. da ClassCastException
Adnan

¡La solución perfecta! ¡Gracias!
Bot

124

Enfoque programático total para establecer esquinas redondeadas y agregar color de fondo aleatorio a una vista No he probado el código, pero entiendes la idea.

 GradientDrawable shape =  new GradientDrawable();
 shape.setCornerRadius( 8 );

 // add some color
 // You can add your random color generator here
 // and set color
 if (i % 2 == 0) {
  shape.setColor(Color.RED);
 } else {
  shape.setColor(Color.BLUE);
 }

 // now find your view and add background to it
 View view = (LinearLayout) findViewById( R.id.my_view );
 view.setBackground(shape);

Aquí estamos usando gradiente dibujable para que podamos usarlo GradientDrawable#setCornerRadiusporque ShapeDrawableNO proporciona ningún método de este tipo.


13
shape.setCornerRadii (esquinas); es muy útil
umesh

14
Considere usar en PaintDrawablelugar de GradientDrawable. Admite esquinas redondeadas y un solo color que parece ser más apropiado que un degradado.
Cimlman

2
¡Esto funciona bien! Lo uso en Xamarin. var pd = new PaintDrawable(BackgroundColor); pd.SetCornerRadius(15); myView.Background = pd;
Pierre

Buena solución rápida, pero tenga en cuenta que requiere un nivel mínimo de API 16
el desarrollador desconocido

¿Cómo establecer el radio de la esquina solo para un lado?
Anónimo-E

10

Creo que la forma más rápida de hacer esto es:

GradientDrawable gradientDrawable = new GradientDrawable(
            GradientDrawable.Orientation.TOP_BOTTOM, //set a gradient direction 
            new int[] {0xFF757775,0xFF151515}); //set the color of gradient
gradientDrawable.setCornerRadius(10f); //set corner radius

//Apply background to your view
View view = (RelativeLayout) findViewById( R.id.my_view );
if(Build.VERSION.SDK_INT>=16)
     view.setBackground(gradientDrawable);
else view.setBackgroundDrawable(gradientDrawable);    


5

Si no está sufriendo un derrame cerebral, puede usar

colorDrawable = resources.getDrawable(R.drawable.x_sd_circle); 

colorDrawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);

pero esto también cambiará el color del trazo


39
Iba a usar esto, pero estoy sufriendo un derrame cerebral.
Tim Malseed

2

Aquí tienes un ejemplo con una extensión. Esto supone que la vista tiene el mismo ancho y alto.

Necesita usar un oyente de cambio de diseño para obtener el tamaño de la vista. Entonces puedes llamar a esto en una vista como estamyView.setRoundedBackground(Color.WHITE)

fun View.setRoundedBackground(@ColorInt color: Int) {
    addOnLayoutChangeListener(object: View.OnLayoutChangeListener {
        override fun onLayoutChange(v: View?, left: Int, top: Int, right: Int, bottom: Int, oldLeft: Int, oldTop: Int, oldRight: Int, oldBottom: Int) {

            val shape = GradientDrawable()
            shape.cornerRadius = measuredHeight / 2f
            shape.setColor(color)

            background = shape

            removeOnLayoutChangeListener(this)
        }
    })
}

1

Puede cambiar dinámicamente el color de cualquier elemento (diseño, vista de texto). Pruebe el siguiente código para establecer el color mediante programación en el diseño

en el archivo activity.java


String quote_bg_color = "#FFC107"
quoteContainer= (LinearLayout)view.findViewById(R.id.id_quotecontainer);
quoteContainer.setBackgroundResource(R.drawable.layout_round);
GradientDrawable drawable = (GradientDrawable) quoteContainer.getBackground();
drawable.setColor(Color.parseColor(quote_bg_color));

crear layout_round.xml en la carpeta dibujable

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/colorPrimaryLight"/>
    <stroke android:width="0dp" android:color="#B1BCBE" />
    <corners android:radius="10dp"/>
    <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" />
</shape>

diseño en el archivo activity.xml

<LinearLayout
        android:id="@+id/id_quotecontainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

----other components---

</LinearLayout>


1

Copiando el comentario de @ cimlman en una respuesta de nivel superior para una mayor visibilidad:

PaintDrawable(Color.CYAN).apply {
  setCornerRadius(24f)
}

Para su información: ShapeDrawable(y su subtipo PaintDrawable) utiliza el ancho y alto intrínsecos predeterminados de 0. Si el elemento de diseño no aparece en su caso de uso, es posible que deba establecer las dimensiones manualmente:

PaintDrawable(Color.CYAN).apply {
  intrinsicWidth = -1
  intrinsicHeight = -1
  setCornerRadius(24f)
}

-1es una constante mágica que indica que un Drawable no tiene un ancho y alto intrínsecos propios ( Fuente ).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.