Смущает тактильная обратная связь в Android

У меня есть приложение для Android с 9 кнопками. Это приложение работает на 2.36 и является единственным приложением на устройстве (или, по крайней мере, единственным приложением, которое мы позволяем использовать пользователю - мы отправляем устройство с нашим кодом, предустановленным как часть набора промышленных продуктов, которые мы продаем).

Все кнопки переходят к одному обработчику и сортируются там по их тегам. Обработчик указан в XML:

   <Button android:id="@+id/IdleButton"
     android:layout_marginLeft="5dp"
     android:background="@drawable/idle18pt_he_normal"
     android:hapticFeedbackEnabled="true"
     android:layout_width="92dp"
     android:layout_height="92dp"
     android:tag="0"
     android:onClick="theButtonHandler">
   </Button> 

Я хочу включить тактильную обратную связь, то есть вибрацию, когда пользователь нажимает кнопку. Есть ли способ сделать это только в XML, или, если нет, есть ли способ сделать это в моем обработчике onClick ()?

Примеры из Интернета, которые я видел (например, http://androidcookbook.com/Recipe.seam?recipeId=1242) для тактильной обратной связи на Android в основном, похоже, связаны с изменениями манифеста, изменениями в XML (вы можете видеть, что я уже включил его в своем XML выше), а затем объявление, инициализацию и реализацию отдельного Сенсорный обработчик кнопки. Похоже, это большая работа, тем более, что у меня 9 кнопок.

Поскольку у меня уже есть только один обработчик onClick для всех моих кнопок, есть ли способ реализовать там тактильную обратную связь?

Все, что мне нужно было сделать, чтобы получить звук щелчка, когда я нажимаю одну из моих кнопок, - это установить флажок «Звуковой выбор» в разделе «Звуки» в настройках телефона - никакого кодирования. Почему тактильная обратная связь намного сложнее?


person user316117    schedule 09.09.2014    source источник


Ответы (2)


Создайте собственный VibrateButton класс, наследуемый от Button, и добавьте эту вибрацию onClick. Вам все равно нужно будет запрашивать разрешения в манифесте, поэтому вы ничего не можете сделать без наследования. Этот пример кода взят отсюда и выполняет вибрацию.

import android.os.Vibrator;
...
Vibrator v = (Vibrator) this.context.getSystemService(Context.VIBRATOR_SERVICE);
// Vibrate for 500 milliseconds
v.vibrate(500);

Примечание:

Не забудьте указать разрешение в файле AndroidManifest.xml:

<uses-permission android:name="android.permission.VIBRATE"/>

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

PS: Убедитесь, что устройство вибрирует. Я тупо потерял несколько часов при добавлении вибрации на Nexus 7 2012; у него нет модуля вибрации. Кроме того, убедитесь, что вы можете отключить это, чтобы зарядить батарею дольше.

person Sergi Juanola    schedule 09.09.2014

Без использования разрешения VIBRATE.

Вы можете использовать performHapticFeedback() функцию любого View, включая Button.

Например программно в Котлине:

view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)

Это вызывает вибрацию устройства.

Вы можете вибрировать устройство из любого места в вашем Fragment или Activity, даже если у вас нет View.

Во фрагменте вы можете:

requireView().performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)

В Activity вы делаете:

window.decorView.rootView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
person Yogesh Umesh Vaity    schedule 16.10.2019