Come arrotondare gli angoli a livello di programmazione e impostare colori di sfondo casuali


114

Vorrei arrotondare gli angoli di una vista e anche cambiare il colore della vista in base ai contenuti in fase di esecuzione.

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);

Speravo che l'impostazione di un disegno e il colore si sovrapponessero, ma non lo fanno. Qualunque sia il secondo che eseguo è lo sfondo risultante.

Esiste un modo per creare questa visualizzazione a livello di codice, tenendo presente che il colore di sfondo non verrà deciso fino al runtime?

modifica: sto solo passando dal rosso al blu ora per i test. Successivamente il colore potrà essere scelto dall'utente.

modificare:

tags_rounded_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>

Ovviamente il colore di sfondo e l'immagine di sfondo si sovrascrivono a vicenda. Cosa stai cercando di ottenere? Che cos'è tags_rounded_corners?
— Alex MDC

Potresti mostrare più codici? Sembra a posto, quindi mi chiedo che tu possa usare una sorta di listView o riutilizzare la visualizzazione di testo esistente.
— Chansuk

Risposte:


211

Invece di setBackgroundColorrecuperare lo sfondo disegnabile e impostarne il colore:

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);
}

Inoltre, puoi definire il riempimento all'interno del tuo 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 rispwe! ha funzionato anche con strock, ma possiamo farlo usando qualcosa come colorDrawable = resources.getDrawable (R.drawable.x_sd_circle); colorDrawable.setColorFilter (color, PorterDuff.Mode.SRC_ATOP); se non abbiamo un confine. Ma in caso di confine puoi farmi sapere il PorterDuff.Mode in modo che il colore del tratto non cambi
— Akhil Dad

Come aggiungere anche il colore di sfondo tramite XML?
— Lenin Raj Rajasekaran

2
Se "v" è TextView, v.getBackground () lancerà "java.lang.ClassCastException: android.graphics.drawable.StateListDrawable non può essere cast su android.graphics.drawable.GradientDrawable" Stava funzionando davvero nel '13?
— sonavolob

@sonavolob hai ragione. dà ClassCastException
— Adnan

La soluzione perfetta! Grazie!
— Bot

124

Approccio programmatico totale per impostare angoli arrotondati e aggiungere un colore di sfondo casuale a una vista. Non ho testato il codice, ma hai capito.

 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);

Qui stiamo usando il gradiente disegnabile in modo da poterlo utilizzare GradientDrawable#setCornerRadiusperché ShapeDrawableNON fornisce alcun metodo di questo tipo.


13
shape.setCornerRadii (angoli); è molto utile
— umesh

14
Considera di usare PaintDrawableinvece di GradientDrawable. Supporta angoli arrotondati e un solo colore che sembra essere più appropriato di un gradiente.
— Cimlman

2
Funziona bene! Lo uso in Xamarin. var pd = new PaintDrawable(BackgroundColor); pd.SetCornerRadius(15); myView.Background = pd;
— Pierre

Bella soluzione rapida, ma nota che richiede API di livello minimo 16
— The Unknown Dev

come impostare il raggio dell'angolo solo per un lato?
— Anonymous-E

10

Penso che il modo più veloce per farlo sia:

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

Se non hai un ictus puoi usare

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

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

ma questo cambierà anche il colore del tratto


39
Volevo usarlo, ma ho un ictus.
— Tim Malseed

2

Ecco un esempio che utilizza un'estensione. Ciò presuppone che la vista abbia la stessa larghezza e altezza.

È necessario utilizzare un listener di modifica del layout per ottenere le dimensioni della vista. Quindi puoi semplicemente chiamarlo su una vista come questamyView.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

Puoi cambiare dinamicamente il colore di qualsiasi elemento (layout, visualizzazione del testo). Prova il codice seguente per impostare il colore in modo programmatico nel layout

nel file 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));

crea layout_round.xml nella cartella disegnabile

<?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>

layout nel file 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

Copiare il commento di @ cimlman in una risposta di primo livello per una maggiore visibilità:

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

FYI: ShapeDrawable(e il suo sottotipo PaintDrawable) utilizza larghezza intrinseca e altezza predefinite di 0. Se il disegnabile non viene visualizzato nel tuo caso d'uso, potresti dover impostare le dimensioni manualmente:

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

-1è una costante magica che indica che un Drawable non ha larghezza e altezza intrinseche proprie ( Source ).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.