Detecting Shake Gesture by CoreMotion

北战南征 提交于 2020-12-06 15:56:18

问题


I want to detect device shake using coreMotion framework for iOS 7. Can anyone help me out how to do this ?

I wrote code described below in my viewDidAppear

CMMotionManager *motionManager = [[CMMotionManager alloc] init];
    motionManager.deviceMotionUpdateInterval = 1.0/60.0;

__block double myAcceleration;
[motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue]
                                   withHandler:^(CMDeviceMotion *motion, NSError *error)
 {
     myAcceleration = motion.userAcceleration.y;
     CATransform3D transform;
     transform = CATransform3DMakeRotation(
                                           motion.attitude.pitch, 1, 0, 0);
     transform = CATransform3DRotate(transform,
                                     motion.attitude.roll, 0, 1, 0);
     transform = CATransform3DRotate(transform,
                                     motion.attitude.yaw, 0, 0, 1);
 }
 ]; 

but not detecting shake.


回答1:


  #define accelerationThreshold  0.30

- (void)motionMethod:(CMDeviceMotion *)deviceMotion

{ 

 CMMotionManager *motionManager = [[CMMotionManager alloc] init];

    CMAcceleration userAcceleration = deviceMotion.userAcceleration;
    if (fabs(userAcceleration.x) > accelerationThreshold || fabs(userAcceleration.y) > accelerationThreshold || fabs(userAcceleration.z) > accelerationThreshold)
    {
        float sensitivity = 1;
        float x1 = 0, x2 = 0, y1 = 0, y2 = 0, z1 = 0, z2 = 0;

        double totalAccelerationInXY = sqrt(userAcceleration.x * userAcceleration.x +
                                            userAcceleration.y * userAcceleration.y);

        if (0.85 < totalAccelerationInXY < 3.45) {
            x1 = userAcceleration.x;
            y1 = userAcceleration.y;
            z1 = userAcceleration.z;

            float change = fabs(x1-x2+y1-y2+z1-z2);
            if (sensitivity < change) {

              // print change in position in coordinates.
                NSLog (@"total=%f x=%f y=%f z=%f timeStamp:%f, UpTime:%f", totalAccelerationInXY, userAcceleration.x, userAcceleration.y, userAcceleration.z, deviceMotion.timestamp, [[NSProcessInfo processInfo] systemUptime]);

                x2 = x1;
                y2 = y1;
                z2 = z1;
            }
        }
    }
}



回答2:


I know its old but i am posting for others who might be interested.

This Shake detection code can be also be used without ViewController or when the app is in the background (just by using the coremotion)

import CoreMotion

private var centralManager : CBCentralManager!

@IBOutlet weak var shakeLabel: UILabel!
let manager = CMMotionManager()

override func viewDidLoad() {
    super.viewDidLoad()

    var xInPositiveDirection = 0.0
    var xInNegativeDirection = 0.0
    var shakeCount = 0

    var tempVariable = 0

    manager.deviceMotionUpdateInterval = 0.02

    manager.startDeviceMotionUpdates(to: OperationQueue.main, withHandler: {
        (data, error) in


        if data!.userAcceleration.x > 1.0 || data!.userAcceleration.x < -1.0 {



            if data!.userAcceleration.x > 1.0 {
                xInPositiveDirection = data!.userAcceleration.x
            }

            if data!.userAcceleration.x < -1.0 {
                xInNegativeDirection = data!.userAcceleration.x
            }

            if xInPositiveDirection != 0.0 && xInNegativeDirection != 0.0 {
                shakeCount = shakeCount + 1
                xInPositiveDirection = 0.0
                xInNegativeDirection = 0.0
            }

            if shakeCount > 5 {
                tempVariable = tempVariable + 1
                self.shakeLabel.text = "Shaken! \(tempVariable)"
                shakeCount = 0
            }

        }
    })


来源:https://stackoverflow.com/questions/37983869/detecting-shake-gesture-by-coremotion

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!