黄学彪
2020-12-17 9f326f4000847e6167d8166fa2f6a66f53cb3734
ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelColorSelectForm.cs
@@ -23,15 +23,23 @@
        /// <summary>
        /// 当前选择的控件(外框)
        /// </summary>
        private FrameLayoutControl nowSelectIcon1 = null;
        private FrameLayoutStatuControl nowSelectIcon1 = null;
        /// <summary>
        /// 圆盘选择的颜色显示控件(外框)
        /// </summary>
        private FrameLayoutControl wheelSelectIcon1 = null;
        private FrameLayoutStatuControl wheelSelectIcon1 = null;
        /// <summary>
        /// 圆盘选择的颜色显示控件(内框)
        /// </summary>
        private IconViewControl wheelSelectIcon2 = null;
        /// <summary>
        /// 是否是颜色选择
        /// </summary>
        private bool isColorSelect = false;
        /// <summary>
        /// 颜色值输入控件
        /// </summary>
        private TextInputControl txtColorInput = null;
        #endregion
@@ -43,8 +51,10 @@
        /// <param name="i_R">R</param>
        /// <param name="i_G">G</param>
        /// <param name="i_B">B</param>
        public void ShowForm(int i_R,int i_G,int i_B)
        public void ShowForm(int i_R, int i_G, int i_B)
        {
            this.ScrollEnabled = false;
            //设置头部信息
            base.SetTitleText(Language.StringByID(R.MyInternationalizationString.uSelectColor));
@@ -95,17 +105,15 @@
        /// </summary>
        private void InitColorPictrueControl()
        {
            //圆盘控件的FrameLayout
            var frameBack = new FrameLayout();
            frameBack.Y = Application.GetRealHeight(66);
            frameBack.Height = Application.GetRealHeight(1204);
            bodyFrameLayout.AddChidren(frameBack);
            //初始化颜色输入控件
            this.txtColorInput = this.InitColorInputControl();
            var framePic = new FrameLayout();
            framePic.Width = Application.GetMinRealAverage(588);
            framePic.Height = Application.GetMinRealAverage(588);
            framePic.Gravity = Gravity.Center;
            frameBack.AddChidren(framePic);
            framePic.Width = this.GetPictrueRealSize(588);
            framePic.Height = this.GetPictrueRealSize(588);
            framePic.Gravity = Gravity.CenterHorizontal;
            framePic.Y = Application.GetRealHeight(192);
            bodyFrameLayout.AddChidren(framePic);
            //圆盘控件
            var colorPic = new ColorPicker();
@@ -116,36 +124,145 @@
            var btnWhiteView = new IconViewControl(30);
            btnWhiteView.Visible = false;
            btnWhiteView.BackgroundColor = UserCenterColor.Current.White;
            btnWhiteView.Radius = (uint)Application.GetMinRealAverage(30) / 2;
            btnWhiteView.Radius = (uint)this.GetPictrueRealSize(30) / 2;
            framePic.AddChidren(btnWhiteView);
            bool pointIsRight = false;
            //圆的半径
            int circleR = framePic.Width / 2 - this.GetPictrueRealSize(35);
            colorPic.ColorChaged += (sender, eColor) =>
            {
                if (pointIsRight == false)
                {
                    //点的区域不是圆盘内
                    return;
                }
                listRGB = new List<int>();
                listRGB.Add(Convert.ToInt32(Convert.ToString(eColor[0])));
                listRGB.Add(Convert.ToInt32(Convert.ToString(eColor[1])));
                listRGB.Add(Convert.ToInt32(Convert.ToString(eColor[2])));
                //显示选择颜色的控件
                if (nowSelectIcon1 != null)
                {
                    nowSelectIcon1.BorderColor = UserCenterColor.Current.White;
                }
                wheelSelectIcon2.BackgroundColor = this.GetColorByRGB(eColor[0], eColor[1], eColor[2]);
                wheelSelectIcon1.BorderColor = wheelSelectIcon2.BackgroundColor;
                wheelSelectIcon1.Name = listRGB[0] + "-" + listRGB[1] + "-" + listRGB[2];
                nowSelectIcon1 = wheelSelectIcon1;
                this.ShowNowSelectColorControl(eColor);
                //获取颜色的翻译文本
                isColorSelect = true;
                this.txtColorInput.Text = this.GetColorTextTranslate(listRGB[0], listRGB[1], listRGB[2]);
            };
            colorPic.MouseDownEventHandler += (sender, e) =>
            {
                pointIsRight = this.CheckPoint(circleR, framePic.Width / 2, framePic.Height / 2, (int)e.X, (int)e.Y);
                if (pointIsRight == false)
                {
                    //点的区域不是圆盘内
                    return;
                }
                //显示白点
                btnWhiteView.X = (int)e.X;
                btnWhiteView.Y = (int)e.Y;
                btnWhiteView.X = (int)e.X - btnWhiteView.Width / 2;
                btnWhiteView.Y = (int)e.Y - btnWhiteView.Height / 2;
                if (btnWhiteView.Visible == false)
                {
                    btnWhiteView.Visible = true;
                }
            };
            colorPic.MouseMoveEventHandler += (sender, e) =>
            {
                //当鼠标点下事件处理
                colorPic.MouseDownEventHandler(sender, e);
            };
            //手动输入值改变事件
            this.txtColorInput.TextChangeEventHandler += (sender, value) =>
            {
                if (isColorSelect == true)
                {
                    //这里是由点击色盘进行赋值触发
                    isColorSelect = false;
                    return;
                }
                //检测输入的颜色值
                var byteColor = this.CheckInputColorValue(value);
                if (byteColor == null)
                {
                    return;
                }
                if (btnWhiteView.Visible == true)
                {
                    //白点隐藏
                    btnWhiteView.Visible = false;
                }
                //记录缓存
                listRGB = new List<int>();
                listRGB.Add(Convert.ToInt32(Convert.ToString(byteColor[0])));
                listRGB.Add(Convert.ToInt32(Convert.ToString(byteColor[1])));
                listRGB.Add(Convert.ToInt32(Convert.ToString(byteColor[2])));
                //显示选择颜色的控件
                this.ShowNowSelectColorControl(byteColor);
            };
        }
        /// <summary>
        /// 初始化颜色输入控件
        /// </summary>
        /// <returns></returns>
        private TextInputControl InitColorInputControl()
        {
            //自定义色值的外框
            var frameInput = new NormalFrameLayout();
            frameInput.Width = Application.GetRealWidth(458);
            frameInput.Height = Application.GetRealHeight(104);
            frameInput.Y = Application.GetRealHeight(1103);
            frameInput.Gravity = Gravity.CenterHorizontal;
            frameInput.BorderColor = 0xffcccccc;
            frameInput.Radius = (uint)Application.GetRealWidth(17);
            frameInput.BorderWidth = Application.GetRealWidth(3) == 0 ? 1 : (uint)Application.GetRealWidth(3);
            bodyFrameLayout.AddChidren(frameInput);
            var btnMark = new NormalViewControl(100, 58, true);
            btnMark.X = Application.GetRealWidth(35);
            btnMark.Gravity = Gravity.CenterVertical;
            btnMark.IsBold = true;
            btnMark.Text = "# ";
            btnMark.Width = btnMark.GetRealWidthByText();
            btnMark.TextColor = UserCenterColor.Current.TextGrayColor2;
            frameInput.AddChidren(btnMark);
            //自定义色值输入框
            var txtInput = new TextInputControl(400, 58, true);
            txtInput.X = btnMark.Right;
            txtInput.Gravity = Gravity.CenterVertical;
            txtInput.TextSize = 16;
            txtInput.FrameBorder = frameInput;
            frameInput.AddChidren(txtInput);
            //色值号为6位(由任意数字+字母组合)
            var btnTipView = new NormalViewControl(bodyFrameLayout.Width, Application.GetRealHeight(55), false);
            btnTipView.Y = frameInput.Bottom + Application.GetRealHeight(20);
            btnTipView.IsBold = true;
            btnTipView.TextAlignment = TextAlignment.Center;
            btnTipView.TextColor = UserCenterColor.Current.TextGrayColor2;
            btnTipView.TextSize = 12;
            btnTipView.TextID = R.MyInternationalizationString.uColorLengthMsg;
            bodyFrameLayout.AddChidren(btnTipView);
            return txtInput;
        }
        /// <summary>
        /// 显示选择颜色的控件
        /// </summary>
        /// <param name="eColor"></param>
        private void ShowNowSelectColorControl(byte[] eColor)
        {
            //显示选择颜色的控件
            if (nowSelectIcon1 != null)
            {
                nowSelectIcon1.BorderColor = UserCenterColor.Current.White;
            }
            var uintColor = this.GetColorByRGB(eColor[0], eColor[1], eColor[2]);
            wheelSelectIcon2.BackgroundColor = uintColor;
            wheelSelectIcon1.BorderColor = 0xffcccccc;
            wheelSelectIcon1.Name = listRGB[0] + "-" + listRGB[1] + "-" + listRGB[2];
            nowSelectIcon1 = wheelSelectIcon1;
        }
        #endregion
@@ -163,26 +280,28 @@
            //控件数
            var listColor = this.InitSpareDefultColor();
            //X轴初始坐标
            int Xdefult = (bodyFrameLayout.Width - Application.GetMinRealAverage(80 + 24) * (listColor.Count - 1) - Application.GetMinRealAverage(80)) / 2;
            int Xdefult = (bodyFrameLayout.Width - this.GetPictrueRealSize(80 + 24) * (listColor.Count - 1) - this.GetPictrueRealSize(80)) / 2;
            for (int i = 0; i < listColor.Count; i++)
            {
                var dataColor = listColor[i];
                var btnFrame = new FrameLayoutControl();
                btnFrame.Height = Application.GetMinRealAverage(80);
                btnFrame.Width = Application.GetMinRealAverage(80);
                btnFrame.Radius = (uint)Application.GetMinRealAverage(80) / 2;
                btnFrame.X = Xdefult + i * Application.GetMinRealAverage(80 + 24);
                btnFrame.Y = Application.GetRealHeight(1054);
                var btnFrame = new FrameLayoutStatuControl();
                btnFrame.Height = this.GetPictrueRealSize(80);
                btnFrame.Width = this.GetPictrueRealSize(80);
                btnFrame.Radius = (uint)this.GetPictrueRealSize(80) / 2;
                btnFrame.X = Xdefult + i * this.GetPictrueRealSize(80 + 24);
                btnFrame.Y = Application.GetRealHeight(880);
                btnFrame.BackgroundColor = UserCenterColor.Current.White;
                btnFrame.BorderWidth = 2;
                btnFrame.BorderWidth = 1;
                btnFrame.BorderColor = UserCenterColor.Current.White;
                bodyFrameLayout.AddChidren(btnFrame);
                var btnIcon = new IconViewControl(60);
                //分两步计算,不然有可能它得出的结果有误差导致不居中
                int iconWidth = btnFrame.Height - this.GetPictrueRealSize(10) - this.GetPictrueRealSize(10);
                var btnIcon = new IconViewControl(iconWidth, false);
                btnIcon.Gravity = Gravity.Center;
                btnIcon.Radius = (uint)btnIcon.IconSize;
                btnFrame.AddChidren(btnIcon, ChidrenBindMode.BindEventOnly);
                btnIcon.Radius = (uint)btnIcon.IconSize / 2;
                btnFrame.AddChidren(btnIcon, ChidrenBindMode.BindEvent);
                if (dataColor != null)
                {
@@ -193,11 +312,15 @@
                else
                {
                    //原来的颜色
                    btnFrame.BorderColor = this.GetColorByRGB((byte)i_R, (byte)i_G, (byte)i_B);
                    btnIcon.BackgroundColor = btnFrame.BorderColor;
                    btnFrame.BorderColor = 0xffcccccc;
                    btnIcon.BackgroundColor = this.GetColorByRGB((byte)i_R, (byte)i_G, (byte)i_B);
                    wheelSelectIcon1 = btnFrame;
                    wheelSelectIcon2 = btnIcon;
                    nowSelectIcon1 = btnFrame;
                    //获取颜色的翻译文本
                    isColorSelect = true;
                    this.txtColorInput.Text = this.GetColorTextTranslate(i_R, i_G, i_B);
                }
                btnFrame.ButtonClickEvent += (sender, e) =>
@@ -207,7 +330,7 @@
                    {
                        nowSelectIcon1.BorderColor = UserCenterColor.Current.White;
                    }
                    btnFrame.BorderColor = btnIcon.BackgroundColor;
                    btnFrame.BorderColor = 0xffcccccc;
                    nowSelectIcon1 = btnFrame;
                    if (btnFrame.Name != null)
@@ -218,6 +341,9 @@
                        listRGB.Add(Convert.ToInt32(Convert.ToString(Arry[1])));
                        listRGB.Add(Convert.ToInt32(Convert.ToString(Arry[2])));
                    }
                    //获取颜色的翻译文本
                    isColorSelect = true;
                    this.txtColorInput.Text = this.GetColorTextTranslate(listRGB[0], listRGB[1], listRGB[2]);
                };
            }
        }
@@ -225,6 +351,35 @@
        #endregion
        #region ■ 一般方法___________________________
        /// <summary>
        /// 检测点击点
        /// </summary>
        /// <param name="circleR">圆的半径</param>
        /// <param name="circleX">圆心X轴</param>
        /// <param name="circleY">圆心Y轴</param>
        /// <param name="pointX">点击点的X轴</param>
        /// <param name="pointY">点击点的Y轴</param>
        /// <returns></returns>
        private bool CheckPoint(int circleR, int circleX, int circleY, int pointX, int pointY)
        {
            int dwidth = circleX - pointX;
            if (dwidth < 0) { dwidth *= -1; }
            int dHeight = circleY - pointY;
            if (dHeight < 0) { dHeight *= -1; }
            //根据三角函数,求三角形的斜边长
            int dlength = dwidth * dwidth + dHeight * dHeight;
            //半径长度(不开方,所以是按平方算)
            circleR *= circleR;
            if (dlength < circleR)
            {
                //如果组成的三角形并没有长过半径,则代表还在圆内(不允许点边界)
                return true;
            }
            return false;
        }
        /// <summary>
        /// 初始化备用颜色的默认值
@@ -241,6 +396,51 @@
            list.Add(new List<int>() { 255, 117, 67 });
            return list;
        }
        /// <summary>
        /// 检测输入的颜色值
        /// </summary>
        /// <param name="colorText"></param>
        /// <returns></returns>
        private byte[] CheckInputColorValue(string colorText)
        {
            //只有长度为6才处理
            if (colorText.Length != 6) { return null; }
            colorText = colorText.ToUpper();
            foreach (var c in colorText)
            {
                if (char.IsNumber(c) == true)
                {
                    //数字的话,OK
                    continue;
                }
                if ('A' <= c && c <= 'F')
                {
                    //A-F的话,OK
                    continue;
                }
                return null;
            }
            int R = Convert.ToInt32(colorText.Substring(0, 2), 16);
            int G = Convert.ToInt32(colorText.Substring(2, 2), 16);
            int B = Convert.ToInt32(colorText.Substring(4, 2), 16);
            return new byte[] { (byte)R, (byte)G, (byte)B };
        }
        /// <summary>
        /// 获取颜色的翻译文本
        /// </summary>
        /// <param name="i_R"></param>
        /// <param name="i_G"></param>
        /// <param name="i_B"></param>
        /// <returns></returns>
        private string GetColorTextTranslate(int i_R, int i_G, int i_B)
        {
            return Convert.ToString(i_R, 16).ToUpper().PadLeft(2, '0')
                + Convert.ToString(i_G, 16).ToUpper().PadLeft(2, '0')
                + Convert.ToString(i_B, 16).ToUpper().PadLeft(2, '0');
        }
        /// <summary>
@@ -262,11 +462,11 @@
        /// <summary>
        /// 界面关闭
        /// </summary>
        public override void CloseForm()
        public override void CloseFormBefore()
        {
            this.FinishSelectColorEvent = null;
            base.CloseForm();
            base.CloseFormBefore();
        }
        #endregion