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

我希望圆滑视图的角落,并且在运行时根据内容更改视图的颜色。

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

我希望设置一个可绘制和颜色会重叠,但他们没有。我第二次执行的任何一个都是产生的背景。

有没有什么方法可以通过编程创建这个视图,记住背景颜色要到运行时才能决定?

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

编辑:

Tag _ round _ 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>
146663 次浏览

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

设置圆角和为视图添加随机背景色的总体编程方法。 我还没有测试过代码,但是你已经明白了。

 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没有提供任何这样的方法。

如果你没有中风,你可以使用

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


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

但这也会改变笔触的颜色

我认为最快的方法是:

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

你可以像这样使用 DrawableCompat来更好地实现它:

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

可以动态更改任何项目(布局、文本视图)的颜色。尝试以下代码在布局中以编程方式设置颜色

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


在可绘制文件夹中创建 lay _ 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>


Xml 文件中的布局

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


----other components---


</LinearLayout>




下面是一个使用扩展名的示例。 这假设视图具有相同的宽度和高度。

需要使用布局更改监听器来获取视图大小。 然后你可以像这样调用 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)
}
})
}

将@cimlman 的 评论复制到顶级答案中以获得更多可见性:

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

供参考: ShapeDrawable(及其子类型 PaintDrawable)使用默认的内部宽度和高度0。如果绘图工具没有出现在用例中,那么您可能需要手动设置尺寸:

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

-1是一个神奇的常量,它表示一个可绘制图形没有自己的固有宽度和高度(来源)。

因为问题已经得到了回答,但是我有一个小小的调整

GradientDrawable drawable = (GradientDrawable) ContextCompat.getDrawable(context, R.drawable.YOUR_DRAWABLE).mutate();

你可以改变角的半径:

drawable.setCornerRadius(YOUR_VALUE);

改变颜色:

drawable.setColor(Color.YOUR_COLOR);

可变的绘制对象保证不与任何其他绘制对象共享其状态。所以如果你改变半径而不使用 mutate () ,你很可能也会改变其他状态。它最适合于具体的观点。

最后别忘了设置可绘制的图形。

this.setBackground(drawable);
public static void setBackground(View v, int backgroundColor, int borderColor) {
GradientDrawable shape = new GradientDrawable();
shape.setShape(GradientDrawable.RECTANGLE);
shape.setCornerRadii(new float[] { 16, 16, 16, 16, 0, 0, 0, 0 });
shape.setColor(backgroundColor);
shape.setStroke(3, borderColor);
v.setBackground(shape);
}