iphone - 如何确定 iPhone 晃动的方向

标签 iphone accelerometer

我正在使用加速度计滚动 UIScrollVIew 中的多个 subview 。我希望当用户向右滑动 iPhone 时 View (纵向)向右滚动,并在向左滑动设备时向左滚动。

我认为我可以通过记下正或负 x 加速度值来做到这一点,但我发现这些值通常是正值和负值的混合。我已将下限设置为 1.5g,以消除无抖动运动,并查看 0.5 秒持续时间内的 x 值。

我确信有一种三角方法可以确定轻弹的整体方向,并且您必须在轻弹运动的持续时间内测量值。我也确信有人已经解决了这个问题。

有什么想法吗?

谢谢

最佳答案

我开发了一个解决方案,它比建议的解决方案给了我更好的反馈(仅适用于左右摇动)。 我在这里所做的方式非常敏感(识别轻微的震动),但是可以通过更改 tresholdFirstMove 和 tresholdBackMove 来调整灵敏度(增加以降低灵敏度)

在 swift 中: (在你的 viewController 中。并添加“import CoreMotion”)

var startedLeftTilt = false
var startedRightTilt = false
var dateLastShake = NSDate(timeIntervalSinceNow: -2)
var dateStartedTilt = NSDate(timeIntervalSinceNow: -2)
var motionManager = CMMotionManager()
let tresholdFirstMove = 3.0
let tresholdBackMove = 0.5

override func viewDidLoad() {
    // your code

    motionManager.gyroUpdateInterval = 0.01
}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    motionManager.startGyroUpdatesToQueue(NSOperationQueue.currentQueue(), withHandler: { (gyroData, error) -> Void in
        self.handleGyroData(gyroData.rotationRate)
    })

}

private func handleGyroData(rotation: CMRotationRate) {

    if fabs(rotation.z) > tresholdFirstMove && fabs(dateLastShake.timeIntervalSinceNow) > 0.3
    {
        if !startedRightTilt && !startedLeftTilt
        {
            dateStartedTilt = NSDate()
            if (rotation.z > 0)
            {
                startedLeftTilt = true
                startedRightTilt = false
            }
            else
            {
                startedRightTilt = true
                startedLeftTilt = false
            }
        }
    }

    if fabs(dateStartedTilt.timeIntervalSinceNow) >= 0.3
    {
        startedRightTilt = false
        startedLeftTilt = false
    }
    else
    {
        if (fabs(rotation.z) > tresholdBackMove)
        {
            if startedLeftTilt && rotation.z < 0
            {
                dateLastShake = NSDate()
                startedRightTilt = false
                startedLeftTilt = false

                println("\\\n Shaked left\n/")
            }
            else if startedRightTilt && rotation.z > 0
            {
                dateLastShake = NSDate()
                startedRightTilt = false
                startedLeftTilt = false

                println("\\\n Shaked right\n/")
            }
        }
    }

}

关于iphone - 如何确定 iPhone 晃动的方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1018770/

相关文章:

iphone - 我的 ViewController 中未调用 awakeFromNib

javascript - React Native : How to compute x, y 和 z 轴旋转 Angular 基于陀螺仪传感器输出?

c - 倾斜磁力计输出 - 俯仰和滚动倾斜补偿 - 我迷路了

iphone - 为什么我无法再存储 UIWebView 的 UIScrollView 委托(delegate)属性?

iphone - 在 webview 显示本地 HTML 页面之前几毫秒出现空白屏幕

iphone - 将另一个 Nib 加载到 viewController 中

ios - XCode仍指示构建未运行时正在运行

Android 加速度计数据类

android - 从加速度计数据检测设备运动方向?

java - 安卓弹跳球