Android - PerformHapticFeedback vs Vibrator - документация и использование

TL;DR:

Буду признателен за любую дополнительную информацию об Android

абстрактный класс Vibrator vs performHapticFeedback

Желательно избегать использования Vibrator class и отдавать приоритет performHapticFeedback, чтобы не запрашивать у пользователя разрешения, и полагаться только на предпочтения их системы.


Сценарий:

Я работаю с Xamarin, пытаясь реализовать Haptic Feedback для Android и iOS.

Теперь, хотя в документации iOS есть краткое объяснение, которое я реализовал как следующий:

    void Platform.Vibrate(HapticsIntensity HapticsIntensity)
    {
      UIKit.UIImpactFeedbackGenerator ImpactFeedbackGenerator;

      switch (HapticsIntensity)
      {
        case HapticsIntensity.Light:
          ImpactFeedbackGenerator = new UIKit.UIImpactFeedbackGenerator(UIKit.UIImpactFeedbackStyle.Light);
          break;
        case HapticsIntensity.Medium:
          ImpactFeedbackGenerator = new UIKit.UIImpactFeedbackGenerator(UIKit.UIImpactFeedbackStyle.Medium);
          break;
        case HapticsIntensity.Heavy:
          ImpactFeedbackGenerator = new UIKit.UIImpactFeedbackGenerator(UIKit.UIImpactFeedbackStyle.Heavy);
          break;
        default:
          ImpactFeedbackGenerator = null;
          break;
      };

      if (ImpactFeedbackGenerator != null)
      {
        ImpactFeedbackGenerator.Prepare();
        ImpactFeedbackGenerator.ImpactOccurred();
      }
    }

В документации Android для Haptic Feedback указано, что метод performHapticFeedback ожидает HapticFeedbackConstant в качестве параметра.

public boolean performHapticFeedback (int feedbackConstant)

Доступные feedbackConstant находятся здесь , но, похоже, между ними нет никакой разницы.

Вызов:

Длительное нажатие

Engine.AndroidActivity.Window.DecorView.PerformHapticFeedback(Android.Views.FeedbackConstants.LongPress);

имеет тот же эффект, что и VirtualKey

Engine.AndroidActivity.Window.DecorView.PerformHapticFeedback(Android.Views.FeedbackConstants.VirtualKey);

или нажатие клавиатуры

Engine.AndroidActivity.Window.DecorView.PerformHapticFeedback(Android.Views.FeedbackConstants.KeyboardTap);

кроме того, некоторые из FeedbackConstants даже не приводят к тактильной обратной связи.

Кто-нибудь знает, где я могу найти дополнительную документацию по этому вопросу?


Причина, по которой я спрашиваю, заключается в том, что я реализую абстрактный слой поверх Xamarin с помощью Invention где мое намерение состоит в том, чтобы вызвать мой метод, например:

Vibrate(HapticsIntensity.Light);
Vibrate(HapticsIntensity.Medium);
Vibrate(HapticsIntensity.Heavy);

Сегодня это работает, но если на iOS я получаю тактильную обратную связь в виде легкой, средней и сильной вибрации, то на Android я не могу различить их.

Я знаю, что в Android есть класс Vibrate (см. здесь), который позволяет для детального контроля; однако, чтобы использовать это, мне нужно добавить в свой манифест или запросить определенные разрешения для моего приложения (android.permission.VIBRATE), и это не оптимально.


Кроме того, если я добавлю разрешение android.permission.VIBRATE в свой манифест, похоже (если в настройках устройства включена тактильная обратная связь), мне даже не нужно добавлять вызов метода Vibrate() к моим кнопкам` onClick; и они уже обеспечат тактильную обратную связь (BZZZTT!!1!).


person Gus    schedule 20.05.2019    source источник


Ответы (1)


Это полностью зависит от того, изменил ли OEM-производитель устройства код ASOP и массивы времени вибрации в ресурсе com.android.internal.R.array, чтобы включить специальный «движок» тактильной обратной связи, который они используют на своем устройстве.

По умолчанию OEM-производители оборудования должны поддерживать (в аппаратном обеспечении) только стандартную вибрацию включения / выключения (линейный привод, взвешенный поворотный механизм и т. д.), а не «настоящую» тактильную обратную связь, которая обычно основана на формах волны.

По сравнению с более новыми устройствами iOS (7 | 8+?), они используют «Taptic Engine» (причудливое название «усовершенствованный линейный привод») для тактильной обратной связи, и только недавно устройства Android «догоняют» аппаратное обеспечение. сторона (новый OnePlus, Pixel 3s и т. д.) начинают включать в себя более продвинутое тактильное / вибрационное оборудование (не сделал ли OEM какой-либо особый подход к этому новому оборудованию, решать вам...)

Итак, если вы посмотрите на PhoneWindowManager.java ASOP, вы обнаружите, что большая часть HapticFeedbackConstants сводится к нескольким константам VibrationEffects, таким как:

~~~
VibrationEffect.EFFECT_TICK
VibrationEffect.EFFECT_CLICK
VibrationEffect.EFFECT_HEAVY_CLICK
~~~

Посмотрите на источник, если вы хотите увидеть, каким будет ASOP по умолчанию VibrationEffects для конкретного HapticFeedbackConstants:

Если вам по какой-то причине необходимо предоставить ручную тактильную связь для своего приложения, вы можете использовать Vibrator API и предоставить массив байтов для времени включения/выключения, а затем использовать его в специальном случае для телефонных устройств, предлагая больше аппаратных функций.

person SushiHangover    schedule 20.05.2019
comment
Спасибо за ваш ответ! Я думал, что Android будет использовать другой подход. Что-то независимое от OEM, например: (при условии, что устройство представляет собой простой двигатель, где доступно только включение/выключение) Легкий: Вкл. на 200 мс Средний: Вкл. на 500 мс Тяжелый: Вкл. на 1000 мс Я понимаю, что могу управлять этим с помощью Vibrate, но я так и сделал не хочу запрашивать разрешение VIBRATE. Спасибо за это, это действительно навело меня на правильный путь, - person Gus; 20.05.2019