代码之家  ›  专栏  ›  技术社区  ›  Mark Mooibroek

颤振设备震动iOS插件

  •  0
  • Mark Mooibroek  · 技术社区  · 8 年前

    晚上的伙计们,

    我正在研究为颤振建立一个插件,检测设备是否在震动。现在我发现了如何在技术上用swift( Detect shake gesture IOS Swift )但我一直在研究如何将它作为flutter插件连接起来,因为我没有直接访问视图控制器生命周期事件的权限。

    需要一种连接方式

    • 视图加载
    • CanbecomeFirstResponder(CanbecomeFirstResponder)
    • 运动结束

    有人能把我推向正确的方向吗?

    3 回复  |  直到 7 年前
        1
  •  2
  •   creativecreatorormaybenot    8 年前

    这个 颤振小组 已发布 a plugin called sensors ,可用于检测 加速度计 (还有陀螺仪)。

    import 'package:sensors/sensors.dart';
    
    accelerometerEvents.listen((AccelerometerEvent event) {
      // "calculate" "shakes" here
    });
    

    这个 event 包含 x ,请 y 和 z 价值观。将此与时间相结合,可以检查震动。

    我只是指出这一点,因为这比创建一个 完整插件 从头开始。

        2
  •  2
  •   Serge B.    8 年前

    我也遇到了同样的问题,所以我想 Reactive Programming 和 RxDart 会有帮助的。

    您可以创建一个 BLoC (业务逻辑组件)调用 sensor_bloc.dart 以下内容:

     import 'dart:async';
    import 'dart:math';
    import 'package:rxdart/rxdart.dart';
    import 'package:sensors/sensors.dart';
    
    class SensorBloc {
    
      StreamSubscription<dynamic> _accelerometerStream;
    
      //INPUT
      final _thresholdController = StreamController<int>();
      Sink<int> get threshold => _thresholdController.sink;
    
    
      // OUTPUT
      final  _shakeDetector = StreamController<bool>();
      Stream<bool> get shakeEvent => _shakeDetector.stream.transform(ThrottleStreamTransformer(Duration(seconds: 2)));
    
    
      SensorBloc() {
        const CircularBufferSize = 10;
        double detectionThreshold = 70.0;
    
        List<double> circularBuffer = List.filled(CircularBufferSize,0.0);
        int index = 0;
        double minX=0.0, maxX=0.0;
    
        _thresholdController.stream.listen((value){
          // safety
          if (value > 30) detectionThreshold = value*1.0;
        });
    
        _accelerometerStream =  accelerometerEvents.listen((AccelerometerEvent event){
            index = (index == CircularBufferSize -1 ) ? 0: index+1;
    
            var oldX = circularBuffer[index];
    
            if (oldX == maxX) {
              maxX = circularBuffer.reduce(max);
            }
            if (oldX == minX) {
              minX = circularBuffer.reduce(min);
            }
    
            circularBuffer[index] = event.x;
            if (event.x < minX ) minX=event.x;
            if (event.x> maxX) maxX = event.x;
    
            if (maxX-minX>detectionThreshold)
            {
              _shakeDetector.add(true);
              circularBuffer.fillRange(0, CircularBufferSize, 0.0);
              minX=0.0;
              maxX=0.0;
            }
    
    
        });
    
      }
    
    
    
      void dispose() {
        _shakeDetector.close();
        _accelerometerStream.cancel();
       _thresholdController.close();
      }
    }
    

    然后,只需在小部件中订阅它的事件: 申报 StreamSubscription<bool> shakeSubscriber ; 在您的状态下,并连接到生命周期事件

    (注意:我使用一个继承的小部件,它允许我通过静态函数访问伞形块。 MainWidget.bloc(context) )以下内容:

    StreamSubscription<bool> shakeSubscriber ;      
    
    @override
    
      Widget build(BuildContext context) {
    
        if(shakeSubscriber == null ) {
          MainWidget.bloc(context).sensorBloc.shakeEvent.listen((_){
            print("SHAKE ! *************************");
          });
    
        }
    
        return _buildMainScaffold();
      }
    
      @override
      void dispose() {
        if(shakeSubscriber != null ) shakeSubscriber.cancel();
    
        super.dispose();
      }
    
        3
  •  1
  •   Aegletes    7 年前

    你可以试试这个插件: shake_event

    使用iOS和Android都很简单,而且都可以工作。