using System; using System.Collections.Generic; using System.Text; using ZigBee.Device; namespace Shared.Phone.UserCenter.DevicePanel { /// /// 按键面板的颜色选择界面 /// public class PanelColorSelectForm : EditorCommonForm { #region ■ 变量声明___________________________ /// /// 颜色选择结束的事件(R,G,B) /// public Action FinishSelectColorEvent; /// /// 选择的RGB /// private List listRGB = null; /// /// 当前选择的控件(外框) /// private FrameLayoutStatuControl nowSelectIcon1 = null; /// /// 圆盘选择的颜色显示控件(外框) /// private FrameLayoutStatuControl wheelSelectIcon1 = null; /// /// 圆盘选择的颜色显示控件(内框) /// private IconViewControl wheelSelectIcon2 = null; /// /// 是否是颜色选择 /// private bool isColorSelect = false; /// /// 颜色值输入控件 /// private TextInputControl txtColorInput = null; #endregion #region ■ 初始化_____________________________ /// /// 画面显示(底层会固定调用此方法,借以完成画面创建) /// /// R /// G /// B public void ShowForm(int i_R, int i_G, int i_B) { this.ScrollEnabled = false; //设置头部信息 base.SetTitleText(Language.StringByID(R.MyInternationalizationString.uSelectColor)); //初始化中部信息 this.InitMiddleFrame(i_R, i_G, i_B); //确定 var btnfinish = new BottomClickButton(); btnfinish.TextID = R.MyInternationalizationString.Confrim; bodyFrameLayout.AddChidren(btnfinish); btnfinish.MouseUpEventHandler += (sender, e) => { if (listRGB == null || FinishSelectColorEvent == null) { this.CloseForm(); return; } //回调函数 this.FinishSelectColorEvent(listRGB[0], listRGB[1], listRGB[2]); this.CloseForm(); }; } /// /// 初始化中部信息 /// /// R /// G /// B private void InitMiddleFrame(int i_R, int i_G, int i_B) { bodyFrameLayout.BackgroundColor = UserCenterColor.Current.White; //清空bodyFrame this.ClearBodyFrame(); //初始化颜色圆盘控件 this.InitColorPictrueControl(); //初始化备用颜色的控件 this.InitSpareColorControl(i_R, i_G, i_B); } #endregion #region ■ 初始化颜色圆盘_____________________ /// /// 初始化颜色圆盘控件 /// private void InitColorPictrueControl() { //初始化颜色输入控件 this.txtColorInput = this.InitColorInputControl(); var framePic = new FrameLayout(); 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(); colorPic.ColorImagePath = "Item/PickerColorWheel.png"; framePic.AddChidren(colorPic); //白点控件 var btnWhiteView = new IconViewControl(30); btnWhiteView.Visible = false; btnWhiteView.BackgroundColor = UserCenterColor.Current.White; 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(); listRGB.Add(Convert.ToInt32(Convert.ToString(eColor[0]))); listRGB.Add(Convert.ToInt32(Convert.ToString(eColor[1]))); listRGB.Add(Convert.ToInt32(Convert.ToString(eColor[2]))); //显示选择颜色的控件 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.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(); 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); }; } /// /// 初始化颜色输入控件 /// /// 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; } /// /// 显示选择颜色的控件 /// /// 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 #region ■ 初始化预选颜色_____________________ /// /// 初始化备用颜色的控件 /// /// R /// G /// B private void InitSpareColorControl(int i_R, int i_G, int i_B) { //控件数 var listColor = this.InitSpareDefultColor(); //X轴初始坐标 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 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 = 1; btnFrame.BorderColor = UserCenterColor.Current.White; bodyFrameLayout.AddChidren(btnFrame); //分两步计算,不然有可能它得出的结果有误差导致不居中 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 / 2; btnFrame.AddChidren(btnIcon, ChidrenBindMode.BindEvent); if (dataColor != null) { //预设置的颜色 btnFrame.Name = dataColor[0] + "-" + dataColor[1] + "-" + dataColor[2]; btnIcon.BackgroundColor = this.GetColorByRGB((byte)dataColor[0], (byte)dataColor[1], (byte)dataColor[2]); } else { //原来的颜色 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) => { //显示选择颜色的控件 if (nowSelectIcon1 != null) { nowSelectIcon1.BorderColor = UserCenterColor.Current.White; } btnFrame.BorderColor = 0xffcccccc; nowSelectIcon1 = btnFrame; if (btnFrame.Name != null) { listRGB = new List(); string[] Arry = btnFrame.Name.Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries); listRGB.Add(Convert.ToInt32(Convert.ToString(Arry[0]))); 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]); }; } } #endregion #region ■ 一般方法___________________________ /// /// 检测点击点 /// /// 圆的半径 /// 圆心X轴 /// 圆心Y轴 /// 点击点的X轴 /// 点击点的Y轴 /// 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; } /// /// 初始化备用颜色的默认值 /// /// private List> InitSpareDefultColor() { var list = new List>(); list.Add(new List() { 253, 226, 39 }); list.Add(new List() { 121, 255, 197 }); list.Add(null); list.Add(new List() { 198, 85, 250 }); list.Add(new List() { 255, 117, 67 }); return list; } /// /// 检测输入的颜色值 /// /// /// 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 }; } /// /// 获取颜色的翻译文本 /// /// /// /// /// 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'); } /// /// 将RGB转换为颜色 /// /// /// /// /// private uint GetColorByRGB(byte R, byte G, byte B) { return (uint)(0xFF000000 + R * 256 * 256 + G * 256 + B); } #endregion #region ■ 界面关闭___________________________ /// /// 界面关闭 /// public override void CloseFormBefore() { this.FinishSelectColorEvent = null; base.CloseFormBefore(); } #endregion } }