首页 > 解决方案 > 如何自定义按钮以具有渐变色背景?

问题描述

已经有一个关于如何创建具有渐变色背景的布局的解决方案,但是当我尝试实现它时,它告诉我 Android 渲染器已过时,我应该使用来自Xamarin.Forms.Platform.Android.FastRenderers

如果我将代码更改为

public class GradientStackLayout : StackLayout 
{
    // ...
}

代替

public class GradientStackLayout : VisualElementRenderer<StackLayout>
{
    // ...
}

编译器会抱怨没有DispatchDrawandOnElementChanged方法。

我应该使用过时的渲染器吗?有没有实现自定义渲染器的新方法?

标签: xamarin.forms

解决方案


GradientColorStackRenderer 您只需在 Xamarin android 的类中添加一个构造函数。

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

所以整个代码如下:

[assembly: ExportRenderer(typeof(GradientColorStack), typeof(GradientColorStackRenderer))]
namespace GradientBackgroundApp.Droid
{
 public class GradientColorStackRenderer: VisualElementRenderer<StackLayout>
{

    private Color StartColor { get; set; }
    private Color EndColor { get; set; }

    // add the construct here
    public GradientColorStackRenderer(Context context):base(context)
    {
    }

    protected override void DispatchDraw(global::Android.Graphics.Canvas canvas)
    {
        #region for Vertical Gradient
        //var gradient = new Android.Graphics.LinearGradient(0, 0, 0, Height,
        #endregion

        #region for Horizontal Gradient
        var gradient = new Android.Graphics.LinearGradient(0, 0, Width, 0,
        #endregion

               this.StartColor.ToAndroid(),
               this.EndColor.ToAndroid(),
               Android.Graphics.Shader.TileMode.Mirror);

        var paint = new Android.Graphics.Paint()
        {
            Dither = true,
        };
        paint.SetShader(gradient);
        canvas.DrawPaint(paint);
        base.DispatchDraw(canvas);
    }

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

        if (e.OldElement != null || Element == null)
        {
            return;
        }
        try
        {
            var stack = e.NewElement as GradientColorStack;
            this.StartColor = stack.StartColor;
            this.EndColor = stack.EndColor;
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine(@"ERROR:", ex.Message);
        }
    }
  }
 }

推荐阅读