using System; using CoreGraphics; using Foundation; using Shared.IO; using UIKit; namespace Shared { /// /// 色板 /// public class ColorPicker :View { MyUIImageView myUIImageView { get { return uiView as MyUIImageView; } set { uiView = value; } } /// /// Initializes a new instance of the class. /// public ColorPicker() { myUIImageView = new MyUIImageView(this) { }; } public override void Refresh() { base.Refresh(); //Width = (int)myUIImageView.Image.Size.Width; //Height = (int)myUIImageView.Image.Size.Height; } string colorImagePath; /// /// 色板图 /// /// The color image path. public string ColorImagePath { get { return colorImagePath; } set { colorImagePath = value; myUIImageView.Image = UIImage.FromFile(FileUtils.GetImageFilePath(colorImagePath)); } } /// /// 颜色变化 /// public Action ColorChaged; class MyUIImageView : UIImageView { [Weak] ColorPicker colorPicker; public MyUIImageView(ColorPicker colorPicker) { this.colorPicker = colorPicker; UserInteractionEnabled = true; } /// /// 点击开始 /// /// Touches. /// Evt. public override void TouchesBegan(NSSet touches, UIEvent evt) { colorPicker?.TouchEvent(EventActions.Down,(touches.AnyObject as UITouch).LocationInView(this) ); colorChaged(colorAtPixel((touches.AnyObject as UITouch).LocationInView(this))); } /// /// 移动 /// /// Touches. /// Evt. public override void TouchesMoved(NSSet touches, UIEvent evt) { colorPicker?.TouchEvent(EventActions.Move,(touches.AnyObject as UITouch).LocationInView(this)); colorChaged(colorAtPixel((touches.AnyObject as UITouch).LocationInView(this))); } /// /// 点击弹起 /// /// Touches. /// Evt. public override void TouchesEnded(NSSet touches, UIEvent evt) { colorPicker?.TouchEvent(EventActions.Up,(touches.AnyObject as UITouch).LocationInView(this)); colorChaged(colorAtPixel((touches.AnyObject as UITouch).LocationInView(this))); } public override void TouchesCancelled(NSSet touches, UIEvent evt) { colorPicker?.TouchEvent(EventActions.Cancel, (touches.AnyObject as UITouch).LocationInView(this)); } void colorChaged(UIColor uiColor) { nfloat r, g, b, a; uiColor.GetRGBA(out r, out g, out b, out a); if (r == 0 && g == 0 && b == 0) { return; } colorPicker?.ColorChaged?.Invoke(colorPicker,new byte[] { (byte)(r * 255), (byte)(g * 255), (byte)(b * 255) }); } UIColor colorAtPixel(CGPoint point) { var pointX = (int)(point.X *Image.Size.Width/ Frame.Width); var pointY = (int)(point.Y * Image.Size.Height / Frame.Height); if (Image.Size.Width < pointX) { pointX = (int)Image.Size.Width; } if (Image.Size.Height < pointY) { pointY = (int)Image.Size.Height; } var cgImage = Image.CGImage; var colorSpace = CGColorSpace.CreateDeviceRGB(); int bytesPerPixel = 4; int bytesPerRow = bytesPerPixel * 1; var bitsPerComponent = 8; byte[] pixelData = { 0, 0, 0, 0 }; var context = new CGBitmapContext(pixelData, 1, 1, bitsPerComponent, bytesPerRow, colorSpace, CGBitmapFlags.PremultipliedLast | CGBitmapFlags.ByteOrder32Big); context.SetBlendMode(CGBlendMode.Copy); context.TranslateCTM(-pointX, pointY - Image.Size.Height); context.DrawImage(new CGRect(0.0f, 0.0f, Image.Size.Width, Image.Size.Height), cgImage); var red = pixelData[0] / 255.0f; var green = pixelData[1] / 255.0f; var blue = pixelData[2] / 255.0f; var alpha = pixelData[3] / 255.0f; return UIColor.FromRGBA(red, green, blue, alpha); } } } }