using Shared.Phone.UserCenter; using System; using System.Collections.Generic; using System.Text; namespace Shared.Phone.MainPage.Controls { /// /// 场景卡片控件 /// public class SceneCardControl : FrameLayoutStatuControl { #region ■ 变量声明___________________________ /// /// 卡片需要被移除的事件 /// public Action CardNeedRemoveEvent = null; /// /// 场景图片控件 /// private ImageView btnScenePic = null; /// /// 场景背景图控件 /// private PicViewControl btnSceneBackGroud = null; /// /// 时间图标控件 /// private IconViewControl btnTimeIcon = null; /// /// 延时时间显示控件 /// private NormalViewControl btnTimeView = null; /// /// 场景名字控件 /// private NormalViewControl btnSceneName = null; /// /// 场景ID /// private int SceneId = 0; #endregion #region ■ 初始化_____________________________ /// /// 场景卡片控件(宽度:458 + 14 * 2 高度:305 + 43) /// 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.CanClick = false; this.SetSceneAction(); }; } /// /// 初始化控件 /// /// 场景对象 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.BindEvent); //延时时间显示控件 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.BindEvent); //时间图标控件 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) => { //选择的是不开启 if (time == 0) { return; } i_scene.SceneDelayTime = time; //时间图标不显示 this.btnTimeIcon.Visible = false; //显示剩余的时间 this.btnTimeView.Text = this.GetTimeString(time, hourText, minuText, secondText); //选择延时时,需要刷新主页 UserView.UserPage.Instance.RefreshAllForm = true; }; }; //收藏控件 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.NowMainPageRoom.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.BindEvent); //刷新控件状态 this.RefreshControlInfo(i_scene); } #endregion #region ■ 调用场景___________________________ /// /// 调用场景 /// 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) { this.CanClick = true; return; } if (scene.SceneDelayTime > 0) { //调用有延时的场景,需要刷新主页 UserView.UserPage.Instance.RefreshAllForm = true; } //修改时间 scene.RemainTime = scene.SceneDelayTime; scene.SceneDelayTime = 0; //开启延时倒计时特效 this.StartRemainTimeApreal(scene); } #endregion #region ■ 刷新控件状态_______________________ /// /// 刷新控件状态 /// /// 场景对象 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.CanClick = false; this.StartRemainTimeApreal(i_scene); } #endregion #region ■ 延时倒计时特效_____________________ /// /// 开启延时倒计时特效 /// /// private void StartRemainTimeApreal(Common.SceneUI i_scene) { if (i_scene.RemainTime <= 0) { this.CanClick = true; 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); HdlThreadLogic.Current.RunMain(() => { this.btnTimeView.Text = this.GetTimeString(remainTine, hourText, minuText, secondText); }, ShowErrorMode.NO); remainTine--; } HdlThreadLogic.Current.RunMain(() => { //倒计时结束时,时间图标显示 this.btnTimeIcon.Visible = true; this.btnTimeView.Text = string.Empty; //直接开启Loading特效 this.StartLoadingApreal(); this.CanClick = true; }, ShowErrorMode.NO); }) { IsBackground = true }.Start(); } #endregion #region ■ Loading特效________________________ /// /// 开启Loading特效 /// 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 ■ 控件摧毁___________________________ /// /// 控件摧毁 /// public override void RemoveFromParent() { this.CardNeedRemoveEvent = null; base.RemoveFromParent(); } #endregion #region ■ 一般方法___________________________ /// /// 获取时间的翻译文本 /// /// /// 小时的文本 /// 分的文本 /// 秒的文本 /// 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 ■ 自定义控件_________________________ /// /// 自定义控件(需要的它移除事件) /// private class MyProgressLoading : ProgressLoading { /// /// 控件销毁的事件 /// public Action DisponeEvent = null; /// /// 控件销毁 /// public override void RemoveFromParent() { base.RemoveFromParent(); this.DisponeEvent?.Invoke(); this.DisponeEvent = null; } } #endregion } }