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);
}
}
}
}