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.