using System;
|
using System.Collections.Generic;
|
using AVFoundation;
|
using CoreGraphics;
|
using UIKit;
|
|
namespace HDL_ON
|
{
|
public class ZXingOverlayView : UIView
|
{
|
public UILabel textBottom;
|
UIView redLine;
|
public Action OnCancel;
|
public Action OnTorch;
|
public UIBarButtonItem cancelButton;
|
public UIBarButtonItem torchButton;
|
public string cancelText = "取消";
|
public string flashText = "闪光灯";
|
public string bottomText = "扫一扫";
|
|
CGSize screenSize = UIScreen.MainScreen.Bounds.Size;
|
|
public ZXingOverlayView(string cancelText = "取消", string flashText = "闪光灯", string titleText = "扫一扫") : base()
|
{
|
this.cancelText = cancelText;
|
this.flashText = flashText;
|
this.bottomText = titleText;
|
|
Opaque = false;
|
BackgroundColor = UIColor.Clear;
|
|
textBottom = new UILabel()
|
{
|
Frame = new CGRect(0, (screenSize.Height - 44 + screenSize.Width * 0.75f) / 2, screenSize.Width, 40f),
|
Text = bottomText,
|
Font = UIFont.SystemFontOfSize(13),
|
TextAlignment = UITextAlignment.Center,
|
TextColor = UIColor.White,
|
Lines = 0,
|
BackgroundColor = UIColor.Clear
|
};
|
this.AddSubview(textBottom);
|
|
var captureDevice = AVCaptureDevice.GetDefaultDevice(AVMediaType.Video);
|
|
bool hasTorch = false;
|
|
if (captureDevice != null)
|
hasTorch = captureDevice.TorchAvailable;
|
|
InvokeOnMainThread(delegate {
|
// Setting tool bar
|
var toolBar = new UIToolbar(new CGRect(0, Frame.Height - 44, Frame.Width, 44));
|
|
var buttons = new List<UIBarButtonItem>();
|
cancelButton = new UIBarButtonItem(cancelText, UIBarButtonItemStyle.Done, delegate { OnCancel?.Invoke(); });
|
cancelButton.SetTitleTextAttributes(new UITextAttributes { TextColor = UIColor.White }, UIControlState.Normal);
|
buttons.Add(cancelButton);
|
if (hasTorch)
|
{
|
buttons.Add(new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace));
|
|
torchButton = new UIBarButtonItem(flashText, UIBarButtonItemStyle.Done, delegate { OnTorch?.Invoke(); });
|
torchButton.SetTitleTextAttributes(new UITextAttributes { TextColor = UIColor.White }, UIControlState.Normal);
|
buttons.Add(torchButton);
|
}
|
|
toolBar.Items = buttons.ToArray();
|
toolBar.BarTintColor = UIColor.Clear;
|
toolBar.Translucent = true;
|
toolBar.TintColor = UIColor.Black;
|
toolBar.AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleTopMargin;
|
Add(toolBar);
|
});
|
|
}
|
|
public override void Draw(CGRect rect)
|
{
|
CGRect screenDrawRect = new CGRect(0, 0, screenSize.Width, screenSize.Height - 44);
|
|
//中间清空的矩形框
|
CGRect clearDrawRect = new CGRect(screenDrawRect.Size.Width * 0.125f, (screenDrawRect.Size.Height - screenDrawRect.Size.Width * 0.75f) / 2,
|
screenDrawRect.Size.Width * 0.75f, screenDrawRect.Size.Width * 0.75f);
|
|
CGContext ctx = UIGraphics.GetCurrentContext();
|
AddScreenFillRect(ctx, screenDrawRect);
|
AddCenterClearRect(ctx, clearDrawRect);
|
AddWhiteRect(ctx, clearDrawRect);
|
AddCornerLineWithContext(ctx, clearDrawRect);
|
}
|
//添加屏幕半透明填充色
|
private void AddScreenFillRect(CGContext ctx, CGRect rect)
|
{
|
ctx.SetFillColor(new CGColor(0, 0, 0, 0.5f));
|
ctx.FillRect(rect);
|
}
|
//添加中心全透明填充色
|
private void AddCenterClearRect(CGContext ctx, CGRect rect)
|
{
|
ctx.ClearRect(rect);
|
}
|
//根据点画线
|
private void AddLine(CGPoint[] pointA, CGPoint[] pointB, CGContext ctx)
|
{
|
ctx.SetLineWidth(2f);
|
ctx.AddLines(pointA);
|
ctx.AddLines(pointB);
|
}
|
//添加白色方框
|
private void AddWhiteRect(CGContext ctx, CGRect rect)
|
{
|
ctx.StrokeRect(rect);
|
ctx.SetStrokeColor(new CGColor(1, 1, 1, 1));
|
ctx.SetLineWidth(0.8f);
|
ctx.AddRect(rect);
|
ctx.StrokePath();
|
}
|
//添加四个角的蓝色
|
private void AddCornerLineWithContext(CGContext ctx, CGRect rect)
|
{
|
//画四个边角
|
ctx.SetLineWidth(2f);
|
ctx.SetStrokeColor(UIColor.FromRGB(22, 118, 188).CGColor);
|
|
//左上角
|
CGPoint[] poinsTopLeftA = new CGPoint[] { new CGPoint(rect.Location.X + 0.7f, rect.Location.Y), new CGPoint(rect.Location.X + 0.7f, rect.Location.Y + 15f) };
|
|
CGPoint[] poinsTopLeftB = new CGPoint[] { new CGPoint(rect.Location.X, rect.Location.Y + 0.7f), new CGPoint(rect.Location.X + 15f, rect.Location.Y + 0.7f) };
|
|
AddLine(poinsTopLeftA, poinsTopLeftB, ctx);
|
|
//左下角
|
CGPoint[] poinsBottomLeftA = new CGPoint[] { new CGPoint(rect.Location.X + 0.7f, rect.Location.Y + rect.Size.Height - 15f), new CGPoint(rect.Location.X + 0.7f, rect.Location.Y + rect.Size.Height) };
|
|
CGPoint[] poinsBottomLeftB = new CGPoint[] { new CGPoint(rect.Location.X, rect.Location.Y + rect.Size.Height - 0.7f), new CGPoint(rect.Location.X + 0.7f + 15f, rect.Location.Y + rect.Size.Height - 0.7f) };
|
|
AddLine(poinsBottomLeftA, poinsBottomLeftB, ctx);
|
|
//右上角
|
CGPoint[] poinsTopRightA = new CGPoint[] { new CGPoint(rect.Location.X + rect.Size.Width - 15f, rect.Location.Y + 0.7f), new CGPoint(rect.Location.X + rect.Size.Width, rect.Location.Y + 0.7) };
|
|
CGPoint[] poinsTopRightB = new CGPoint[] { new CGPoint(rect.Location.X + rect.Size.Width - 0.7f, rect.Location.Y), new CGPoint(rect.Location.X + rect.Size.Width - 0.7f, rect.Location.Y + 15 + 0.7) };
|
|
AddLine(poinsTopRightA, poinsTopRightB, ctx);
|
|
CGPoint[] poinsBottomRightA = new CGPoint[] { new CGPoint(rect.Location.X + rect.Size.Width - 0.7f, rect.Location.Y + rect.Size.Height - 15f), new CGPoint(rect.Location.X - 0.7f + rect.Size.Width, rect.Location.Y + rect.Size.Height) };
|
|
CGPoint[] poinsBottomRightB = new CGPoint[] { new CGPoint(rect.Location.X + rect.Size.Width - 15f, rect.Location.Y + rect.Size.Height - 0.7f), new CGPoint(rect.Location.X + rect.Size.Width, rect.Location.Y + rect.Size.Height - 0.7f) };
|
|
AddLine(poinsBottomRightA, poinsBottomRightB, ctx);
|
|
ctx.StrokePath();
|
}
|
|
public void Destroy()
|
{
|
InvokeOnMainThread(() => {
|
textBottom.RemoveFromSuperview();
|
redLine.RemoveFromSuperview();
|
|
textBottom = null;
|
redLine = null;
|
});
|
}
|
|
}
|
}
|