Як програмувати круглі кути та встановлювати випадкові кольори фону


114

Я хотів би закруглити кути перегляду, а також змінити колір подання на основі вмісту під час виконання.

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

Я сподівався, що налаштування малюнка та кольору будуть перекриватися, але вони цього не роблять. Незалежно від того, хто з них я виконую другий, це результат.

Чи є якийсь спосіб програматично створити цей вид, враховуючи, що колір фону не буде вирішено до часу виконання?

редагувати: я зараз замінюю лише червоний на синій для тестування. Пізніше колір буде обраний користувачем.

редагувати:

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>

Звичайно, колір фону та фонове зображення переважають один одного. Чого ви намагаєтесь досягти? Що таке tags_rounded_corners?
Алекс МДЦ

Чи можете ви показати більше кодів? Це добре виглядає, тому мені цікаво, що ви можете використовувати вид listView або повторно використовувати існуючий перегляд тексту.
Чансук

Відповіді:


211

Замість цього setBackgroundColorвиберіть фон, який можна малювати, і встановіть його колір:

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

Крім того, ви можете визначити прокладки в межах вашого 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> 

Пряма відповідь! він також працював зі штрихом, але чи можемо ми зробити це, використовуючи щось на зразок colorDravable = resources.getDravable (R.dravable.x_sd_circle); colorDravable.setColorFilter (колір, PorterDuff.Mode.SRC_ATOP); якщо у нас немає кордону. Але у випадку кордону ви можете повідомити мені PorterDuff.Mode, щоб колір штриха не змінився
Ахіл Папа

Як додати колір фону також через XML?
Ленін Радж Раджасекаран

2
Якщо "v" - це TextView, ніж v.getBackground (), буде видати "java.lang.ClassCastException: android.graphics.dravable.StateListDravable не можна передавати на android.graphics.dravable.GradientDravable" Чи справді це працювало ще у 13 році?
sonavolob

@sonavolob ти маєш рацію. це дає ClassCastException
Аднан

Ідеальне рішення! Дякую!
Бот

124

Загальний програмний підхід для встановлення закруглених кутів та додавання до виду випадкового кольору фону. Я не перевіряв код, але ви розумієте.

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

Тут ми використовуємо градієнт, який можна намалювати, щоб ми могли використовувати його, GradientDrawable#setCornerRadiusоскільки ShapeDrawableНЕ надає жодного такого методу.


13
shape.setCornerRadii (куточки); її дуже корисно
umesh

14
Подумайте про використання PaintDrawableзамість GradientDrawable. Він підтримує закруглені кути і лише один колір, який здається більш доцільним, ніж градієнт.
Cimlman

2
Це добре працює! Я використовую його в Xamarin. var pd = new PaintDrawable(BackgroundColor); pd.SetCornerRadius(15); myView.Background = pd;
П’єр

Приємне швидке рішення, але зауважте, що для нього потрібен мінімальний рівень API 16
Невідомий Dev

як встановити радіус кута лише для однієї сторони?
Anonymous-E

10

Я думаю, що найшвидший спосіб зробити це:

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


5

Якщо у вас не спостерігається інсульт, ви можете скористатися

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

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

але це також змінить колір штриху


39
Я збирався скористатися цим, але у мене інсульт.
Тім Мальсід,

2

Ось приклад використання розширення. Це передбачає, що вид має однакову ширину та висоту.

Щоб отримати розмір перегляду, потрібно скористатися слухачем зміни макета. Тоді ви можете просто зателефонувати цьому на такий видmyView.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

Ви можете динамічно змінювати колір будь-яких елементів (макет, перегляд тексту). Спробуйте нижче коду, щоб встановити колір програмно в макеті

у файлі 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));

створити layout_round.xml у папці, що виводиться

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

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

----other components---

</LinearLayout>


1

Копіювання коментаря @ cimlman у відповідь верхнього рівня для більшої наочності:

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

FYI: ShapeDrawable(та його підтип PaintDrawable) використовує внутрішню ширину та висоту за замовчуванням. Якщо малюнок не відображається у вашому користувальницькому шафі, можливо, доведеться встановити параметри вручну:

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

-1- це магічна константа, яка вказує, що Dravable не має власної ширини та висоти ( джерело )

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.