52 lines
1.5 KiB
Swift
52 lines
1.5 KiB
Swift
|
|
//
|
|||
|
|
// UsbCameraView.swift
|
|||
|
|
// usb_camera_android
|
|||
|
|
//
|
|||
|
|
// iOS 原生预览 PlatformView:用 AVCaptureVideoPreviewLayer 直接渲染 session。
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
import AVFoundation
|
|||
|
|
import Flutter
|
|||
|
|
import UIKit
|
|||
|
|
|
|||
|
|
/// 以 AVCaptureVideoPreviewLayer 作为 backing layer 的 UIView。
|
|||
|
|
final class UsbCameraPreviewUIView: UIView {
|
|||
|
|
override class var layerClass: AnyClass { AVCaptureVideoPreviewLayer.self }
|
|||
|
|
var previewLayer: AVCaptureVideoPreviewLayer {
|
|||
|
|
return layer as! AVCaptureVideoPreviewLayer
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
final class UsbCameraView: NSObject, FlutterPlatformView {
|
|||
|
|
private let previewView: UsbCameraPreviewUIView
|
|||
|
|
|
|||
|
|
init(engine: UsbCameraEngine, frame: CGRect) {
|
|||
|
|
self.previewView = UsbCameraPreviewUIView(frame: frame)
|
|||
|
|
super.init()
|
|||
|
|
previewView.previewLayer.session = engine.captureSession
|
|||
|
|
previewView.previewLayer.videoGravity = .resizeAspect
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func view() -> UIView {
|
|||
|
|
return previewView
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
final class UsbCameraViewFactory: NSObject, FlutterPlatformViewFactory {
|
|||
|
|
private let engine: UsbCameraEngine
|
|||
|
|
|
|||
|
|
init(engine: UsbCameraEngine) {
|
|||
|
|
self.engine = engine
|
|||
|
|
super.init()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func createArgsCodec() -> FlutterMessageCodec & NSObjectProtocol {
|
|||
|
|
return FlutterStandardMessageCodec.sharedInstance()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func create(withFrame frame: CGRect, viewIdentifier viewId: Int64,
|
|||
|
|
arguments args: Any?) -> FlutterPlatformView {
|
|||
|
|
return UsbCameraView(engine: engine, frame: frame)
|
|||
|
|
}
|
|||
|
|
}
|