我想围绕视图的角落,并在运行时根据内容更改视图的颜色。
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>
答案 0 :(得分:185)
而不是setBackgroundColor
,检索背景drawable并设置其颜色:
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>
答案 1 :(得分:106)
用于设置圆角并为视图添加随机背景颜色的总体编程方法。 我没有测试过代码,但是你明白了。
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);
这里我们使用渐变drawable,以便我们可以使用GradientDrawable#setCornerRadius
,因为ShapeDrawable
不提供任何此类方法。
答案 2 :(得分:8)
我认为最快的方法是:
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);
答案 3 :(得分:7)
您可以使用DrawableCompat这样更好地实现它:
Drawable backgroundDrawable = view.getBackground();
DrawableCompat.setTint(backgroundDrawable, newColor);
答案 4 :(得分:5)
如果您没有中风,可以使用
colorDrawable = resources.getDrawable(R.drawable.x_sd_circle);
colorDrawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
但这也会改变笔触颜色
答案 5 :(得分:2)
这是一个使用扩展名的示例。 假定视图具有相同的宽度和高度。
需要使用布局更改侦听器来获取视图大小。
然后,您可以在data() {
return {
pauseButton: {
text:'Pause'
},
isOpen: true
}
},
pauseTask: function() {
this.isOpen = !this.isOpen;
this.pauseButton.text = app.isOpen ? 'Pause' : 'Resume';
},
myView.setRoundedBackground(Color.WHITE)
答案 6 :(得分:2)
因为问题已经回答了。但我有一点调整
GradientDrawable drawable = (GradientDrawable) ContextCompat.getDrawable(context, R.drawable.YOUR_DRAWABLE).mutate();
您可以通过以下方式更改圆角半径:
drawable.setCornerRadius(YOUR_VALUE);
改变颜色:
drawable.setColor(Color.YOUR_COLOR);
一个可变的可绘制对象保证不与任何其他可绘制对象共享其状态。因此,如果您在不使用 mutate() 的情况下更改半径,您也可能会更改其他状态。最适合特定视图。
最后别忘了设置drawable。
this.setBackground(drawable);
答案 7 :(得分:1)
将@cimlman的comment复制到顶级答案中以提高可见度:
PaintDrawable(Color.CYAN).apply {
setCornerRadius(24f)
}
FYI:ShapeDrawable
(及其子类型,PaintDrawable
)使用默认的固有宽度和高度0。如果在用例中未显示drawable,则可能必须手动设置尺寸:
PaintDrawable(Color.CYAN).apply {
intrinsicWidth = -1
intrinsicHeight = -1
setCornerRadius(24f)
}
-1
是一个魔术常数,它指示Drawable没有自身的固有宽度和高度(Source)。
答案 8 :(得分:0)
您可以动态更改任何项目的颜色(布局,文本视图)。尝试下面的代码以编程方式在布局中设置颜色
在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>