2012-11-27 19 views
25

ho questa forma nella mia cartella drawable:Cambiare forma colore del bordo in fase di esecuzione

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <corners android:radius="5dp" /> 
    <solid android:color="#ffffff" /> 
    <stroke android:width="2dp" android:color="#B5B5B5"/> 
</shape> 

Questa definire un rettangolo con gli angoli arrotondati e posso applicarlo come sfondo per qualsiasi pannello in questo modo: Android: background = "@ drawable/round_corner_shape".

Ecco la domanda: ho pochi pannelli sulla mia applicazione, con la stessa forma dello sfondo, ma per ogni forma voglio un colore di bordo diverso (tratto). Non voglio creare 3 forme, l'unica differenza è sul colore del tratto. È possibile modificare in fase di esecuzione il valore della corsa?

+0

questo è qualcosa a cui pensare, buona domanda. +1 –

risposta

1

Ciao, puoi provare a creare il tuo background in runtime, quindi puoi cambiarlo quando vuoi.

RoundRectShape rect = new RoundRectShape(
    new float[] {30,30, 30,30, 30,30, 30,30}, 
    null, 
    null); 
ShapeDrawable bg = new ShapeDrawable(rect); 
bg.getPaint().setColor(0x99FFFFFF); 
view.setBackgroundDrawable(bg); 
+1

Ma nel tuo esempio non uso il mio codice xml esistente. Voglio definire una forma (raggio dell'angolo, sfondo, larghezza di stoke) in xml (o in altro modo, ma con tutti i parametri sopra) e cambiare solo il colore del tratto se ne ho bisogno. Questa era la domanda, se puoi aiutare. –

+1

ha funzionato per me. ma per copia e incolla lo scopo dovrebbe essere 'bg.getPaint(). setColor (0x99FFFFFF);' –

+2

colora lo sfondo, non il tratto. – lalitm

16

Ho avuto lo stesso problema. Nel mio caso, ho avuto un GridView, che gli elementi nella griglia potrebbero avere il colore del bordo cambiato dall'utente in fase di esecuzione.

Così, nel gridviewAdapter per quella griglia, ho fatto la seguente nel metodo GetView (quello che genera la vista per l'adattatore)

public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    convertView = inflater.inflate(R.layout.griditem, null); 
    GradientDrawable gradientDrawable = (GradientDrawable) convertView.getBackground(); 

    gradientDrawable.setStroke(2, mColor); 
    convertView.invalidate(); 
    return convertView; 
} 

mColor è un int che rappresenta il colore, molto simile facciamo nei file xml. Nel codice java, invece di "#" usiamo "0x" per definirlo nel formato AARRGGBB. Ad esempio, utilizzare 0xFF000000 per il nero opaco al 100% e 0xFF0000FF per il BLU opaco al 100%. Spiegando questo qui dato che google api 'utilmente' dice che il colore int è "il colore del tratto".

Questo ha risolto il mio problema ... Immagino che tu possa provare qualcosa di simile per il tuo caso.