Open7
HapticFeedbackのMulti Platform対応調査(iOS, Android)
https://developer.android.com/develop/ui/views/haptics/haptics-principles?hl=ja
ハプティクスの設計ガイドライン
- うるさい触覚よりも、豊かでクリアな触覚を優先します。
- システムとアプリのデザインの両方に一貫性を持たせます。
- 使用頻度と重要性に留意してください。
事前定義された触覚定数と効果を優先する
HapticFeedbackConstants
に存在する事前定義のアクションがアクションの対象となる場合は、その定数を使用します。これにより、一貫したユーザー操作エクスペリエンスが保証されるため、これはユーザー補助に関する考慮事項として特に重要です。- 独自の効果を作成する場合は、
VibrationEffect
事前定義効果とVibrationEffect.Composition
プリミティブの使用を検討してください。サポートしているすべてのデバイスで、一貫した品質エクスペリエンスを提供する可能性が高くなります。
イベントの重要度と頻度を強度と関連付ける
触覚効果は、ユーザーを圧倒したり、不当に感じたりしないようにする必要があります。
一貫性を保つ
アプリ内でハプティクスの適用に一貫性を持たせます。フォームの送信やアプリ内ナビゲーションなどの特定の操作に触覚フィードバックがある場合は、同様の操作すべてに同じ効果が適用されるようにしてください。これにより、ユーザーは特定の触覚フィードバックに意味を関連付けることができます。
iOS:
Android:
- https://developer.android.com/develop/ui/views/haptics?hl=ja
- 事前定義された振動は、
- より詳細な振動(多分非推奨ぽい?)
完全な対になる形はないよう
Androidの方が効果種類が多いため、実質的にはiOSの効果数に合わせてAndroidの効果が決まる形になりそう
触覚フィードバックのために従来のワンショット バイブレーションを使用しない
- VibrationEffect.createOneShot で定義されたものや、API Vibrator.vibrate(long) と Vibrator.vibrate(long[], int) を使用して実行されるものなど、従来のワンショット バイブレーションは使用しないでください。
- 特に、触覚アクチュエータやドライバの性能が低いデバイスでは、入力波形の終了後、このような振動が長時間続くと、うるさいと感じられる可能性があります。
Multi Platformでの実装例
Flutter
- https://github.com/flutter/flutter/blob/e33d4b86270e3c012ba13d68d6e90f2eabc4912b/packages/flutter/lib/src/services/haptic_feedback.dart
- AndroidではiOSの効果は
HapticFeedbackConstants
の定義で補っている-
UISelectionFeedbackGenerator
がHapticFeedbackConstants.SEGMENT_TICK
ではなく、HapticFeedbackConstants.CLOCK_TICK
なのは気になる
-
iOS | Android |
---|---|
UIImpactFeedbackGenerator.FeedbackStyle.light |
HapticFeedbackConstants.VIRTUAL_KEY |
UIImpactFeedbackGenerator.FeedbackStyle.medium |
HapticFeedbackConstants.KEYBOARD_TAP |
UIImpactFeedbackGenerator.FeedbackStyle.heavy |
HapticFeedbackConstants.CONTEXT_CLICK |
React-Native
- https://github.com/mkuczera/react-native-haptic-feedback#method-overview
- AndroidではiOS側の効果は自前定義で補っている
iOS | Andrid |
---|---|
UIImpactFeedbackGenerator.FeedbackStyle.light |
new long[]{0, 20} |
UIImpactFeedbackGenerator.FeedbackStyle.medium |
new long[]{0, 40} |
UIImpactFeedbackGenerator.FeedbackStyle.heavy |
new long[]{0, 60} |
UIImpactFeedbackGenerator.FeedbackStyle.rigid |
new long[]{0, 40 ,60, 20} |
UIImpactFeedbackGenerator.FeedbackStyle.soft |
new long[]{0, 20, 60, 40} |
UINotificationFeedbackGenerator.FeedbackType.success |
new long[]{0, 20, 40, 30, 40, 40} |
UINotificationFeedbackGenerator.FeedbackType.warning |
new long[]{0, 30} |
UINotificationFeedbackGenerator.FeedbackType.error |
new long[]{0, 10} |
Xamarin
-
https://github.com/xamarin/Essentials/blob/6f527dbeba70611d2a713316060bba2623b11cfc/Xamarin.Essentials/HapticFeedback/HapticFeedbackType.shared.cs
- デフォルトではClickとLongPressの2種類のみ
- https://github.com/xamarin/Essentials/blob/main/Xamarin.Essentials/HapticFeedback/HapticFeedback.ios.cs
- https://github.com/xamarin/Essentials/blob/main/Xamarin.Essentials/HapticFeedback/HapticFeedback.android.cs
iOS | Android |
---|---|
UIImpactFeedbackGenerator.FeedbackStyle.light |
HapticFeedbackConstants.CONTEXT_CLICK |
UIImpactFeedbackGenerator.FeedbackStyle.medium |
HapticFeedbackConstants.LONG_PRESS |
NativeScript
- iOS
- Android
- https://github.com/NativeScript/plugins/blob/91d0b298ba00c42731346b2291e668c6bc43c66e/packages/haptics/index.android.ts
- Notificationの区別は特にされてない...
- SelectionはImpactLightと同じ強さになってる...
iOS | Android |
---|---|
UIImpactFeedbackGenerator.FeedbackStyle.light |
VibrationEffect.EFFECT_CLICK |
UIImpactFeedbackGenerator.FeedbackStyle.medium |
VibrationEffect.EFFECT_DOUBLE_CLICK |
UIImpactFeedbackGenerator.FeedbackStyle.heavy |
VibrationEffect.EFFECT_HEAVY_CLICK |
UINotificationFeedbackGenerator.FeedbackType.success |
VibrationEffect.EFFECT_TICK |
UINotificationFeedbackGenerator.FeedbackType.warning |
VibrationEffect.EFFECT_TICK |
UINotificationFeedbackGenerator.FeedbackType.error |
VibrationEffect.EFFECT_TICK |
UISelectionFeedbackGenerator |
VibrationEffect.EFFECT_CLICK |
Unity Plugin
CandyCoded/HapticFeedback
iOS | Android |
---|---|
UIImpactFeedbackGenerator.FeedbackStyle.light |
HapticFeedbackConstants.CONTEXT_CLICK |
UIImpactFeedbackGenerator.FeedbackStyle.medium |
HapticFeedbackConstants.VIRTUAL_KEY |
UIImpactFeedbackGenerator.FeedbackStyle.heavy |
HapticFeedbackConstants.LONG_PRESS |