Cara membulatkan sudut secara terprogram dan mengatur warna latar belakang acak

114

Saya ingin membulatkan sudut pandang dan juga mengubah warna tampilan berdasarkan konten saat runtime.

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

Saya berharap pengaturan drawable dan warna akan tumpang tindih, tetapi ternyata tidak. Mana pun yang saya jalankan kedua adalah latar belakang yang dihasilkan.

Apakah ada cara untuk membuat tampilan ini secara terprogram, dengan mengingat bahwa warna latar belakang tidak akan ditentukan hingga waktu proses?

edit: Saya hanya beralih antara merah dan biru sekarang untuk pengujian. Nantinya warna akan bisa dipilih oleh pengguna.

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>
John Moffitt
sumber
Tentu saja warna background dan gambar background saling menimpa. Apa yang ingin Anda capai? Apa tags_rounded_corners?
Alex MDC
Bisakah Anda menunjukkan lebih banyak kode? Kelihatannya bagus, jadi saya ingin tahu Anda dapat menggunakan jenis listView, atau menggunakan kembali textview yang ada.
Chansuk

Jawaban:

211

Sebagai setBackgroundColorganti, ambil background drawable dan setel warnanya:

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

Selain itu, Anda dapat menentukan padding dalam 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> 
chiuki
sumber
Terima kasih! itu bekerja dengan strock juga, tetapi dapatkah kita membuatnya menggunakan sesuatu seperti colorDrawable = resources.getDrawable (R.drawable.x_sd_circle); colorDrawable.setColorFilter (color, PorterDuff.Mode.SRC_ATOP); jika kita tidak memiliki perbatasan. Tapi dalam kasus perbatasan, bisakah Anda memberi tahu saya PorterDuff.Mode sehingga warna guratan tidak akan berubah
Akhil Dad
Bagaimana cara menambahkan warna latar belakang juga melalui XML?
Lenin Raj Rajasekaran
2
Jika "v" adalah TextView, maka v.getBackground () akan mentransmisikan "java.lang.ClassCastException: android.graphics.drawable.StateListDrawable tidak dapat ditransmisikan ke android.graphics.drawable.GradientDrawable" Apakah ini benar-benar berfungsi pada tahun '13?
sonavolob
@avolay Anda benar. ini memberi ClassCastException
Adnan
Solusi yang tepat! Terima kasih!
Bot
124

Total pendekatan terprogram untuk menyetel sudut membulat dan menambahkan warna latar belakang acak ke Tampilan. Saya belum menguji kodenya, tetapi Anda mengerti.

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

Di sini kami menggunakan gradient drawable sehingga kami dapat menggunakannya GradientDrawable#setCornerRadiuskarena ShapeDrawableTIDAK menyediakan metode seperti itu.

JaydeepW
sumber
13
shape.setCornerRadii (sudut); ini sangat berguna
umesh
14
Pertimbangkan untuk menggunakan PaintDrawabledaripada GradientDrawable. Ini mendukung sudut membulat dan hanya satu warna yang tampaknya lebih sesuai daripada gradien.
Cimlman
2
Ini bekerja dengan baik! Saya menggunakannya di Xamarin. var pd = new PaintDrawable(BackgroundColor); pd.SetCornerRadius(15); myView.Background = pd;
Pierre
Solusi cepat yang bagus, tetapi perhatikan bahwa itu membutuhkan API Minimum Level 16
Pengembang Tidak Diketahui
bagaimana cara mengatur radius sudut hanya untuk satu sisi?
Anonim-E
10

Menurut saya cara tercepat untuk melakukannya adalah:

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);    
Nolesh
sumber
9

Anda bisa mencapainya lebih baik dengan menggunakan kelas DrawableCompat seperti ini:

Drawable backgroundDrawable = view.getBackground();             
DrawableCompat.setTint(backgroundDrawable, newColor);
Alécio Carvalho
sumber
5

Jika Anda tidak mengalami stroke, Anda dapat menggunakan

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

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

tapi ini juga akan mengubah warna guratan

Akhil Ayah
sumber
39
Saya akan menggunakan ini, tapi saya mengalami stroke.
Tim Malseed
2

Berikut ini contoh menggunakan ekstensi. Ini mengasumsikan tampilan memiliki lebar dan tinggi yang sama.

Perlu menggunakan listener perubahan tata letak untuk mendapatkan ukuran tampilan. Kemudian Anda bisa menyebutnya dengan tampilan seperti inimyView.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)
        }
    })
}
Markymark
sumber
1

Anda dapat mengubah warna item apa pun secara dinamis (tata letak, tampilan teks). Coba kode di bawah ini untuk mengatur warna secara terprogram dalam tata letak

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

buat layout_round.xml di folder drawable

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


passionatedevops
sumber
1

Menyalin komentar @ cimlman menjadi jawaban tingkat atas untuk visibilitas lebih:

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

FYI: ShapeDrawable(dan subjenisnya, PaintDrawable) menggunakan lebar dan tinggi intrinsik default 0. Jika drawable tidak muncul dalam usecase Anda, Anda mungkin harus menyetel dimensinya secara manual:

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

-1adalah konstanta ajaib yang menunjukkan bahwa Drawable tidak memiliki lebar dan tinggi intrinsiknya sendiri ( Sumber ).

Saket
sumber