当我说
button.setBackgroundColor(Color.BLUE);
按钮形状从默认形状变为矩形。我想在不影响其原始形状的情况下更改按钮颜色。请帮我。
当我说
button.setBackgroundColor(Color.BLUE);
按钮形状从默认形状变为矩形。我想在不影响其原始形状的情况下更改按钮颜色。请帮我。
这是一个对我有用的解决方案,与公认的解决方案相反,它允许您动态更改颜色:
myButton = (ImageButton)myView.findViewById(R.id.my_button);
Drawable roundDrawable = getResources().getDrawable(R.drawable.round_button);
roundDrawable.setColorFilter(Color.BLUE, Mode.SRC_ATOP);
if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) {
myButton.setBackgroundDrawable(roundDrawable);
} else {
myButton.setBackground(roundDrawable);
}
我使用的“round_button”drawable的XML,例如:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="#4db6ac"/>
</shape>
每当您更改按钮的默认背景时,形状都会发生变化,因为默认形状是矩形,默认背景是可绘制圆角的形状。如果您使用任何其他背景,则此圆角效果将丢失。
如果使用可绘制的形状作为背景,则可以使用任何颜色或形状实现相同的效果。
以下是如何实现这一目标:
形状可绘制的示例代码:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<solid
android:color="#f8f8f8"/>
<corners
android:radius="4dp"/>
<padding
android:left="10dp"
android:right="10dp"
android:top="5dp"
android:bottom="5dp"/>
<stroke
android:width="1dp"
android:color="#aeaeae"/>
</shape>
如果你想要一个带有选择器的按钮,那么使用这个 xml 作为背景
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true">
<shape >
<solid
android:color="#ff0000" />
<stroke
android:width="1dp"
android:color="#ff0000" />
<corners
android:radius="4dp" />
<padding
android:left="10dp"
android:right="10dp"
android:top="10dp"
android:bottom="10dp" />
</shape>
</item>
<item >
<shape >
<gradient
android:startColor="#ff2727"
android:endColor="#890000"
android:angle="270" />
<stroke
android:width="1dp"
android:color="#620000" />
<corners
android:radius="4dp" />
<padding
android:left="10dp"
android:right="10dp"
android:top="10dp"
android:bottom="10dp" />
</shape>
</item>
</selector>
这是一个选择器 xml,其中项目作为不同的形状可绘制对象。如果按下按钮,即按钮的状态为state_pressed,则使用顶部可绘制形状,否则使用底部可绘制形状。
我希望这将有所帮助。
就在几分钟前,我遇到了同样的问题。在布局文件的 XML 中使用android:backgroundTint
属性将解决该问题。按钮将保留其原始形状,并且波纹效果不会丢失。
XML 应该类似于:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click Me!"
android:textColor="#FFF"
android:backgroundTint="#2196f3" />
当您默认使用颜色对象时,android系统使用paint对象填充按钮,并且paint对象只能填充矩形,圆形而不是曲线如果您真的想用颜色和曲线形状表示按钮,请使用自定义视图(帆布)
在你的 layout.xml 中检查这个
机器人:背景=“*****”
这对我有用 - 在运行时/动态更改。例如,单击按钮时,颜色会发生变化,但形状需要保持不变。
首先,您需要在 xml 中定义按钮:
<Button
android:id="@+id/myButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/buttonshape"
android:text="Change Colour but keep shape, please" />
你会在上面看到它调用buttonshape
,所以在你的drawable
文件夹中:
(它是一个矩形,灰色,带有深灰色边框1dp
)
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#D3D3D3" />
<corners android:radius="3dp" />
<stroke
android:width="1dp"
android:color="#aeaeae" />
</shape>
现在文件夹中的一个新xml
文件, ,用于按钮按下状态。颜色将是绿色,其他一切都相同。drawable
buttonpressed.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
android:shape="rectangle">
<solid android:color="#2AB40E" />
<corners android:radius="3dp" />
<stroke
android:width="1dp"
android:color="#aeaeae" />
</shape>
现在,在我们的活动中单击按钮:
private void myButton() {
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// keep the slightly rounded shape, when the button is pressed
myButton.setBackgroundResource(R.drawable.buttonpressed);
etc..etc...
这是一个老问题,但对于未来的寻求者来说,这对我有用......
在可绘制的按钮形状中:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:bottomRightRadius="10dp"
android:bottomLeftRadius="10dp"
android:topRightRadius="10dp"
android:topLeftRadius="10dp" />
</shape>
在按钮的 layout.xml 中:
<Button
android:id="@+id/button"
android:layout_width="150dp"
android:layout_height="38dp"
android:layout_marginEnd="20dp"
android:layout_marginBottom="20dp"
android:background="@drawable/buttonshape"
android:backgroundTint="@color/colorButtonOrange"
android:text="@string/button_text"
android:textColor="@color/colorWhite"/>
使用android:backgroundTint
,按钮在活动开始时变为橙色。
在我的活动中,我只用一行更改按钮颜色:
button.getBackground().setColorFilter(Color.GREY, PorterDuff.Mode.SRC_ATOP);
当使用“setBackgroundColor”改变视图的形状时,我遇到了同样的问题。我用“setTint”解决了它