Xamarin:如何改变Android中的Stepper颜色在iOS中看起来像?

时间:2018-02-04 14:40:43

标签: xamarin xamarin.forms xamarin.android

我有使用Stepper的Xamarin PCL应用。我想更改Stepper按钮的颜色,现在使用以下渲染器。

在PCL:

public class MyStepper : Stepper
{
   public static readonly BindableProperty ColorProperty = 
            BindableProperty.Create(nameof(Color), typeof(Color), typeof(MyStepper), Color.Default);

   public Color MyColor
   {
      get { return (Color)GetValue(ColorProperty); }
      set { SetValue(ColorProperty, value); }
   }
}

在iOS中:

public class MyStepperRenderer : StepperRenderer
{
   protected override void OnElementChanged(ElementChangedEventArgs<Stepper> e)
   {
      base.OnElementChanged(e);
      MyStepper s = Element as MyStepper;

      if (Control != null)
         Control.TintColor = s.MyColor.ToUIColor();
   }
}

enter image description here

在Android中:

protected override void OnElementChanged(ElementChangedEventArgs<Stepper> e)
{
   base.OnElementChanged(e);
   MyStepper s = Element as MyStepper;

   if (Control != null)
   {
      Control.GetChildAt(0).Background.SetColorFilter(s.MyColor.ToAndroid(), PorterDuff.Mode.Multiply);
      Control.GetChildAt(1).Background.SetColorFilter(s.MyColor.ToAndroid(), PorterDuff.Mode.Multiply);
    }
}

enter image description here

在XAML中:

<local:MyStepper MyColor="Red" Maximum="10" Minimum="0" ....... />

正如所料,它会像所附的图像一样工作。但是有可能让Android颜色只改变&#34;大纲&#34;的按钮就像iOS中的样子一样?

2 个答案:

答案 0 :(得分:1)

  

如何将 - 和+的颜色更改为红色。还有办法吗?

基于@ Sven-MichaelStübe的回答,我添加了一些代码来改变“ - ”和“+”颜色:

protected override void OnElementChanged(ElementChangedEventArgs<Stepper> e)
{
    base.OnElementChanged(e);
    MyStepper s = Element as MyStepper;

    if (Control != null)
    {
        var button = Control.GetChildAt(0) as Android.Widget.Button;
        button.SetTextColor(s.MyColor.ToAndroid());
        button.SetBackground(ResourcesCompat.GetDrawable(Resources, Resource.Drawable.button_selector, null));
        button.Background.SetColorFilter(s.MyColor.ToAndroid(), PorterDuff.Mode.Multiply);

        var button2 = Control.GetChildAt(1) as Android.Widget.Button;
        button2.SetTextColor(s.MyColor.ToAndroid());
        button2.SetBackground(ResourcesCompat.GetDrawable(Resources, Resource.Drawable.button_selector, null));
        button2.Background.SetColorFilter(s.MyColor.ToAndroid(), PorterDuff.Mode.Multiply);
    }
}

Effectt

  

去创建一个带状态的drawable,并在Renderer中设置它们,而不是设置一种颜色。

Sven-MichaelStübe想说如果你将一种颜色设置为背景,那么你的Button将没有点击效果。您可以参考:Material effect on button with background color 了解更多详细信息。

例如:

button_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:drawable="@color/colorAccent" android:state_pressed="true"/>
  <item android:drawable="@color/colorPrimaryDark" android:state_focused="true"/>
  <item android:drawable="@drawable/button_border"/>
</selector>

button_border.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle" >

  <solid android:color="#00FFFFFF" />
  <corners android:radius="5dp" />
  <stroke
    android:width="2dp"
    android:color="#FFFFFF" />

</shape>

答案 1 :(得分:0)

如果您创建自定义矢量绘图

,则可以执行此操作

<强> button_border.xml

将此文件放在Android x = (LinkedHashMap<String, String>) xmlRegestryFile.getMap("my/path", String.class) 文件夹中,并确保构建操作设置为Resources\drawable

AndroidResource

<强> MyStepperRenderer.cs

然后你只需要将它设置为两个按钮的背景。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle" >

  <solid android:color="#00FFFFFF" />

  <corners android:radius="5dp" />
  <stroke
    android:width="2dp"
    android:color="#FFFFFF" />

</shape>

这看起来像: enter image description here

<强>讨论

如果您没有多种颜色,请使用状态创建一个drawable并在渲染器中设置它们,而不是设置单一颜色。因此,您的用户将获得更好的反馈。