83

Chciałbym zaokrąglić rogi widoku, a także zmienić kolor widoku na podstawie zawartości w czasie wykonywania.Jak programowo zaokrąglić rogi i ustawić losowe kolory tła

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

Miałem nadzieję, że ustawiam możliwość losowania, a kolory będą się nakładać, ale nie. Niezależnie od tego, które wykonam drugie, jest wynikowe tło.

Czy istnieje sposób programowego utworzenia tego widoku, pamiętając, że kolor tła nie zostanie rozstrzygnięty do czasu wykonania?

edytuj: Zmieniam teraz tylko kolor czerwony i niebieski na testowanie. Później kolor będzie można wybrać przez użytkownika.

edit:

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> 
+0

Oczywiście kolor tła i obraz tła zastępują się nawzajem. Co próbujesz osiągnąć? Czym jest 'tags_rounded_corners'? –

+0

Czy możesz pokazać więcej kodów? Wygląda dobrze, więc zastanawiam się, czy możesz użyć rodzaju listView lub ponownego użycia istniejącego tekstu. – Chansuk

+0

Sprawdź to http://www.gadgetsaint.com/tips/rounded-corners-views-layouts-android/#.WPz2QVN97BI – ASP

Odpowiedz

148

Zamiast setBackgroundColor, odzyskać rozciągliwej tła i ustawić jego kolor:

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

Można także zdefiniować dopełnienie w swoim 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> 
+0

Perect answe! to działało również z paskiem, ale możemy to zrobić, używając czegoś w rodzaju colorDrawable = resources.getDrawable (R.drawable.x_sd_circle); colorDrawable.setColorFilter (color, PorterDuff.Mode.SRC_ATOP); jeśli nie mamy granicy. Ale w przypadku granicy możesz dać mi znać PorterDuff.Mode, aby kolor obrysu się nie zmienił –

+0

Jak dodać kolor tła również za pomocą XML? – emaillenin

+2

Jeśli "v" to TextView niż v.getBackground() będzie rzutować "java.lang.ClassCastException: android.graphics.drawable.StateListDrawable nie można przesłać do android.graphics.drawable.GradientDrawable" Czy to było naprawdę działa ponownie w '13 ? – sonavolob

86

Całkowite programowe podejście do ustawiania zaokrąglonych narożników i dodawania losowego koloru tła do widoku. Nie przetestowałem kodu, ale masz pomysł.

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

Tutaj używamy rozciągliwej gradientu tak, że możemy skorzystać z GradientDrawable#setCornerRadius ponieważ ShapeDrawable nie przewiduje takiej metody.

+11

shape.setCornerRadii (rogi); bardzo użyteczna – umesh

+0

super odpowiedź @jayadeepw –

+7

Rozważ użycie 'PaintDrawable' zamiast' GradientDrawable'. Obsługuje zaokrąglone rogi i tylko jeden kolor, który wydaje się bardziej odpowiedni niż gradient. – Cimlman

2

Jeśli nie udar można użyć

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

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

ale będzie to również zmienić kolor obrysu

+23

Chciałem go użyć, ale mam udar. –

7

myślę, że najszybszym sposobem na to jest:

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

You można go lepiej osiągnąć, używając do tego celu:

Drawable backgroundDrawable = view.getBackground();    
DrawableCompat.setTint(backgroundDrawable, newColor); 
Powiązane problemy