Отображение интерактивного плавающего макета во время звонков

Фон

Есть несколько хороших приложений, которые показывают некоторую разметку сверху, когда пользователь делает вызов или отвечает на него (например, " текущий идентификатор звонящего").

Мне нужно создать приложение с возможностью показывать что-то сверху, во время разговора, и позволить ему быть интерактивным.

Эта проблема

С помощью broadcastReceiver, службы переднего плана и разрешения SYSTEM_ALERT мне удалось показать что-то на экране во время вызовов.

Пока показанный контент статичен, у меня нет проблем.

Тем не менее, я заметил, что, когда я пытаюсь сделать показанный контент интерактивным, я сталкиваюсь с некоторыми проблемами:

  1. Все нервно, и это включает в себя не только анимацию, но и настройку видимости видимого / пропавшего. Я не хочу думать, как это будет работать, когда мне нужно сделать вещи перетаскиваемыми.

  2. Не уверен, что это причина, но с помощью SlidingDrawer сделайте всю ширину принадлежащей SlidingDrawer, и вы не сможете щелкнуть по ней. Это означает, что если его местоположение находится внизу, вы не можете нажать кнопку "ответить", когда кто-то звонит вам.

Вопрос

В чем причина этих проблем?

Как я могу исправить их и быть в состоянии показать вещи правильно?

Как другие приложения справляются с этим правильно?


РЕДАКТИРОВАТЬ: о SlidingDrawer, кажется, что он имеет ужасные ошибки в отношении его местоположения и размера, и области содержимого, даже если он не показан пользователю, и пользователь может видеть сквозь, он не может быть затронут. Тем не менее, я не знаю, почему и как это исправить, и я также не знаю, почему все так нервно по сравнению с обычными приложениями (возможно, из-за перерисовки, но это действительно очень медленно).

Может быть, этот вопрос должен быть более общим: как сделать плавающее окно, как в AirCalc, которое можно легко перемещать, но при этом быть достаточно быстрым.

Для функции перетаскивания я пытался получить layoutParams корневого представления (который имеет тип WindowManager.LayoutParams), которое я показываю, обновлять и устанавливать его снова, но по какой-то причине он ничего не сделал. Интересно, что я делаю не так.

РЕДАКТИРОВАТЬ: кажется, что я должен использовать windowManager.updateViewLayout для обновления layoutParams. Используя этот пост, я сделал его совершенно перетаскиваемым.

1 ответ

Хорошо, я пришел к некоторым выводам по этому поводу, чтобы сначала ответить на мои оригинальные вопросы:

  1. это вероятно из-за перерисовки и представлений, которые я использовал. Я хотел опробовать библиотеки, которые могли бы заменить slideDrawer, но у каждой была своя проблема. Использование простых представлений доказало, что идея в целом работает.

    в случае изменений видимости это было нервно, потому что размер представления не мог соответствовать текущему размеру WindowManager.LayoutParams.

  2. У slideDrawaer действительно есть проблемы, поскольку он использует весь размер, полученный при закрытии или открытии.

Теперь к остальным вопросам:

  1. не в состоянии перетащить? вместо обычного setLayoutParams используйте windowManager.updateViewLayout.

  2. не может коснуться вне поля зрения? установите его минимальный размер в соответствии с вашими потребностями. Вы также можете установить флажки окна так, чтобы событие касания прошло.

  3. хотите слушать звонки события? Вы можете использовать broadcastReceiver для запуска показа приложения, но я подозреваю, что зависание вызова иногда может привести к получению намерения позже. Я думаю, что вы можете использовать telephonyManager и прослушивать там события, используя сервис, который вы запускаете на переднем плане (который я создал, просто чтобы убедиться, что приложение не закроется в середине).

если у кого-то еще есть вопросы, я могу помочь.

Другие вопросы по тегам