Flutter - 方向锁定时的屏幕方向

问题描述 投票:0回答:2

我正在为我的 Flutter 应用程序创建一个相机屏幕。我需要知道用户是否将手机直立(纵向)或侧向(横向)。

  1. 我已将屏幕方向固定为纵向向上。
  2. 我尝试过使用 OrientationBuilder 小部件,但如果方向固定,它就不起作用。
  3. 另一种方法是在用户捕获图像时获取屏幕宽度和高度,并查看哪个值较大来决定方向。但如果方向固定,MediaQuery.of(context).size 也不会改变。

在将方向锁定为纵向后,有没有其他方法可以知道用户是直立(纵向)还是侧向(横向)握住手机??

提前致谢!

更新

因此,通过更多的挖掘,我可以使用 sensors_plus 包找到方向!

下面给出的是代码-

import 'package:flutter/material.dart';
import 'package:sensors_plus/sensors_plus.dart';

class OrientationWidget extends StatefulWidget {
  const OrientationWidget({super.key});

  @override
  State<OrientationWidget> createState() => _OrientationWidgetState();
}

class _OrientationWidgetState extends State<OrientationWidget> {
  double? x, y, z;

  String orientation = 'Portrait';

  @override
  void initState() {
    WidgetsBinding.instance.addPostFrameCallback((_) {
      accelerometerEvents.listen((AccelerometerEvent e) {
        x = e.x;
        y = e.y;
        z = e.z;
        setState(() {});
      });
    });
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    if (x != null && y != null) {
      if(x! > -1.5 && x! < 1.5 && y! > 8) {
        orientation = 'Portrait';
      } else if (x! > 8.5 && y! > -1.5 && y! < 1.5) {
        orientation = 'Landscape Left';
      } else if (x! < -8.5 && y! > -1.5 && y! < 1.5) {
        orientation = 'Landscape Right';
      }
    }

    return Center(
      child: Text(
        'Orientation : $orientation',
        style: const TextStyle(color: Colors.white),
      ),
    );
  }
}

但仍然无法判断横向方向是landscapeLeft还是landscapeRight。如果有人能够找到该解决方案,请发帖!

flutter camera orientation
2个回答
0
投票

您可以使用此插件确定方向:flutter_sensors

和这段代码:

StreamSubscription sensorSubscription;

sensorSubscription = userAccelerometerEvents.listen((UserAccelerometerEvent event) {
  if (event.x > 0.5) {
    print("Rotated to LandscapeRight");
  } else if (event.x < -0.5) {
    print("Rotated to LandscapeLeft");
  } else if (event.y > 0.5) {
    print("Rotated to PortraitUp");
  } else if (event.y < -0.5) {
    print("Rotated to PortraitDown");
  }
});

0
投票

供将来参考,这是我的做法。 我正在使用

sensors_plus: ^4.0.2
插件来访问来自加速度计的原始数据

简单代码:

 accelerometerEventStream().listen((AccelerometerEvent event) {
        int x = event.x.round();
        int y = event.y.round();
        int z = event.z.round();

        if (y > 8) {
          debugPrint("Portrait up");
        } else if (y < -8) {
          debugPrint("Portrait down");
        } else if (x > 8) {
          debugPrint("Landscape left");
        } else if (x < -8) {
          debugPrint("Landscape right");
        } else if (z > 8) {
          debugPrint("Facing up");
        } else if (z < -8) {
          debugPrint("Facing down");
        } 

      },
      onError: (error) {
        debugPrint('error: $error');
        },
      cancelOnError: true,
    );

说明: 当三轴加速度计中的一个轴的值在+9.8左右时,表明该轴方向向上(与重力加速度相反),即使设备静止。

请记住,三个轴固定在设备上。 3 axis accelerometer

© www.soinside.com 2019 - 2024. All rights reserved.