我需要删除从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表单的按钮,没有任何附加组件。但是似乎没有任何作用
答案 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模拟器上看到的内容:
如果您希望单击时绝对不改变颜色,则可以进一步自定义渲染器:
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);