Mam tworzenie aplikacji na zegarek Apple. Logika polega na tym, że użytkownik podnosi rękę i dotyka przycisku z aplikacji. W tym czasie będę pobierał wartości akcelerometru. I ilekroć użytkownik podniesie rękę i osiągnie schwytaną pozycję, muszę wysłać wiadomość do iPhone'a.Jak wykryć pozycję zegarka Apple za pomocą akcelerometru i Gravity w szybkim tempie?
Dla mnie otrzymuję prawidłowe wartości Ale, To zawsze da wartości oparte na akcelerometrze. Co oznacza, że użytkownik nie podnosi ręki, ale wartości akcelerometru są zgodne. Więc wartości będą wysyłane na telefon komórkowy.
func startUpadateAccelerometer() {
self.motionManager.accelerometerUpdateInterval = 1.0/10.0
self.motionManager.startAccelerometerUpdates(to: OperationQueue()) { (accelerometerData, error) -> Void in
guard accelerometerData != nil else
{
print("There was an error: \(String(describing: error))")
return
}
DispatchQueue.main.async {
if(self.can_reset){
let differenceX : Bool = self.validateButtom(currentValue: accelerometerData!.acceleration.x, inititalValue: self.gravityReference.x)
let differenceY : Bool = self.validateButtom(currentValue: accelerometerData!.acceleration.y, inititalValue: self.gravityReference.y)
if(differenceX && differenceY && self.gravityOffsetDifference(currentValue: accelerometerData!.acceleration.x, referenceValue: self.gravityReference.x) && self.gravityOffsetDifference(currentValue: accelerometerData!.acceleration.y, referenceValue: self.gravityReference.y)){
WKInterfaceDevice().play(.success)
// self.addLog(_logStr: EventsTypes.Achievements1.rawValue)
self.logString += String(format: "X: %0.3f Y: %0.3f Z: %0.3f \n", accelerometerData!.acceleration.x,accelerometerData!.acceleration.y,accelerometerData!.acceleration.z)
self.m_XYZValueLbl.setText(self.logString)
self.is_RechedZeroPos = true
self.session?.sendMessage(["msg" : "\(self.logString)"], replyHandler: nil) { (error) in
NSLog("%@", "Error sending message: \(error)")
}
} else {
if(self.checkAchievements2_3(deviceMotionData: accelerometerData!.acceleration) == true) {
if self.is_RechedZeroPos == true {
self.addLog(_logStr: EventsTypes.Achievements2.rawValue)
self.is_RechedZeroPos = false
} else {
self.addLog(_logStr: EventsTypes.Achievements3.rawValue)
}
}
}
} else {
self.gravityReference = accelerometerData!.acceleration
//self.logString = String(format: "Reference Acceleration %0.3f %0.3f %0.3f \n", self.gravityReference.x,self.gravityReference.y,self.gravityReference.z)
self.can_reset = true
}
}
}
}
func validateButtom(currentValue : Double , inititalValue : Double) -> Bool {
if(currentValue == 0 && inititalValue == 0) {
return true
} else if(currentValue < 0 && inititalValue < 0) {
return true
} else if(currentValue > 0 && inititalValue > 0) {
return true
} else {
return false
}
}
func gravityOffsetDifference(currentValue : Double , referenceValue: Double) -> Bool {
var difference : Double!
if (fabs(currentValue) <= fabs(referenceValue)) {
difference = fabs(referenceValue) - fabs(currentValue)
} else {
difference = fabs(currentValue) - fabs(referenceValue)
}
if (difference <= gravityOffset) {
return true
} else {
return false
}
}
Proszę wskazać mi, aby uzyskać wartości tylko wtedy, gdy użytkownik przechwycił pozycję.
Wydaje się, że następujące informacje dotyczą Ciebie: https://forums.developer.apple.com/thread/3657 – fishinear
Nie otrzymałem dokładnie Twojego pytania. Gdy użytkownik podniesie ręce i dotknie przycisku, przechowuje informacje o akcelerometrze. Czy chcesz porównać i dopasować informacje o akcelerometrze, jeśli użytkownik ponownie podniesie ręce? –