【问题标题】:How to customize a Button to have a gradient color background?如何自定义按钮以具有渐变色背景?
【发布时间】:2019-11-15 01:34:24
【问题描述】:

There already is a solution 关于如何创建具有渐变色背景的布局,但是当我尝试实现它时,它告诉我 Android 渲染器已过时,我应该使用来自 Xamarin.Forms.Platform.Android.FastRenderers 的渲染器

如果我将代码更改为

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

而不是

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

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

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

【问题讨论】:

    标签: xamarin.forms


    【解决方案1】:

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

    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);
            }
        }
      }
     }
    

    【讨论】:

    • 是的,它起作用了。你是怎么找到它的?如果我再次有问题该怎么办?
    • 当我们遇到问题时,我们通常会先分析日志,如果找不到原因,我们可以尝试在谷歌上搜索日志。对于一般问题,会有一些解决方案。 :)
    • ok.thankyou .顺便 .where 可以查看 xamarin 中标签、图片等元素的代码。我在github上看不到。
    • 你说的是这个链接吗? github.com/xamarin/Xamarin.Forms
    猜你喜欢
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多