如何识别屏幕高五
How to recognize a screen high-five
我有一个客户想要识别用户何时用整只手敲击屏幕,例如击掌。我怀疑苹果不会批准这个,但让我们把目光从那个地方移开。
我虽然使用了四指点击识别器,但这并没有真正涵盖它。最好的方法可能是检查用户的手是否覆盖了至少 70% 的屏幕,但我不知道该怎么做。
有人可以帮我吗?
您可以使用多点触摸事件处理来检测手指计数。检查这个 answer
您可以使用加速度计来检测手的影响并检查前置摄像头的反馈以找到由于手遮住摄像头而导致的相应暗帧*
*N.B。 iPhone 6+
上的人手可能不够大,无法盖住前置摄像头
有点解决了。接近度+加速度计效果很好。多点触控不起作用,因为它忽略了它不认为是水龙头的东西。
import UIKit
import CoreMotion
import AVFoundation
class ViewController: UIViewController {
var lastHighAccelerationEvent:NSDate? {
didSet {
checkForHighFive()
}
}
var lastProximityEvent:NSDate? {
didSet {
checkForHighFive()
}
}
var lastHighFive:NSDate?
var manager = CMMotionManager()
override func viewDidLoad() {
super.viewDidLoad()
//Start disabling the screen
UIDevice.currentDevice().proximityMonitoringEnabled = true
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(proximityChanged), name: UIDeviceProximityStateDidChangeNotification, object: nil)
//Check for acceloremeter
manager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue()) { (data, error) in
let sum = abs(data!.acceleration.y + data!.acceleration.z + data!.acceleration.x)
if sum > 3 {
self.lastHighAccelerationEvent = NSDate()
}
}
//Enable multitouch
self.view.multipleTouchEnabled = true
}
func checkForHighFive() {
if let lastHighFive = lastHighFive where abs(lastHighFive.timeIntervalSinceDate(NSDate())) < 1 {
print("Time filter")
return
}
guard let lastProximityEvent = lastProximityEvent else {return}
guard let lastHighAccelerationEvent = lastHighAccelerationEvent else {return}
if abs(lastProximityEvent.timeIntervalSinceDate(lastHighAccelerationEvent)) < 0.1 {
lastHighFive = NSDate()
playBoratHighFive()
}
}
func playBoratHighFive() {
print("High Five")
let player = try! AudioPlayer(fileName: "borat.mp3")
player.play()
}
func proximityChanged() {
if UIDevice.currentDevice().proximityState {
self.lastProximityEvent = NSDate()
}
}
}
我有一个客户想要识别用户何时用整只手敲击屏幕,例如击掌。我怀疑苹果不会批准这个,但让我们把目光从那个地方移开。
我虽然使用了四指点击识别器,但这并没有真正涵盖它。最好的方法可能是检查用户的手是否覆盖了至少 70% 的屏幕,但我不知道该怎么做。
有人可以帮我吗?
您可以使用多点触摸事件处理来检测手指计数。检查这个 answer
您可以使用加速度计来检测手的影响并检查前置摄像头的反馈以找到由于手遮住摄像头而导致的相应暗帧*
*N.B。 iPhone 6+
上的人手可能不够大,无法盖住前置摄像头有点解决了。接近度+加速度计效果很好。多点触控不起作用,因为它忽略了它不认为是水龙头的东西。
import UIKit
import CoreMotion
import AVFoundation
class ViewController: UIViewController {
var lastHighAccelerationEvent:NSDate? {
didSet {
checkForHighFive()
}
}
var lastProximityEvent:NSDate? {
didSet {
checkForHighFive()
}
}
var lastHighFive:NSDate?
var manager = CMMotionManager()
override func viewDidLoad() {
super.viewDidLoad()
//Start disabling the screen
UIDevice.currentDevice().proximityMonitoringEnabled = true
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(proximityChanged), name: UIDeviceProximityStateDidChangeNotification, object: nil)
//Check for acceloremeter
manager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue()) { (data, error) in
let sum = abs(data!.acceleration.y + data!.acceleration.z + data!.acceleration.x)
if sum > 3 {
self.lastHighAccelerationEvent = NSDate()
}
}
//Enable multitouch
self.view.multipleTouchEnabled = true
}
func checkForHighFive() {
if let lastHighFive = lastHighFive where abs(lastHighFive.timeIntervalSinceDate(NSDate())) < 1 {
print("Time filter")
return
}
guard let lastProximityEvent = lastProximityEvent else {return}
guard let lastHighAccelerationEvent = lastHighAccelerationEvent else {return}
if abs(lastProximityEvent.timeIntervalSinceDate(lastHighAccelerationEvent)) < 0.1 {
lastHighFive = NSDate()
playBoratHighFive()
}
}
func playBoratHighFive() {
print("High Five")
let player = try! AudioPlayer(fileName: "borat.mp3")
player.play()
}
func proximityChanged() {
if UIDevice.currentDevice().proximityState {
self.lastProximityEvent = NSDate()
}
}
}