CameraValue.aspectRatio 返回宽度/高度而不是高度/宽度,因为0.7.0 https://pub.dev/packages/camera/changelog,CameraPreview 现在处理 AspectRatio 本身,所以我认为工作代码片段如下:
/// only work inside WidgetsApp or MaterialApp, which introduces a MediaQuery
final scale = 1 / (controller.value.aspectRatio * MediaQuery.of(context).size.aspectRatio);
return Transform.scale(
scale: scale,
alignment: Alignment.topCenter,
child: CameraPreview(controller),
);
update:
通过变换缩放后,在用于预览时,预览可能会超出屏幕尺寸限制。过渡路线 https://api.flutter.dev/flutter/widgets/TransitionRoute-class.html。 (当托管在 CupertinoPageRoute 中时,拖动手势将清楚地显示这一点)。
所以我认为剪辑预览以使其完全匹配屏幕尺寸是个好主意。
final mediaSize = MediaQuery.of(context).size;
final scale = 1 / (controller.value.aspectRatio * mediaSize.aspectRatio);
return ClipRect(
clipper: _MediaSizeClipper(mediaSize),
child: Transform.scale(
scale: scale,
alignment: Alignment.topCenter,
child: CameraPreview(controller),
),
);
class _MediaSizeClipper extends CustomClipper<Rect> {
final Size mediaSize;
const _MediaSizeClipper(this.mediaSize);
@override
Rect getClip(Size size) {
return Rect.fromLTWH(0, 0, mediaSize.width, mediaSize.height);
}
@override
bool shouldReclip(CustomClipper<Rect> oldClipper) {
return true;
}
}