Köşeleri programlı olarak yuvarlama ve rastgele arka plan renkleri ayarlama


114

Bir görünümün köşelerini yuvarlamak ve ayrıca çalışma zamanında içeriğe bağlı olarak görünümün rengini değiştirmek istiyorum.

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

Bir çizilebilir ve rengin örtüşeceğini umuyordum, ama olmuyorlar. Hangisini ikinci yürütürsem, ortaya çıkan arka plan.

Arka plan rengine çalışma zamanına kadar karar verilmeyeceğini göz önünde bulundurarak bu görünümü programlı olarak oluşturmanın herhangi bir yolu var mı?

edit: Test için şimdi sadece kırmızı ve mavi arasında değiş tokuş yapıyorum. Daha sonra renk kullanıcı tarafından seçilebilir olacaktır.

Düzenle:

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>

Elbette arka plan rengi ve arka plan görüntüsü birbirini geçersiz kılar. Ne elde etmeye çalışıyorsun Nedir tags_rounded_corners?
Alex MDC

Daha fazla kod gösterebilir misin? İyi görünüyor, bu yüzden bir çeşit listView kullanabileceğinizi veya mevcut metin görünümünü yeniden kullanabileceğinizi merak ediyorum.
Chansuk

Yanıtlar:


211

Bunun yerine setBackgroundColor, arka plan çekilebilirini alın ve rengini ayarlayın:

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

Ayrıca, dolguyu şunlarınızda tanımlayabilirsiniz 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 cevap! strock ile de çalıştı, ancak bunu colorDrawable = resources.getDrawable (R.drawable.x_sd_circle) gibi bir şey kullanarak yapabilir miyiz; colorDrawable.setColorFilter (renk, PorterDuff.Mode.SRC_ATOP); sınırımız yoksa. Ancak kenarlık durumunda, kontur renginin değişmemesi için bana PorterDuff Modunu bildirebilir misin?
Akhil Dad

XML ile arka plan rengi nasıl eklenir?
Lenin Raj Rajasekaran

2
V.getBackground () yerine "v" TextView ise "java.lang.ClassCastException: android.graphics.drawable.StateListDrawable android.graphics.drawable.GradientDrawable" dosyasına dönüştürülemez Bu gerçekten '13'te çalışıyor muydu?
sonavolob

@sonavolob haklısın. ClassCastException verir
Adnan

Mükemmel çözüm! Teşekkür ederim!
Bot

124

Yuvarlatılmış köşeler ayarlamak ve bir Görünüme rastgele arka plan rengi eklemek için tam programlı yaklaşım. Kodu test etmedim ama anladınız.

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

Burada, yararlanabilmemiz için gradyan çekilebilir kullanıyoruz GradientDrawable#setCornerRadiusçünkü ShapeDrawableböyle bir yöntem SUNMAZ.


13
shape.setCornerRadii (köşe); çok kullanışlı
umesh

14
PaintDrawableBunun yerine kullanmayı düşünün GradientDrawable. Yuvarlatılmış köşeleri ve bir degradeden daha uygun görünen tek bir rengi destekler.
Cimlman

2
Bu iyi çalışıyor! Xamarin'de kullanıyorum. var pd = new PaintDrawable(BackgroundColor); pd.SetCornerRadius(15); myView.Background = pd;
Pierre

API Asgari Seviye 16 gerektirdiğini güzel hızlı çözüm, ancak not
Tanınmayan Dev

sadece bir taraf için köşe yarıçapı nasıl ayarlanır?
Anonymous-E

10

Bence bunu yapmanın en hızlı yolu:

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

9

DrawableCompat'ı şu şekilde kullanarak daha iyi başarabilirsiniz :

Drawable backgroundDrawable = view.getBackground();             
DrawableCompat.setTint(backgroundDrawable, newColor);

5

İnme geçirmiyorsanız kullanabilirsiniz

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

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

ancak bu aynı zamanda kontur rengini de değiştirecek


39
Bunu kullanacaktım ama felç geçiriyorum.
Tim Malseed

2

İşte bir uzantı kullanan bir örnek. Bu, görünümün aynı genişliğe ve yüksekliğe sahip olduğunu varsayar.

Görünüm boyutunu almak için bir düzen değişikliği dinleyicisi kullanmanız gerekir. O zaman buna böyle bir görünümde diyebilirsinmyView.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

Herhangi bir öğenin rengini dinamik olarak değiştirebilirsiniz (düzen, metin görünümü). Düzende programlı olarak renk ayarlamak için aşağıdaki kodu deneyin

Activity.java dosyasında


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

çekilebilir klasörde layout_round.xml oluştur

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

Activity.xml dosyasındaki düzen

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

----other components---

</LinearLayout>


1

Daha fazla görünürlük için @ cimlman'ın yorumunu üst düzey bir cevaba kopyalamak :

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

Bilginize: ShapeDrawable(ve alt türü PaintDrawable) varsayılan iç genişlik ve yükseklik olarak 0'ı kullanır. Çekilebilir, kullanım durumunuzda görünmezse boyutları manuel olarak ayarlamanız gerekebilir:

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

-1Çekilebilir bir genişliğin ve kendi yüksekliğinin ( Kaynak ) olmadığını gösteren sihirli bir sabittir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.