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 работи според изискванията, но когато върне цвета, премахва кръглата форма

Моля, помогни ми

Благодаря

Аман


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