Upgrade to Pro — share decks privately, control downloads, hide ads and more …

土掘るHaptics

Avatar for cffYoHa cffYoHa
October 21, 2025

 土掘るHaptics

potatotips #93 iOS/Android開発Tips共有会

Avatar for cffYoHa

cffYoHa

October 21, 2025
Tweet

More Decks by cffYoHa

Other Decks in Programming

Transcript

  1. Hapticsの分類
 大音量で不快な可聴ノイズ
 
 低品質な印象(安くて壊れた電話 など)を与える
 非連続の状態変化
 (電源オン / オフなど)の
 感覚をサポート


    単一の振動刺激に依存しない
 豊かなハプティクス
 
 
 https://source.android.com/docs/core/interaction/haptics/haptics-ux-foundation 6
  2. 8 8

  3. • DEFAULT_AMPLITUDE
 ◦ デバイスに設定されている標準の振動レベル
 ◦ ハードウェアの性能によって、0〜255
 の中で指定される
 • createOneShot()のようなシンプルな
 バイブレーションのオン

    / オフは
 利用すべきではないらしい
 現在の実装
 val vibrator = context.getSystemService(Vibrator::class.java) val vibrationEffect = VibrationEffect.createOneShot( 200, VibrationEffect.DEFAULT_AMPLITUDE, ) vibrator.vibrate(vibrationEffect) https://developer.android.com/develop/ui/views/haptics/haptics-principles 18
  4. ハードウェアごとに再現できる モーター性能が異なる󰢃 最大値(255)に近い値で不快なノイズが 発生することも󰢃 そもそもこんなコード書くな 再現してみた①
 val timings = longArrayOf(

    0, // 初期待機 35, // 刺さる 15, // 休止 15, // 掘る1 10, // 休止 17, // 掘る2 8, // 休止 20, // 掘る3 12, // 休止 30, // 持ち上げる 30, // 休止 ) val amplitudes = intArrayOf( 0, // 初期待機 220, // 刺さる 0, // 休止 100, // 掘る1 0, // 休止 140, // 掘る2 0, // 休止 180, // 掘る3 0, // 休止 255, // 持ち上げる 0, // サイクル間休止 ) vibrator.vibrate(VibrationEffect.createWaveform(timings, amplitudes, -1)) 20
  5. - HapticFeedbackConstants
 - ハードウェアの操作(ボタン押下やキーボード入力)によく使われているため、
 ユニークなFB体験にならなそう
 - 一方で、事前定義済みのアクションに該当する場合は、
 一貫したユーザー操作体験を提供可能
 
 -

    VibrationEffect
 - 単発の振動から複雑な波形まで様々
 - VibrationEffect.Composition(Android 11以降)を使うことで振動を合成可能
 - Android16から追加のEnvelop effectsもVibrationEffectの一部
 Hapticの定数を利用する
 21
  6. - Riveファイルの変更に応じて振動タイミン グを細かく修正する必要性 󰢃
 
 
 再現してみた②-1
 val effect =

    VibrationEffect.startComposition() // スコップを刺す .addPrimitive(VibrationEffect.Composition.PRIMITIVE_QUICK_FALL, 0.5f) // スコップが地中を進む(100ms 後) .addPrimitive(VibrationEffect.Composition.PRIMITIVE_TICK, 0.5f, 100) // スコップを持ち上げる(150ms 後) .addPrimitive(VibrationEffect.Composition.PRIMITIVE_QUICK_RISE, 1.0f, 150) .compose() vibrator.vibrate(effect) 22
  7. - シンプルが一番よかった
 - PRIMITIVE_QUICK_RISE
 - 重力に逆らって素早く上向きに動く様子を
 シュミレートする触覚効果
 再現してみた②-2
 val effect

    = VibrationEffect.startComposition() .addPrimitive(VibrationEffect.Composition.PRIMITIVE_QUICK_RISE, 1.0f, 0) .compose() vibrator.vibrate(effect) https://developer.android.com/reference/android/os/VibrationEffect.Composition 24
  8. まとめ
 - Hapticsの定数を使う
 - 簡単に多様なデバイスで動作するHaptics体験を提供できる
 - ボタンやキーボード操作などはHapticFeedbackConstants
 - それらで表現できないものはVibrationEffect
 -

    Hapticsは、デバイスの進化とともに豊かになった
 - OSVerとそのデバイスが物理的に表現可能なHapticsか、areXxxSuported() APIで確認する
 - 使いすぎると、ユーザーがHapticsをオフにする可能性もある
 
 - Envelope周りのHapticsAPIを触りたいならGalaxy Z Fold 7は買うな
 26