- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究 flutter 和 swift 以定制我的相机。
我想在按下按钮时拍照。我怎样才能完成这个?
这是我的代码
.dart 文件
class IOSCompositionWidget extends StatefulWidget {
const IOSCompositionWidget({super.key});
@override
State<IOSCompositionWidget> createState() => _IOSCompositionWidgetState();
}
class _IOSCompositionWidgetState extends State<IOSCompositionWidget> {
static const platformChannel =
MethodChannel('com.vrin.methodchannel/cameraButton');
dynamic nativePhoto;
final String text = '';
@override
Widget build(BuildContext context) {
Map<String, dynamic> creationParams = <String, dynamic>{};
creationParams["text"] = text;
return Scaffold(
backgroundColor: Colors.black,
body: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(
height: MediaQuery.of(context).size.height * 0.068,
),
Padding(
padding: EdgeInsets.only(
left: MediaQuery.of(context).size.width * 0.062,
right: MediaQuery.of(context).size.width * 0.038,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
SvgPicture.asset(
'images/help.svg',
height: 24,
width: 24,
),
SizedBox(
width: MediaQuery.of(context).size.width * 0.026,
),
SvgPicture.asset(
'images/timer.svg',
height: 24,
width: 24,
),
],
),
Container(
height: MediaQuery.of(context).size.height * 0.028,
width: MediaQuery.of(context).size.width * 0.262,
color: Colors.white,
),
SvgPicture.asset(
'images/close.svg',
height: 24,
width: 24,
),
],
),
),
SizedBox(
height: MediaQuery.of(context).size.height * 0.017,
),
SizedBox(
height: MediaQuery.of(context).size.height * 0.646,
width: MediaQuery.of(context).size.width,
child: UiKitView(
viewType: 'NativeView',
creationParams: creationParams,
creationParamsCodec: const StandardMessageCodec(),
),
),
SizedBox(
height: MediaQuery.of(context).size.height * 0.063,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
GestureDetector(
onTap: () async {
print("pressed");
//TODO
},
child: Container(
height: 60,
width: 60,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(50),
),
),
),
],
),
],
),
);
}
}
我的 Swift 代码
AppDelegate.swift
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
if #available(iOS 12.0, *) {
UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
}
let nativeViewFactory = NativeViewFactory()
registrar(forPlugin: "Runner")!.register(nativeViewFactory, withId: "NativeView")
UIApplication.shared.setMinimumBackgroundFetchInterval(TimeInterval(60*15))
FirebaseApp.configure()
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
NativeViewFactory.swift
import Foundation
import Flutter
import UIKit
import AVFoundation
class NativeViewFactory: NSObject, FlutterPlatformViewFactory{
private var nativeView: NativeView?
private var messenger: FlutterBinaryMessenger?
func createArgsCodec() -> FlutterMessageCodec & NSObjectProtocol {
return FlutterStandardMessageCodec.sharedInstance()
}
override init(){
super.init()
}
init(messenger: FlutterBinaryMessenger) {
self.messenger = messenger
super.init()
}
func create(withFrame frame: CGRect, viewIdentifier viewId: Int64, arguments args: Any?) -> FlutterPlatformView {
self.nativeView = NativeView(
frame: frame,
viewIdentifier: viewId,
arguments: args,
binaryMessenger: messenger)
return nativeView ?? NativeView(
frame: frame,
viewIdentifier: viewId,
arguments: args,
binaryMessenger: messenger)
}
}
class NativeView: NSObject, FlutterPlatformView{
var likeAction: (() -> Void)?
private var returnView: UIView?
var previewView : UIView!
var boxView:UIView!
let myButton: UIButton = UIButton()
//Camera Capture requiered properties
var videoDataOutput: AVCaptureVideoDataOutput!
var videoDataOutputQueue: DispatchQueue!
var previewLayer:AVCaptureVideoPreviewLayer!
var captureDevice : AVCaptureDevice!
let session = AVCaptureSession()
var photoOutput: AVCapturePhotoOutput?
var imageData: Data?
var depthData: AVDepthData?
var depthDataMap: CVPixelBuffer?
override init() {
returnView = UIView()
super.init()
}
init(
frame: CGRect,
viewIdentifier viewId: Int64,
arguments args: Any?,
binaryMessenger messenger: FlutterBinaryMessenger?
) {
returnView = UIView()
super.init()
// iOS views can be created here
createNativeView(view: returnView!, args: args)
// ViewController()
}
func view() -> UIView {
return returnView!
}
func receiveGyeomViewMethod(){
print("receiveGyeomViewMethod")
}
@objc func onClickMyButton(sender: UIButton){
print("button pressed")
}
func createNativeView(view _view: UIView, args: Any?){
_view.backgroundColor = UIColor.black
previewView = UIView(frame: CGRect(x: 0, y: -150, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height))
previewView.contentMode = UIView.ContentMode.scaleAspectFit
view().addSubview(previewView)
self.setupAVCapture()
}
}
extension NativeView: AVCaptureVideoDataOutputSampleBufferDelegate{
func setupAVCapture(){
session.sessionPreset = AVCaptureSession.Preset.photo
let device = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInDualCamera, .builtInWideAngleCamera], mediaType: AVMediaType.video, position: .back).devices
print(device)
captureDevice = device.first
do {
let captureDeviceInput = try AVCaptureDeviceInput(device: captureDevice!)
session.addInput(captureDeviceInput)
photoOutput = AVCapturePhotoOutput()
//let pixelFormatType = "kCVPixelFormatType_DisparityFloat32"
// photoOutput?.setPreparedPhotoSettingsArray([AVCapturePhotoSettings(format: [AVVideoCodecKey : AVVideoCodecType.jpeg]
// )], completionHandler: nil)
photoOutput?.setPreparedPhotoSettingsArray([AVCapturePhotoSettings(format: [AVVideoCodecKey : AVVideoCodecType.hevc])], completionHandler: nil)
//captureSession.addOutput(photoOutput!)
if session.canAddOutput(photoOutput!) {
session.addOutput(photoOutput!)
photoOutput!.isDepthDataDeliveryEnabled = photoOutput!.isDepthDataDeliverySupported
}
} catch {
print(error)
}
beginSession()
}
func beginSession(){
var deviceInput: AVCaptureDeviceInput!
do {
deviceInput = try AVCaptureDeviceInput(device: captureDevice)
guard deviceInput != nil else {
print("error: cant get deviceInput")
return
}
if self.session.canAddInput(deviceInput){
self.session.addInput(deviceInput)
}
videoDataOutput = AVCaptureVideoDataOutput()
videoDataOutput.alwaysDiscardsLateVideoFrames=true
videoDataOutputQueue = DispatchQueue(label: "VideoDataOutputQueue")
videoDataOutput.setSampleBufferDelegate(self, queue:self.videoDataOutputQueue)
if session.canAddOutput(self.videoDataOutput){
session.addOutput(self.videoDataOutput)
}
videoDataOutput.connection(with: .video)?.isEnabled = true
previewLayer = AVCaptureVideoPreviewLayer(session: self.session)
previewLayer.videoGravity = AVLayerVideoGravity.resizeAspect
let rootLayer :CALayer = self.previewView.layer
rootLayer.masksToBounds=true
previewLayer.frame = rootLayer.bounds
rootLayer.addSublayer(self.previewLayer)
session.startRunning()
} catch let error as NSError {
deviceInput = nil
print("error: \(error.localizedDescription)")
}
}
// clean up AVCapture
func stopCamera(){
session.stopRunning()
}
}
我正在制作我的自定义相机,我需要在点击 flutter 按钮时拍照。
最佳答案
我想你可以创建一个 Flutter Plugin对于此功能。
要从 Flutter 调用 Swift,您可以使用 MethodChannel .
要将结果从 Swift 发送到 Flutter,您可以 EventChanel
关于ios - 如何从 flutter -> swift && swift -> flutter 传递数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74311451/
Github:https://github.com/jjvang/PassIntentDemo 我一直在关注有关按 Intent 传递对象的教程:https://www.javacodegeeks.c
我有一个 View ,其中包含自动生成的 text 类型的 input 框。当我单击“通过电子邮件发送结果”按钮时,代码会将您带到 CalculatedResults Controller 中的 Em
我有一个基本的docker镜像,我将以此为基础构建自己的镜像。我没有基础镜像的Dockerfile。 基本上,基本镜像使用两个--env arg,一个接受其许可证,一个选择在容器中激活哪个框架。我可以
假设我想计算 2^n 的总和,n 范围从 0 到 100。我可以编写以下内容: seq { 0 .. 100 } |> Seq.sumBy ((**) 2I) 但是,这与 (*) 或其他运算符/函数不
我有这个网址: http://www.example.com/get_url.php?ID=100&Link=http://www.test.com/page.php?l=1&m=7 当我打印 $_G
我想将 window.URL.createObjectURL(file) 创建的地址传递给 dancer.js 但我得到 GET blob:http%3A//localhost/b847c5cd-aa
我想知道如何将 typedef 传递给函数。例如: typedef int box[3][3]; box empty, *board[3][3]; 我如何将 board 传递给函数?我
我正在将一些代码从我的 Controller 移动到核心数据应用程序中的模型。 我编写了一个方法,该方法为我定期发出的特定获取请求返回 NSManagedObjectID。 + (NSManagedO
为什么我不能将类型化数组传递到采用 any[] 的函数/构造函数中? typedArray = new MyType[ ... ]; items = new ko.observableArray(ty
我是一名新的 Web 开发人员,正在学习 html5 和 javascript。 我有一个带有“选项卡”的网页,可以使网页的某些部分消失并重新出现。 链接如下: HOME 和 JavaScript 函
我试图将对函数的引用作为参数传递 很难解释 我会写一些伪代码示例 (calling function) function(hello()); function(pass) { if this =
我在尝试调用我正在创建的 C# 项目中的函数时遇到以下错误: System.Runtime.InteropServices.COMException: Operation is not allowed
使用 ksh。尝试重用当前脚本而不修改它,基本上可以归结为如下内容: `expr 5 $1 $2` 如何将乘法命令 (*) 作为参数 $1 传递? 我首先尝试使用“*”,甚至是\*,但没有用。我尝试
我一直在研究“Play for Java”这本书,这本书非常棒。我对 Java 还是很陌生,但我一直在关注这些示例,我有点卡在第 3 章上了。可以在此处找到代码:Play for Java on Gi
我知道 Javascript 中的对象是通过引用复制/传递的。但是函数呢? 当我跳到一些令人困惑的地方时,我正在尝试这段代码。这是代码片段: x = function() { console.log(
我希望能够像这样传递参数: fn(a>=b) or fn(a!=b) 我在 DjangoORM 和 SQLAlchemy 中看到了这种行为,但我不知道如何实现它。 最佳答案 ORM 使用 specia
在我的 Angular 项目中,我最近将 rxjs 升级到版本 6。现在,来自 npm 的模块(在 node_modules 文件夹内)由于一些破坏性更改而失败(旧的进口不再有效)。我为我的代码调整了
这个问题在这里已经有了答案: The issue of * in Command line argument (6 个答案) 关闭 3 年前。 我正在编写一个关于反向波兰表示法的 C 程序,它通过命
$(document).ready(function() { function GetDeals() { alert($(this).attr("id")); } $('.filter
下面是一个例子: 复制代码 代码如下: use strict; #这里是两个数组 my @i =('1','2','3'); my @j =('a','b','c'); &n
我是一名优秀的程序员,十分优秀!