【问题标题】:LinearLayout Background color using mvvmcross使用 mvvmcross 的 LinearLayout 背景颜色
【发布时间】:2014-07-02 09:56:24
【问题描述】:

我有一个圆形的线性布局,想用值转换器改变它的颜色。

下面是我的线性布局的样子

<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 按要求工作,但是当它返回颜色时,它会删除圆形

请帮帮我

谢谢

阿曼

【问题讨论】:

    标签: android xamarin xamarin.android mvvmcross


    【解决方案1】:

    首先感谢 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)));
            }
    

    完成上述步骤后,我们只需要像下面的sn-p那样绑定线性布局控件

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

    就是这样……

    【讨论】:

    • 感谢 Aaman,我能够修改您的解决方案以提供一些可绘制的绑定以满足我的项目需求
    【解决方案2】:

    默认的 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: Change Shape Color in runtime - How to change colors of a Drawable in Android? - Change shape solid color at runtime inside Drawable xml used as background

    怀疑你可以这样写:

    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
    猜你喜欢
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多