Цвет фона LinearLayout с использованием mvvmcross

У меня есть линейный макет в виде круга, и я хотел изменить его цвет с помощью преобразователя значений.

ниже как выглядит мой линейный макет

<LinearLayout
   android:orientation="vertical"
   android:id="@+id/linearLayoutDaysLeft"
   android:background="@drawable/RedBackground"
   local:MvxBind="BackgroundColor DateColor(EndDate)"/>

обратите внимание, я установил фон как @ drawable / RedBackground

ниже как выглядит мой файл @ drawable / RedBackground.xml

<?xml version="1.0" encoding="utf-8" ?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
  <corners android:radius="10dip"/>
  <solid android:color="#D00E0D"/>
</shape>

Ниже мой код DateColorValueConverter

protected override Cirrious.CrossCore.UI.MvxColor Convert(object value, object parameter, System.Globalization.CultureInfo culture)
        {
            var date = (DateTime)value;
            int dayLeft;
            TimeSpan difference = date - DateTime.Today;
            dayLeft = (int)Math.Ceiling(difference.TotalDays);


            if (dayLeft < 0)
                return (new Cirrious.CrossCore.UI.MvxColor(208, 14, 13, 150));
            if (dayLeft >= 0 && dayLeft <= 1)
                return (new Cirrious.CrossCore.UI.MvxColor(255, 210, 0, 150));
            if (dayLeft > 1)
                return (new Cirrious.CrossCore.UI.MvxColor(93, 210, 85, 150));

            return (new Cirrious.CrossCore.UI.MvxColor(93, 210, 85, 150));
        }

Обратите внимание, что мой DateColor работает так, как требуется, но когда он возвращает цвет, он удаляет форму cicular

Пожалуйста помогите

Спасибо

Аман


person aamankhaan    schedule 02.07.2014    source источник


Ответы (2)


Прежде всего, спасибо Стюарту за то, что указал правильное направление.

Я успешно добился необходимого изменения фона, доступного для рисования

Я хотел бы поделиться этим с другими, если кому-то потребуется

Ниже приведена моя настраиваемая привязка для LinearLayout

public class ShapeBackgroundBinding : MvxAndroidTargetBinding
    {        
        private readonly LinearLayout _linearLayout;
        public ShapeBackgroundBinding(LinearLayout view) : base(view)
        {
            this._linearLayout = view;
        }
        protected override void SetValueImpl(object target, object value)
        {
            // to do logic
        }

        public override void SetValue(object value)
        {
            var date = (DateTime)value;
            int dayLeft;
            TimeSpan difference = date - DateTime.Today;
            dayLeft = (int)Math.Ceiling(difference.TotalDays);


            if (dayLeft < 0)
                _linearLayout.SetBackgroundResource(Resource.Drawable.RedBackground);
            else if (dayLeft >= 0 && dayLeft <= 1)
                _linearLayout.SetBackgroundResource(Resource.Drawable.YellowBackground);
            else if (dayLeft > 1)
                _linearLayout.SetBackgroundResource(Resource.Drawable.GreenBackground); 
            else
                _linearLayout.SetBackgroundResource(Resource.Drawable.GreenBackground);
        }
        public override Type TargetType
        {
            get { return typeof(DateTime); }
        }
        public override MvxBindingMode DefaultMode
        {
            get { return MvxBindingMode.OneTime; }
        }        
    }

Ниже показано, как я зарегистрировал пользовательскую привязку в файле настройки.

 protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry)
        {
            base.FillTargetFactories(registry);
            registry.RegisterFactory(new MvxCustomBindingFactory<LinearLayout>("ShapeBackground", (view) => new ShapeBackgroundBinding(view)));
        }

После того, как вышеуказанные шаги будут выполнены, просто нам просто нужно привязать элемент управления линейным макетом, как показано ниже.

<LinearLayout
    android:orientation="vertical"
    android:id="@+id/linearLayoutTest"                    
    local:MvxBind="ShapeBackground EndDate">

Вот и все...

person aamankhaan    schedule 03.07.2014
comment
Спасибо, Аман, я смог изменить ваше решение, чтобы обеспечить возможность рисования привязки в соответствии с потребностями моих проектов. - person JDibble; 02.03.2016

Привязка BackgroundColor по умолчанию использует SetBackgroundColor в целевом представлении - см. https://github.com/MvvmCross/MvvmCross/blob/v3.1/Plugins/Cirrious/Color/Cirrious.MvvmCross.Plugins.Color.Droid./BindingTargets/MvxViewBackgroundColorBinding.cs

Если вы хотите добиться какого-либо настраиваемого эффекта только для Solid в вашем Drawable, вам нужно будет написать настраиваемую привязку для этой формы и использовать методы, подобные приведенным в: - Android: изменение цвета фигуры во время выполнения - Как изменить цвета Drawable в Android? - Изменить сплошной цвет фигуры во время выполнения внутри Drawable xml, используемого в качестве фона

Подозреваю, что можно написать что-то вроде:

public class ShapeBackgroundColorBinding
    : MvxViewColorBinding
{
    public ShapeBackgroundColorBinding(View view)
        : base(view)
    {
    }

    protected override void SetValueImpl(object target, object value)
    {
        var view = (View)target;
        if (view == null)
            return;
        var background = view.Background;
        background.SetColor((Android.Graphics.Color) value);
    }
}

который вы можете зарегистрировать как привязку для ShapeBackgroundColor во время Setup - хотя этот псевдокод может потребовать небольшой настройки, чтобы он начал работать!

person Stuart    schedule 02.07.2014
comment
Спасибо @Stuart, я создал три разных XML-файла с цветовым кодом, единственное, что мне нужно изменить, это drawableName .... так же, как мы делаем для ImageView с именем привязки, установленным как DrawableName - person aamankhaan; 02.07.2014