如何以编程方式圆角设置随机背景颜色


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

我希望设置一个drawable,并且颜色会重叠,但是它们不会重叠。我执行的第二个是背景。

有什么方法可以通过编程方式创建此视图,同时要记住,背景颜色要等到运行时才能确定?

编辑:我现在只在红色和蓝色之间交换以进行测试。以后,用户可以选择颜色。

编辑:

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
Alex MDC

您可以显示更多代码吗?看起来不错,所以我想知道您可以使用某种listView还是重用现有的textview。
Chansuk

Answers:


210

代替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> 

完美回答!它也可以与strock一起使用,但是我们可以使用colorDrawable = resources.getDrawable(R.drawable.x_sd_circle)之类的方法来实现此功能吗?colorDrawable.setColorFilter(color,PorterDuff.Mode.SRC_ATOP); 如果我们没有边界。但是如果是边框,您可以让我知道PorterDuff.Mode,以便笔触颜色不会改变
Akhil Dad


2
如果“ v”是TextView,则v.getBackground()将转换为“ java.lang.ClassCastException:android.graphics.drawable.StateListDrawable无法转换为android.graphics.drawable.GradientDrawable”,这真的可以追溯到'13吗?
sonavolob '16

@sonavolob你是对的。它提供了ClassCastException
Adnan

完美的解决方案!谢谢!
Bot

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(corners); 它非常有用
umesh,2014年

14
考虑使用PaintDrawable代替GradientDrawable。它支持圆角和仅一种颜色,似乎比渐变更合适。
Cimlman

2
这很好!我在Xamarin中使用它。 var pd = new PaintDrawable(BackgroundColor); pd.SetCornerRadius(15); myView.Background = pd;
Pierre

不错的快速解决方案,但请注意,它要求API最低级别16
Unknown Dev

如何仅设置一侧的拐角半径?
匿名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)
}

仅供参考:(ShapeDrawable及其子类型PaintDrawable)使用默认的固有宽度和高度0。如果可绘制对象未出现在用例中,则可能必须手动设置尺寸:

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

-1是一个魔术常数,它指示Drawable没有自身的固有宽度和高度(Source)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.