it-swarm.com.ru

Как программно закруглить углы и установить случайные цвета фона

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

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>
100
John Moffitt

Вместо 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> 
187
chiuki

Общий программный подход для установки закругленных углов и добавления случайного цвета фона в представление. Я не проверял код, но вы поняли идею.

 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 НЕ предоставляет такой метод.

106
JaydeepW

Я думаю, что самый быстрый способ сделать это:

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
Nolesh

Вы можете лучше достичь этого, используя DrawableCompat вот так:

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

Если у вас нет инсульта, вы можете использовать

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

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

но это также изменит цвет обводки

5
Akhil Dad