在保持其形状的同时更改按钮上的按钮颜色

时间:2015-12-22 12:50:35

标签: android xamarin.android mvvmcross

下面的代码在单击时将按钮的背景颜色从绿色更改为红色,其中bgColor的相应MvxColor在我的StartStopCommand中定义。它可以工作,但MvxBind BackgroundColor会覆盖Button的形状。

有没有办法在Android中保持这种形状,只改变颜色,使其不需要特定于平台的代码(如下所示)?

Android中的按钮:

<Button
            android:text="Start"
            android:textColor="#FFFFFF"
            android:textSize="30sp"
            android:layout_margin="5dip"
            android:layout_width="270dp"
            android:layout_height="wrap_content"
            android:background="@drawable/buttonshape"
            local:MvxBind="Click StartStopCommand; BackgroundColor bgColor, Converter=NativeColor" />

形状xml是:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
  <corners
  android:radius="10dp"
/>
  <solid
  android:color="#3497db"
/>
  <size
  android:width="270dp"
  android:height="60dp"
/>
</shape>

2 个答案:

答案 0 :(得分:2)

由于您为按钮设置了Background资源,因此稍后使用BackgroundColor会丢弃您在此处设置的所有内容。

您可能想要的是Selector资源的Background,它确定Button正常,有针对性,有效以及您想要响应的其他任何状态时设置的内容。这是一个非常特定于平台的事情,您可能无法在其他平台上重用该行为。

反正。你可以尝试这样的事情:

<强> shape_selected.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"   
  android:shape="rectangle" >
  <corners android:radius="10dp" />
  <solid android:color="#dddddd" /> <!-- use selected color here -->
  <size
    android:width="270dp"
    android:height="60dp"/>
</shape>

<强> shape_unselected.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"   
  android:shape="rectangle" >
  <corners android:radius="10dp" />
  <solid android:color="#3497db" />
  <size
    android:width="270dp"
    android:height="60dp"/>
</shape>

<强> button_background.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/shape_selected" android:state_selected="true" />
    <item android:drawable="@drawable/shape_selected" android:state_pressed="true" />
    <item android:drawable="@drawable/shape_unselected" />
</selector>

然后您将button_background用于Button s Background财产:

<Button
    ...
    android:background="@drawable/buttonshape"
    local:MvxBind="Click StartStopCommand" />

否则,如果你想继续使用你的属性来设置BackgroundColor而没有形状,你将需要使用Background属性,有一个动态构建可绘制形状的转换器。 / p>

所以在您的转换器中,您只需返回一个ShapeDrawable颜色,您可以像这样构建:

private ShapeDrawable CreateShapeDrawable(Color color)
{
    var roundRect = new RoundRectShape (new [] { 10f, 10f, 10f, 10f, 10f, 10f, 10f, 10f }, null, null);
    var shape = new ShapeDrawable (roundRect) {
        Paint = new Paint { Color = color }
    };
    return shape;
}

修改

这样的东西可能适用于转换器方法:

public class MyStateToDrawableConverter : MvxValueConverter<MvxColor, Drawable>
{
    protected override Drawable Convert(MvxColor value, object parameter, CultureInfo culture)
    {
        return CreateShapeDrawable(value.ToNative());
    }

    private ShapeDrawable CreateShapeDrawable(Color color)
    {
        var roundRect = new RoundRectShape (new [] { 10f, 10f, 10f, 10f, 10f, 10f, 10f, 10f }, null, null);
        var shape = new ShapeDrawable (roundRect) {
            Paint = new Paint { Color = color }
        };
        return shape;
    }
}

答案 1 :(得分:1)

<强> button_selected

<solid android:color="@color/btn_grey" />

<stroke
    android:width="1dp"
    android:color="@color/transparant" />

<padding
    android:bottom="1dp"
    android:left="1dp"
    android:right="1dp"
    android:top="1dp" />

<corners
    android:bottomLeftRadius="5dp"
    android:bottomRightRadius="5dp"
    android:topLeftRadius="5dp"
    android:topRightRadius="5dp" />

<强> button_unselected

<solid android:color="@color/orange_500" />

<stroke
    android:width="1dp"
    android:color="@color/transparant" />

<padding
    android:bottom="1dp"
    android:left="1dp"
    android:right="1dp"
    android:top="1dp" />

<corners
    android:bottomLeftRadius="5dp"
    android:bottomRightRadius="5dp"
    android:topLeftRadius="5dp"
    android:topRightRadius="5dp" />

在java文件中

私人按钮btnMap;

btnMap =(按钮)findViewById(R.id.btn_map);

如果(布尔) { btnMap.setBackgroundDrawable(getResources()getDrawable(R.drawable.button_selected)); }

其他{ btnMap.setBackgroundDrawable(getResources()getDrawable(R.drawable.button_unselected));