Пользовательский рендерер кадров для уникальных значений углового радиуса в android [Xamarin.Forms] - PullRequest
1 голос
/ 31 января 2020

Я хочу создать собственный рендерер для моего элемента управления кадром, поскольку у меня есть элемент управления, значения каждого радиуса которого уникальны. Я пытался создать собственный рендерер для элемента управления кадром, но я не нашел " solid "решение для этого, мой пользовательский рендерер не работает, я также пытался использовать плагин Xamarin.Forms.PancackeView, но в моей версии Xamarin.Forms (4.3.0.991), похоже, есть ошибка или что-то связанное:

EXTRA : я хочу реализовать тень в контрольном кадре, но, как вы должны знать, по умолчанию в контроле кадров есть тень, но тень в моем кадре не работает, есть ли ошибка или как я могу реализовать тень для пользовательского рендера кадров?

Android код для пользовательского рендерера кадров:

[assembly: ExportRenderer(typeof(TagFrame), typeof(TagFrameCustomRendererAndroid))]
namespace Sortex.Droid.CRImplementations
{
    public class TagFrameCustomRendererAndroid : FrameRenderer
    {
        public TagFrameCustomRendererAndroid(Context context) : base(context)
        {
        }

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

            if (e.NewElement != null)
            {
                GradientDrawable gradientDrawable = new GradientDrawable();

                float[] cornerRadius = { 100000, 100000, 0, 0, 0, 0, 100000, 100000 };
                gradientDrawable.SetCornerRadii(cornerRadius);

                SetBackgroundDrawable(gradientDrawable);
            }
        }
    }
}

Класс TagFrame в общем проекте:

public class TagFrame : Frame
{
}

1 Ответ

0 голосов
/ 31 января 2020

Я хочу создать пользовательский рендерер для моего элемента управления кадром, поскольку у него есть элемент управления, значения каждого радиуса которого уникальны,

Согласно вашему описанию, вы хотите выполнить пользовательский рендеринг. кадр, то вы можете установить другой радиус угла. Если да, я делаю один пример, который вы можете посмотреть:

Во-первых, создайте CustomFrame наследовать Frame, имеет BindableProperty CornerRadiusProperty.

public class CustomFrame:Frame
{
    public static new readonly BindableProperty CornerRadiusProperty = BindableProperty.Create(nameof(CustomFrame), typeof(CornerRadius), typeof(CustomFrame));

    public CustomFrame()
    {
        // MK Clearing default values (e.g. on iOS it's 5)
        base.CornerRadius = 0;
    }

    public new CornerRadius CornerRadius
    {
        get => (CornerRadius)GetValue(CornerRadiusProperty);
        set => SetValue(CornerRadiusProperty, value);
    }
}

Затем перейдите на Android платформу,

using FrameRenderer = Xamarin.Forms.Platform.Android.AppCompat.FrameRenderer;

[сборка: ExportRenderer (typeof (CustomFrame), typeof (CustomFrameRenderer))] пространство имен Framerender.Droid {publi c класс CustomFrameRenderer: FrameRenderer {publi c CustomFrameRenderer (контекстный контекст): база (контекст) ) {}

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

        if (e.NewElement != null && Control != null)
        {
            UpdateCornerRadius();
        }
    }

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

        if (e.PropertyName == nameof(CustomFrame.CornerRadius) ||
            e.PropertyName == nameof(CustomFrame))
        {
            UpdateCornerRadius();
        }
    }

    private void UpdateCornerRadius()
    {
        if (Control.Background is GradientDrawable backgroundGradient)
        {
            var cornerRadius = (Element as CustomFrame)?.CornerRadius;
            if (!cornerRadius.HasValue)
            {
                return;
            }

            var topLeftCorner = Context.ToPixels(cornerRadius.Value.TopLeft);
            var topRightCorner = Context.ToPixels(cornerRadius.Value.TopRight);
            var bottomLeftCorner = Context.ToPixels(cornerRadius.Value.BottomLeft);
            var bottomRightCorner = Context.ToPixels(cornerRadius.Value.BottomRight);

            var cornerRadii = new[]
            {
                topLeftCorner,
                topLeftCorner,

                topRightCorner,
                topRightCorner,

                bottomRightCorner,
                bottomRightCorner,

                bottomLeftCorner,
                bottomLeftCorner,
            };

            backgroundGradient.SetCornerRadii(cornerRadii);
        }
    }
}

}

Теперь вы можете использовать CustomFrame в PCL.

 <local:CustomFrame
        BackgroundColor="Red"
        CornerRadius="0,0,30,30"
        HasShadow="True"
        HeightRequest="100"
        VerticalOptions="CenterAndExpand"
        WidthRequest="100" />

Вот пример на Github, вы также можете посмотреть :

https://github.com/CherryBu/CustomFrame

Есть также одна статья о пользовательском кадре:

https://progrunning.net/customizing-corner-radius/

...