您好,登錄后才能下訂單哦!
前言
TapticEngine是什么總的來(lái)說(shuō),TapticEngine是蘋果產(chǎn)品上推出的全新震動(dòng)模塊名稱,最早出現(xiàn)在AppleWatch中,蘋果iPhone6s和iPhone6sPlus也內(nèi)置了TapticEngine,設(shè)計(jì)上有所升級(jí)。TapticEngine的全新震動(dòng)模塊,這顆震動(dòng)模塊經(jīng)過(guò)特殊設(shè)計(jì),能在短時(shí)間內(nèi)達(dá)到震動(dòng)的最佳狀態(tài),是普通振動(dòng)馬達(dá)所做不到的。Taptic這個(gè)單詞本身沒(méi)有什么含義,比較接近的詞是Haptic(觸覺(jué))。
TapticEngine工作原理傳統(tǒng)的手機(jī)震動(dòng)器是馬達(dá)帶著偏振片一起轉(zhuǎn)動(dòng),從而產(chǎn)生震動(dòng)。
大概是這個(gè)樣子滴。
而TapticEngine是直線電機(jī)驅(qū)動(dòng)帶著震塊做直線往返運(yùn)動(dòng)??纯聪旅孢@兩張蜜汁動(dòng)感的示意圖,你就一下子就明白它是怎么產(chǎn)生震動(dòng)的了。
iPhone6s的內(nèi)置的TapticEngine
AppleWatch的內(nèi)置的TapticEngine,左邊集成了揚(yáng)聲器
Taptic Engine 振動(dòng)模塊為 Apple Watch 以及 iPhone 6s、iPhone 7 提供了 Force Touch 以及 3D Touch,不同的屏幕操作,可以感受到不同的振動(dòng)觸覺(jué)效果,帶來(lái)更好的用戶體驗(yàn)。
What has Happened?
上周,leader 拿著 iPhone 7 打開(kāi)了網(wǎng)易新聞,問(wèn)我:『你看,你這里的下拉刷新是短震動(dòng),我們的手機(jī)數(shù)周遙控電視的時(shí)候只有長(zhǎng)震動(dòng),產(chǎn)品那邊問(wèn)能不能用短震動(dòng)』。
然后博主就去查看了一下關(guān)于短震動(dòng)的方式,整個(gè)過(guò)程可以描述為——『資料真少!』。
不過(guò)最后通過(guò)一下午的搜集,最終還是總結(jié)整理出來(lái)了這份文檔,也補(bǔ)充了自己對(duì) iPhone 6s 之后對(duì) Taptic Engine 的了解。
短震方法一 AudioServicesPlaySystemSound
常用調(diào)用:
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
以上代碼在各個(gè)型號(hào)手機(jī)中反應(yīng)為長(zhǎng)震
API 系統(tǒng)版本支持:
__OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_2_0);
APPLE 公開(kāi)的 SystemSoundID 有:
CF_ENUM(SystemSoundID) { kSystemSoundID_UserPreferredAlert = 0x00001000, kSystemSoundID_FlashScreen = 0x00000FFE, // this has been renamed to be consistent kUserPreferredAlert = kSystemSoundID_UserPreferredAlert }; CF_ENUM(SystemSoundID) { kSystemSoundID_Vibrate = 0x00000FFF };
以上類型 沒(méi)有短震動(dòng) 。
但通過(guò)以下代碼,可以得到更多類型的震動(dòng):
// 普通短震,3D Touch 中 Peek 震動(dòng)反饋 AudioServicesPlaySystemSound(1519);
// 普通短震,3D Touch 中 Pop 震動(dòng)反饋 AudioServicesPlaySystemSound(1520);
// 連續(xù)三次短震 AudioServicesPlaySystemSound(1521);
但以上 ID 均未在 Apple 的 Documents 中描述。顯然,這是調(diào)用了一些私有一些屬性 。
關(guān)于是否調(diào)用了私有 API,也有一些討論,可以查看這里。
短震方法二 獲取 _tapticEngine
這種方法是從這里搜集到的。
id tapticEngine = [[UIDevice currentDevice] performSelector: NSSelectorFromString(@"_tapticEngine") withObject:nil]; [tapticEngine performSelector: NSSelectorFromString(@"actuateFeedback:") withObject:@(0)];
或者:
id tapticEngine = [[UIDevice currentDevice] performSelector: NSSelectorFromString(@"_tapticEngine") withObject:nil]; SEL selector = NSSelectorFromString(@"actuateFeedback:"); int32_t arg = 1001; NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[tapticEngine methodSignatureForSelector:selector]]; [inv setTarget:tapticEngine]; [inv setSelector:selector]; [inv setArgument:&arg atIndex:2]; [inv invoke];
顯然, 這是調(diào)用了私有 API 。
這些方法,在實(shí)際測(cè)試的時(shí)候發(fā)現(xiàn),在 iPhone 7 上調(diào)用沒(méi)有震動(dòng)反饋,在 iPhone 6S Plus 上調(diào)用有震動(dòng)反饋,在 iPhone 6 上調(diào)用 無(wú)反饋。
短震方法三 UIImpactFeedbackGenerator
iOS10 引入了一種新的、產(chǎn)生觸覺(jué)反饋的方式, 幫助用戶認(rèn)識(shí)到不同的震動(dòng)反饋有不同的含義 。這個(gè)功能的核心就是由 UIFeedbackGenerator 提供。Apple 對(duì)于 UIImpactFeedbackGenerator 有一篇介紹文檔。
UIFeedbackGenerator 可以幫助你實(shí)現(xiàn) haptic feedback。它的要求是:
Apple 曾表示公開(kāi)了 Taptic Engine 的 API,但是鮮有文檔。在搜羅了各種資料后,可以認(rèn)為 UIImpactFeedbackGenerator 即 Taptic Engine 的 公開(kāi) API。
它的調(diào)用方式是:
UIImpactFeedbackGenerator *generator = [[UIImpactFeedbackGenerator alloc] initWithStyle: UIImpactFeedbackStyleLight]; [generator prepare]; [generator impactOccurred];
Others
觀察 UIImpactFeedbackGenerator 你會(huì)發(fā)現(xiàn)它繼承于 UIFeedbackGenerator。除了 UIImpactFeedbackGenerator 還有三種 FeedbackGenerator:
詳情可參考 Apple 的 這篇 Reference 。
對(duì)于震動(dòng)反饋的應(yīng)用,Apple 也給出了示例場(chǎng)景:
- (IBAction)gestureHandler:(UIPanGestureRecognizer *)sender { switch (sender.state) { case UIGestureRecognizerStateBegan: // Instantiate a new generator. self.feedbackGenerator = [[UISelectionFeedbackGenerator alloc] init]; // Prepare the generator when the gesture begins. [self.feedbackGenerator prepare]; break; case UIGestureRecognizerStateChanged: // Check to see if the selection has changed... if ([self myCustomHasSelectionChangedMethodWithTranslation:[sender translationInView: self.view]]) { // Trigger selection feedback. [self.feedbackGenerator selectionChanged]; // Keep the generator in a prepared state. [self.feedbackGenerator prepare]; } break; case UIGestureRecognizerStateCancelled: case UIGestureRecognizerStateEnded: case UIGestureRecognizerStateFailed: // Release the current generator. self.feedbackGenerator = nil; break; default: // Do nothing. break; } }
三種方法在測(cè)試機(jī)上不同的反饋結(jié)果
AudioServicesPlaySystemSound | 1519 | 1520 | 1521 |
---|---|---|---|
iPhone 7(iOS 10) | peek 觸感 | pop 觸感 | 三次連續(xù)短振 |
iPhone 6s Puls(iOS 9) | peek 觸感 | pop 觸感 | 三次連續(xù)短振 |
iPhone 6(iOS 10) | 無(wú)振動(dòng) | 無(wú)振動(dòng) | 無(wú)振動(dòng) |
獲取 _tapticEngine
iPhone 7(iOS 10) | 無(wú)振動(dòng) |
iPhone 6s Puls(iOS 9) | 長(zhǎng)振 |
iPhone 6(iOS 10) | 無(wú)振動(dòng) |
UIImpactFeedbackGenerator | .Light | .Medium | .Heavy |
---|---|---|---|
iPhone 7(iOS 10) | 微弱短振 | 中等短振 | 明顯短振 |
iPhone 6s Puls(iOS 9) | 長(zhǎng)振 | 長(zhǎng)振 | 長(zhǎng)振 |
iPhone 6(iOS 10) | 無(wú)振動(dòng) | 無(wú)振動(dòng) | 無(wú)振動(dòng) |
總結(jié)一下,希望同樣的代碼能在更多的機(jī)型上實(shí)現(xiàn)短振,建議使用 AudioServicesPlaySystemSound(1519)。不過(guò)可能會(huì)涉及到調(diào)用私有 API。安全起見(jiàn),可以使用 UIImpactFeedbackGenerator。
代碼
測(cè)試代碼在這里。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。