在Xamarin Forms Platform上点击android按钮时,如何删除动画/阴影效果

时间:2018-07-24 02:22:37

标签: c# android xamarin.forms

enter image description here enter image description here

我需要删除从xamarin表单中点击我的android按钮时出现的阴影。 (如上图所示。当yes和no最初是相同的颜色时。按下no时,阴影会投射在其上,导致其颜色变深)

我遵循了 How to remove the shadow of a button on Xamarin Forms 但是由于我的按钮颜色应该是红色,所以我没有将PCL中的背景颜色更改为红色。但是,点击时阴影仍会出现在android按钮上。

然后,我点击了此链接: https://forums.xamarin.com/discussion/122752/removing-shadow-from-android-buttons 但是我按钮上的阴影仍然存在。我认为就像链接中所述的一样,由于我的xamarin表单版本为2.5.0.280555,因此他们提供的解决方案将无法正常工作。

如果我仍然需要将我的xamarin表单版本保持为2.5.0.280555,那么在我点击Xamarin.Forms项目时需要删除android按钮阴影时,是否有人可以提供任何建议或解决方案?< / p>

此处表示该问题已在以后的版本中得到解决: https://github.com/xamarin/Xamarin.Forms/issues/1954

因此,我将xamarin形式升级到2.5.1.52。 但是在Android平台上点击按钮时,我仍然看到按钮上的阴影。

我的代码更改如下: 在Style.xml

<resources>
    <style name="MyTheme" parent="MyTheme.Base">    
    </style>
    <!-- Base theme applied no matter what API -->
    <style name="MyTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:buttonStyle">@style/NoShadowButton</item>

    </style>
<style name="NoShadowButton" parent="android:style/Widget.Button">
        <item name="android:stateListAnimator">@null</item>
    </style>
</resources>

我什至实现了自定义渲染器

[assembly: ExportRenderer(typeof(FlatButton), typeof(UnanimatedButtonRenderer))]
namespace RideNow.Droid
{
  public class UnanimatedButtonRenderer : ButtonRenderer
    {

        protected override void OnDraw(Android.Graphics.Canvas canvas)
        {
            base.OnDraw(canvas);
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
        {
            base.OnElementChanged(e);

            if (this.Control != null && this.Element != null)
            {
                var nativeButton = (Android.Widget.Button)Control;
                nativeButton.SetShadowLayer(0, 0, 0, Android.Graphics.Color.Transparent);

                nativeButton.Elevation = 0;
                if (this.CheckIsCustomFont())
                {
                    var typeFace = this.GetTypeFace();
                    var typeFaceStyle = this.GetTypeFaceStyle();
                    if (typeFace != null)
                    {
                        nativeButton.SetTypeface(typeFace, typeFaceStyle);
                    }
                }
            }
        }
    }
}

其中Flatbutton只是一个自定义按钮,继承自xamarin表单的按钮,没有任何附加组件。但是似乎没有任何作用

1 个答案:

答案 0 :(得分:2)

在自定义渲染器中尝试以下操作:

    protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
    {
        base.OnElementChanged(e);

        if (this.Control != null && e.NewElement != null)
        {
            if (Build.VERSION.SdkInt > BuildVersionCodes.Lollipop)
            {
                this.Control.StateListAnimator = null;
            }
            else
            {
                this.Control.Elevation = 0;
            }
        }
    }

这是我在Android 6模拟器上看到的内容:

enter image description here


如果您希望单击时绝对不改变颜色,则可以进一步自定义渲染器:

public class UnanimatedButtonRenderer : ButtonRenderer
{
    private FlatButton TypedElement => this.Element as FlatButton;

    public UnanimatedButtonRenderer(Context context) : base(context)
    {
    }

    protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
    {
        base.OnElementChanged(e);

        if (this.Control != null && e.NewElement != null)
        {
            this.UpdateBackground();

            if (Build.VERSION.SdkInt > BuildVersionCodes.Lollipop)
            {
                this.Control.StateListAnimator = null;
            }
            else
            {
                this.Control.Elevation = 0;
            }
        }
    }

    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);

        if (e.PropertyName.Equals(VisualElement.BackgroundColorProperty.PropertyName) ||
            e.PropertyName.Equals(Button.CornerRadiusProperty.PropertyName) ||
            e.PropertyName.Equals(Button.BorderWidthProperty.PropertyName))
        {
            this.UpdateBackground();
        }
    }

    private void UpdateBackground()
    {
        if (this.TypedElement != null)
        {
            using (var background = new GradientDrawable())
            {
                background.SetColor(this.TypedElement.BackgroundColor.ToAndroid());
                background.SetStroke((int)Context.ToPixels(this.TypedElement.BorderWidth), this.TypedElement.BorderColor.ToAndroid());
                background.SetCornerRadius(Context.ToPixels(this.TypedElement.CornerRadius));

                // customize the button states as necessary
                using (var backgroundStates = new StateListDrawable())
                {
                    backgroundStates.AddState(new int[] { }, background);

                    this.Control.SetBackground(backgroundStates);
                }
            }
        }
    }
}

在上面的代码中,为所有状态设置了背景,但是可以对其进行自定义。例如,

// set a background for the un-pressed state
backgroundStates.AddState(new int[] { -Android.Resource.Attribute.StatePressed }, background);

// set a background for the pressed state
backgroundStates.AddState(new int[] { Android.Resource.Attribute.StatePressed }, backgroundPressed);