使用mvvmcross设置LinearLayout的背景颜色

3
我可以帮您翻译成中文。这段内容是关于编程的,讲述了如何使用值转换器改变一个线性布局的颜色,该布局被设计成圆形。以下是该线性布局的外观。
<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按要求工作,但当它返回颜色时,它会删除圆形形状。
请帮助我。
谢谢。
Aaman
2个回答

4

首先感谢 Stuart 指导正确的方向

我已经成功实现了所需的可绘制背景更改

如果有人需要,我也想与其他人分享这个过程

以下是我自定义的 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">

这就是全部内容了。

谢谢Aaman,我能够修改你的解决方案以提供一些可绘制的绑定来适应我的项目需求。 - JDibble

1
默认的BackgroundColor绑定在目标View上使用SetBackgroundColor - 参见https://github.com/MvvmCross/MvvmCross/blob/v3.1/Plugins/Cirrious/Color/Cirrious.MvvmCross.Plugins.Color.Droid/BindingTargets/MvxViewBackgroundColorBinding.cs 如果您想在Drawable中仅对Solid实现自定义效果,则需要为此形状编写自定义绑定,并使用以下技术: - Android:更改运行时形状颜色 - 如何在Android中更改Drawable的颜色? - 在用作背景的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);
    }
}

Setup期间,您可以将其注册为ShapeBackgroundColor的绑定 - 尽管该伪代码可能需要进行一些调整才能正常工作!


谢谢@Stuart,我已经创建了三个不同的颜色代码XML文件,唯一需要更改的是drawableName...就像我们为ImageView做的那样,将绑定名称设置为DrawableName。 - aamankhaan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接