xm
2020-04-16 6fa9d69da922c8049f5acfcbb9ce9fd26811024c
ZigbeeApp/Shared/Phone/MainPage/Controls/SceneCardControl.cs
New file
@@ -0,0 +1,390 @@
using Shared.Phone.UserCenter;
using System;
using System.Collections.Generic;
using System.Text;
namespace Shared.Phone.MainPage.Controls
{
    /// <summary>
    /// 场景卡片控件
    /// </summary>
    public class SceneCardControl : FrameLayoutControl
    {
        #region ■ 变量声明___________________________
        /// <summary>
        /// 卡片需要被移除的事件
        /// </summary>
        public Action CardNeedRemoveEvent = null;
        /// <summary>
        /// 场景图片控件
        /// </summary>
        private ImageView btnScenePic = null;
        /// <summary>
        /// 场景背景图控件
        /// </summary>
        private PicViewControl btnSceneBackGroud = null;
        /// <summary>
        /// 时间图标控件
        /// </summary>
        private IconViewControl btnTimeIcon = null;
        /// <summary>
        /// 延时时间显示控件
        /// </summary>
        private NormalViewControl btnTimeView = null;
        /// <summary>
        /// 场景名字控件
        /// </summary>
        private NormalViewControl btnSceneName = null;
        /// <summary>
        /// 场景ID
        /// </summary>
        private int SceneId = 0;
        #endregion
        #region ■ 初始化_____________________________
        /// <summary>
        /// 场景卡片控件(宽度:458 + 14 * 2 高度:305 + 43)
        /// </summary>
        public SceneCardControl()
        {
            //图片真实宽度+图片自身左右空白
            this.Width = HdlControlLogic.Current.GetPictrueRealSize(458 + 14 * 2);
            //图片高度+阴影
            this.Height = HdlControlLogic.Current.GetPictrueRealSize(305 + 43);
            //取消点击特效
            this.UseClickStatu = false;
            this.ButtonClickEvent += (sender, e) =>
            {
                //调用场景
                this.SetSceneAction();
            };
        }
        /// <summary>
        /// 初始化控件
        /// </summary>
        /// <param name="i_scene">场景对象</param>
        public void InitControl(Common.SceneUI i_scene)
        {
            this.SceneId = i_scene.Id;
            string hourText = Language.StringByID(R.MyInternationalizationString.Hour);
            string minuText = Language.StringByID(R.MyInternationalizationString.Minute);
            string secondText = Language.StringByID(R.MyInternationalizationString.Second);
            //场景图片控件
            this.btnScenePic = new ImageView();
            btnScenePic.X = HdlControlLogic.Current.GetPictrueRealSize(14);
            btnScenePic.Width = HdlControlLogic.Current.GetPictrueRealSize(458);
            btnScenePic.Height = HdlControlLogic.Current.GetPictrueRealSize(305);
            btnScenePic.Radius = (uint)Application.GetRealHeight(17);
            this.AddChidren(btnScenePic, ChidrenBindMode.NotBind);
            //场景背景图控件
            this.btnSceneBackGroud = new PicViewControl(this.Width, this.Height, false);
            btnSceneBackGroud.UnSelectedImagePath = "Scene/Background.png";
            this.AddChidren(btnSceneBackGroud, ChidrenBindMode.BindEventOnly);
            //延时时间显示控件
            this.btnTimeView = new NormalViewControl(HdlControlLogic.Current.GetPictrueRealSize(280), HdlControlLogic.Current.GetPictrueRealSize(63), false);
            btnTimeView.X = HdlControlLogic.Current.GetPictrueRealSize(37);
            btnTimeView.Y = HdlControlLogic.Current.GetPictrueRealSize(10);
            btnTimeView.TextColor = 0xffffb400;
            btnTimeView.IsBold = true;
            if (i_scene.SceneDelayTime > 0)
            {
                btnTimeView.Text= this.GetTimeString(i_scene.SceneDelayTime, hourText, minuText, secondText);
            }
            this.AddChidren(btnTimeView, ChidrenBindMode.BindEventOnly);
            //时间图标控件
            this.btnTimeIcon = new IconViewControl(63);
            btnTimeIcon.X = HdlControlLogic.Current.GetPictrueRealSize(37);
            btnTimeIcon.Y = HdlControlLogic.Current.GetPictrueRealSize(20);
            btnTimeIcon.UnSelectedImagePath = "Item/Time.png";
            this.AddChidren(btnTimeIcon, ChidrenBindMode.NotBind);
            if (i_scene.SceneDelayTime > 0)
            {
                btnTimeIcon.Visible = false;
            }
            btnTimeIcon.ButtonClickEvent += (sender, e) =>
            {
                if (i_scene.RemainTime > 0)
                {
                    //该场景正在延时,请稍后
                    var msgContr = new ShowMsgControl(ShowMsgType.Tip, Language.StringByID(R.MyInternationalizationString.TheSceneIsDelaying));
                    msgContr.Show();
                    return;
                }
                var timeSelect = new Device.CommonForm.SelectTime();
                Common.CommonPage.Instance.AddChidren(timeSelect);
                timeSelect.TempTime = i_scene.SceneDelayTime;
                timeSelect.Init();
                timeSelect.TimeAction = (time) =>
                {
                    i_scene.SceneDelayTime = time;
                   //时间图标不显示
                   this.btnTimeIcon.Visible = false;
                   //显示剩余的时间
                   this.btnTimeView.Text = this.GetTimeString(time, hourText, minuText, secondText);
                };
            };
            //收藏控件
            var btnCollect = new IconViewControl(107);
            btnCollect.X = HdlControlLogic.Current.GetPictrueRealSize(350);
            btnCollect.Y = HdlControlLogic.Current.GetPictrueRealSize(12);
            btnCollect.UnSelectedImagePath = "Item/Collection1.png";
            btnCollect.SelectedImagePath = "Item/CollectionSelected1.png";
            this.AddChidren(btnCollect, ChidrenBindMode.NotBind);
            btnCollect.IsSelected = HdlRoomLogic.Current.IsCollectInRoom(i_scene);
            btnCollect.ButtonClickEvent += (sender, e) =>
            {
                //状态取反
                btnCollect.IsSelected = !btnCollect.IsSelected;
                if (btnCollect.IsSelected == false)
                {
                    //取消收藏
                    HdlSceneLogic.Current.DeleteLoveScene(i_scene);
                    if (HdlRoomLogic.Current.CurrentRoom.IsLove == true)
                    {
                        //如果当前房间是我的喜爱的话,回调卡片被删除的事件
                        this.CardNeedRemoveEvent?.Invoke();
                    }
                }
                else
                {
                    //添加收藏
                    HdlSceneLogic.Current.AddLoveScene(i_scene);
                }
            };
            //场景名称控件
            this.btnSceneName = new NormalViewControl(HdlControlLogic.Current.GetPictrueRealSize(280), HdlControlLogic.Current.GetPictrueRealSize(63), false);
            btnSceneName.X = HdlControlLogic.Current.GetPictrueRealSize(37);
            btnSceneName.Y = HdlControlLogic.Current.GetPictrueRealSize(236);
            btnSceneName.IsBold = true;
            btnSceneName.TextColor = UserCenterColor.Current.White;
            this.AddChidren(btnSceneName, ChidrenBindMode.BindEventOnly);
            //刷新控件状态
            this.RefreshControlInfo(i_scene);
        }
        #endregion
        #region ■ 调用场景___________________________
        /// <summary>
        /// 调用场景
        /// </summary>
        private async void SetSceneAction()
        {
            //这个场景不见的情况应该不可能
            var scene = HdlSceneLogic.Current.GetSceneUIBySceneId(this.SceneId);
            if (scene.SceneDelayTime <= 0 && scene.RemainTime <= 0)
            {
                //如果没有延迟的话,直接开启Loading特效
                this.StartLoadingApreal();
            }
            //执行调用场景
            var result = await HdlSceneLogic.Current.ControlScene(scene);
            if (result == false)
            {
                return;
            }
            //修改时间
            scene.RemainTime = scene.SceneDelayTime;
            scene.SceneDelayTime = 0;
            //开启延时倒计时特效
            this.StartRemainTimeApreal(scene);
        }
        #endregion
        #region ■ 刷新控件状态_______________________
        /// <summary>
        /// 刷新控件状态
        /// </summary>
        /// <param name="i_scene">场景对象</param>
        public void RefreshControlInfo(Common.SceneUI i_scene)
        {
            //场景名称必须刷新
            this.btnSceneName.Text = i_scene.Name;
            //刷新图片
            if (i_scene.IconPathType == 0)
            {
                //主页的场景卡片用的是另外的图
                string newPath = i_scene.IconPath.Replace("SceneIcon", "SceneCardIcon");
                if (this.btnScenePic.ImagePath != newPath)
                {
                    this.btnScenePic.ImagePath = newPath;
                }
            }
            else
            {
                string fullPath = System.IO.Path.Combine(Common.Config.Instance.FullPath, i_scene.IconPath);
                if (this.btnScenePic.ImagePath != fullPath)
                {
                    this.btnScenePic.ImagePath = fullPath;
                }
            }
            //开启延时倒计时特效
            this.StartRemainTimeApreal(i_scene);
        }
        #endregion
        #region ■ 延时倒计时特效_____________________
        /// <summary>
        /// 开启延时倒计时特效
        /// </summary>
        /// <param name="i_scene"></param>
        private void StartRemainTimeApreal(Common.SceneUI i_scene)
        {
            if (i_scene.RemainTime <= 0)
            {
                return;
            }
            int remainTine = i_scene.RemainTime;
            string hourText = Language.StringByID(R.MyInternationalizationString.Hour);
            string minuText = Language.StringByID(R.MyInternationalizationString.Minute);
            string secondText = Language.StringByID(R.MyInternationalizationString.Second);
            //时间图标不显示
            this.btnTimeIcon.Visible = false;
            //显示剩余的时间
            this.btnTimeView.Text = this.GetTimeString(i_scene.RemainTime, hourText, minuText, secondText);
            //开启内部延时时间线程(旨在全部地方的同一场景时间同步)
            HdlSceneLogic.Current.StartDelayTimeThread(i_scene);
            new System.Threading.Thread(() =>
            {
                while (remainTine > 0 && this.Parent != null)
                {
                    System.Threading.Thread.Sleep(1000);
                    Application.RunOnMainThread(() =>
                    {
                        this.btnTimeView.Text = this.GetTimeString(remainTine, hourText, minuText, secondText);
                    });
                    remainTine--;
                }
                Application.RunOnMainThread(() =>
                {
                    //倒计时结束时,时间图标显示
                    this.btnTimeIcon.Visible = true;
                    this.btnTimeView.Text = string.Empty;
                    //直接开启Loading特效
                    this.StartLoadingApreal();
                });
            })
            { IsBackground = true }.Start();
        }
        #endregion
        #region ■ Loading特效________________________
        /// <summary>
        /// 开启Loading特效
        /// </summary>
        private void StartLoadingApreal()
        {
            //弄个遮罩遮住
            var frameBack = new FrameLayout();
            frameBack.BackgroundImagePath = "Scene/SceneActionGroud.png";
            this.AddChidren(frameBack);
            //再加个转圈的
            var loadContr = new MyProgressLoading();
            loadContr.LoadingBackgroundColor = UserCenterColor.Current.Transparent;
            frameBack.AddChidren(loadContr);
            loadContr.StartLoading(1000);
            loadContr.DisponeEvent += () =>
            {
                frameBack.RemoveFromParent();
            };
        }
        #endregion
        #region ■ 控件摧毁___________________________
        /// <summary>
        /// 控件摧毁
        /// </summary>
        public override void RemoveFromParent()
        {
            this.CardNeedRemoveEvent = null;
            base.RemoveFromParent();
        }
        #endregion
        #region ■ 一般方法___________________________
        /// <summary>
        /// 获取时间的翻译文本
        /// </summary>
        /// <param name="second"></param>
        /// <param name="hourText">小时的文本</param>
        /// <param name="minuText">分的文本</param>
        /// <param name="secondText">秒的文本</param>
        /// <returns></returns>
        private string GetTimeString(int second, string hourText, string minuText, string secondText)
        {
            string timeStr = string.Empty;
            int hour = second / 3600;
            int minu = second % 3600 / 60;
            int sec = second % 60;
            if (hour > 0)
            {
                timeStr += hour + hourText;
            }
            if (minu > 0)
            {
                timeStr += minu + minuText;
            }
            if (sec > 0)
            {
                timeStr += sec + secondText;
            }
            return timeStr;
        }
        #endregion
        #region ■ 自定义控件_________________________
        /// <summary>
        /// 自定义控件(需要的它移除事件)
        /// </summary>
        private class MyProgressLoading : ProgressLoading
        {
            /// <summary>
            /// 控件销毁的事件
            /// </summary>
            public Action DisponeEvent = null;
            /// <summary>
            /// 控件销毁
            /// </summary>
            public override void RemoveFromParent()
            {
                base.RemoveFromParent();
                this.DisponeEvent?.Invoke();
                this.DisponeEvent = null;
            }
        }
        #endregion
    }
}