在应用程序运行时,是否可以在Java代码中更改矩形(以xml绘制)颜色?
我的rectangle.xml:
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/listview_background_shape">
<stroke android:width="2dp" android:color="#ffffff" />
<padding android:left="20dp"
android:top="20dp"
android:right="20dp"
android:bottom="20dp" />
<solid android:color="#006600" />
</shape>
在main.xml中绘制:
<View
android:id="@+id/myRectangleView"
android:layout_width="wrap_content"
android:layout_height="100dp"
android:background="@drawable/rectangle"/>
我试过这种方式:
GradientDrawable sd;
View viewrectangle;
viewrectangle = (View) findViewById(R.id.myRectangleView);
sd = (GradientDrawable) viewrectangle.getBackground();
sd.setColor(0xffffff00);
sd.invalidateSelf();
只有当我把它放在OnCreate方法中时它才有效。
我想通过按钮更改矩形颜色,因此我将此代码放在按钮的onClick()方法中。但是当我在app运行时单击按钮颜色不会改变。有什么建议吗?
答案 0 :(得分:2)
使用此代码并且它有效,或者考虑使用viewrectangle.invalidate()重新绘制viewrectangle,但它不应该是nescarry:
View viewrectangle;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
viewrectangle = (View) findViewById(R.id.myRectangleView);
}
public void doClick(View v) {
GradientDrawable sd = (GradientDrawable) viewrectangle.getBackground();
sd.setColor(0xffffff00);
sd.invalidateSelf();
}
在此示例中,“doClick()”方法在main.xml中设置:
<Button android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="Button"
android:onClick="doClick"/>
答案 1 :(得分:0)
您可以将此代码放在一个单独的方法中,并且可以通过onClick of button调用该方法。
答案 2 :(得分:0)
您可以尝试使用滤镜。我以前用它来改变按钮的颜色(注意它们最初是标准灰色),如果你从另一种颜色开始,它可能是一个非常不同的结果。无论如何,我是如何做到的一个例子:
导入PorterDuff图形内容:
import android.graphics.PorterDuff;
在课程中定义要滤色的项目并设置过滤器:
Button atdButton = (Button) convertView.findViewById(R.id.attendbutton);
if (atdState[position].equals("P")) {
atdButton.getBackground().setColorFilter(0xFF00FF00, // Set filter to green
PorterDuff.Mode.MULTIPLY);
} else if (atdState[position].equals("T")) {
atdButton.getBackground().setColorFilter(0xFFFFFF00, // Set filter to yellow
PorterDuff.Mode.MULTIPLY);
} else if (atdState[position].equals("E")) {
atdButton.getBackground().setColorFilter(0xFFFF6600, // Set filter to orange
PorterDuff.Mode.MULTIPLY);
} else if (atdState[position].equals("U")) {
atdButton.getBackground().setColorFilter(0xFFFF0000, // Set filter to red
PorterDuff.Mode.MULTIPLY);
} else {
atdButton.getBackground().clearColorFilter();
}