Этот репозиторий содержит Flutter плагины для платформы ОС Аврора.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

100 lines
2.6 KiB

// SPDX-FileCopyrightText: Copyright 2023 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause
import 'package:camera_aurora/camera_aurora_platform_interface.dart';
import 'package:flutter/material.dart';
import 'camera_data.dart';
class CameraViewfinder extends StatefulWidget {
const CameraViewfinder({
super.key,
required this.width,
required this.height,
});
final double width;
final double height;
@override
State<CameraViewfinder> createState() => _CameraViewfinderState();
}
class _CameraViewfinderState extends State<CameraViewfinder> {
CameraState _cameraState = CameraState.fromJson({});
@override
initState() {
super.initState();
CameraAuroraPlatform.instance.startCapture(widget.width, widget.height);
CameraAuroraPlatform.instance.onChangeState().listen((event) {
if (mounted) {
setState(() {
_cameraState = event;
});
}
});
}
@override
void dispose() {
super.dispose();
CameraAuroraPlatform.instance.stopCapture();
}
@override
Widget build(BuildContext context) {
if (_cameraState.hasError()) {
return Center(
child: Text(
'Error: ${_cameraState.error}',
style:
const TextStyle(fontWeight: FontWeight.bold, color: Colors.white),
),
);
} else if (_cameraState.isNotEmpty()) {
int turn = 0;
switch (_cameraState.rotationDisplay) {
case 0:
turn = _cameraState.id.contains('front') ? -1 : 1;
break;
case 90:
turn = 0;
break;
case 180:
turn = _cameraState.id.contains('front') ? 1 : -1;
break;
default: // 270
turn = 2;
}
double height = 10;
double width = 10;
if (_cameraState.height != 0 && _cameraState.width != 0) {
if (_cameraState.rotationDisplay == 90 ||
_cameraState.rotationDisplay == 270) {
width = widget.width * _cameraState.height / _cameraState.width;
height = widget.height * _cameraState.width / _cameraState.height;
} else {
width = _cameraState.height * widget.height / _cameraState.width;
height = _cameraState.width * widget.width / _cameraState.height;
}
}
return RotatedBox(
quarterTurns: turn,
child: SizedBox(
width: height, // height
height: width, // widht
child: Opacity(
opacity: _cameraState.height == 0 ? 0 : 1,
child: Texture(textureId: _cameraState.textureId),
),
),
);
}
return const SizedBox.shrink();
}
}