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>

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> 

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.


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

9

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

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

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


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

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>



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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.