Средство визуализации ввода имеет переполнение цветом - PullRequest
0 голосов
/ 04 августа 2020

Иметь настраиваемую запись с настраиваемым средством визуализации записи для Android:

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

        if (Control == null)
        {
            return;
        }

        Control.SetBackgroundColor(Android.Graphics.Color.Transparent);

        if (!(e?.NewElement is MyEntry element))
        {
            return;
        }

        GradientDrawable drawable = new GradientDrawable();
        drawable.SetShape(ShapeType.Rectangle);
        float cornerRdaius = TypedValue.ApplyDimension(ComplexUnitType.Dip, (float)element.CornerRadius, Resources.DisplayMetrics);
        drawable.SetCornerRadius(cornerRdaius);
        drawable.SetColor(element.BackgroundColor.ToAndroid());
        int stroke = (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, (float)element.BorderWidth, Resources.DisplayMetrics);
        drawable.SetStroke(stroke, element.BorderColor.ToAndroid());
        int paddingLeft = (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, (float)element.Padding.Left, Resources.DisplayMetrics);
        int paddingTop = (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, (float)element.Padding.Top, Resources.DisplayMetrics);
        int paddingRight = (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, (float)element.Padding.Right, Resources.DisplayMetrics);
        int paddingBottom = (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, (float)element.Padding.Bottom, Resources.DisplayMetrics);
        Control.Background = drawable;
        Control.SetPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
    }

Результат: введите описание изображения здесь

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

, но каким-то образом цвет фона выходит за пределы обводки,

Делая это прямоугольник.

Как заставить углы обрезать цвет?

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Мне в конце концов удалось исправить переполнение после многих попыток, переопределив

UpdateBackgroundColor в рендерере:

protected override void UpdateBackgroundColor()
    {
        if (Control == null)
        {
            return;
        }
        GradientDrawable drawable = Control.Background as GradientDrawable;
        if (drawable == null || !(Element is MyEntry element))
        {
            return;
        }
        drawable.SetColor(element.BackgroundColor.ToAndroid());
    }

Я предполагаю, что поведение Base как-то добавляет / захватывает другой слой а затем раскрашивает его.

0 голосов
/ 05 августа 2020

Вы можете достичь эффекта с помощью Shape в android.

создать shape_roundcorner. xml в Resources/drawable в android проекте:

<?xml version="1.0" encoding="utf-8" ?> 

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

   <solid android:color="#f00" />


   <stroke
     android:width="3dp"
     android:color="#000"
   />

   <corners
    android:radius="10dp"
    />
 </shape>

затем в вашем Entrenderer:

 protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
 {
     base.OnElementChanged(e);
     Control.SetBackgroundResource(Resource.Drawable.shape_roundcorner);
 }

эффект, как показано ниже:

введите описание изображения здесь

Обновить :

, если вы хотите сделать это динамически, например:

protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
    {
        base.OnElementChanged(e);
        //Control.SetBackgroundResource(Resource.Drawable.shape);
        GradientDrawable mGroupDrawable = new GradientDrawable();
        mGroupDrawable.SetShape(ShapeType.Rectangle);
        mGroupDrawable.SetStroke(8, Resources.GetColor(Resource.Color.stroke_color));//the value 8 and color you could define a bindableproperty in your custom entry.
        mGroupDrawable.SetColor(Resources.GetColor(Resource.Color.border_color));//the color you could define a bindableproperty in your custom entry.
        mGroupDrawable.SetCornerRadius(20);//the value 20 you could define a bindableproperty in your custom entry.
        Control.SetBackgroundDrawable(mGroupDrawable);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...