HDL Home App 第二版本 旧平台金堂用 正在使用
ZigbeeApp/Home.Ios/ZXingOverlayView.cs
New file
@@ -0,0 +1,168 @@
using System;
using System.Collections.Generic;
using AVFoundation;
using CoreGraphics;
using UIKit;
namespace Home.IOS
{
    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;
            });
        }
    }
}