Отображение интерактивного плавающего макета во время звонков
Фон
Есть несколько хороших приложений, которые показывают некоторую разметку сверху, когда пользователь делает вызов или отвечает на него (например, " текущий идентификатор звонящего").
Мне нужно создать приложение с возможностью показывать что-то сверху, во время разговора, и позволить ему быть интерактивным.
Эта проблема
С помощью broadcastReceiver, службы переднего плана и разрешения SYSTEM_ALERT мне удалось показать что-то на экране во время вызовов.
Пока показанный контент статичен, у меня нет проблем.
Тем не менее, я заметил, что, когда я пытаюсь сделать показанный контент интерактивным, я сталкиваюсь с некоторыми проблемами:
Все нервно, и это включает в себя не только анимацию, но и настройку видимости видимого / пропавшего. Я не хочу думать, как это будет работать, когда мне нужно сделать вещи перетаскиваемыми.
Не уверен, что это причина, но с помощью SlidingDrawer сделайте всю ширину принадлежащей SlidingDrawer, и вы не сможете щелкнуть по ней. Это означает, что если его местоположение находится внизу, вы не можете нажать кнопку "ответить", когда кто-то звонит вам.
Вопрос
В чем причина этих проблем?
Как я могу исправить их и быть в состоянии показать вещи правильно?
Как другие приложения справляются с этим правильно?
РЕДАКТИРОВАТЬ: о SlidingDrawer, кажется, что он имеет ужасные ошибки в отношении его местоположения и размера, и области содержимого, даже если он не показан пользователю, и пользователь может видеть сквозь, он не может быть затронут. Тем не менее, я не знаю, почему и как это исправить, и я также не знаю, почему все так нервно по сравнению с обычными приложениями (возможно, из-за перерисовки, но это действительно очень медленно).
Может быть, этот вопрос должен быть более общим: как сделать плавающее окно, как в AirCalc, которое можно легко перемещать, но при этом быть достаточно быстрым.
Для функции перетаскивания я пытался получить layoutParams корневого представления (который имеет тип WindowManager.LayoutParams), которое я показываю, обновлять и устанавливать его снова, но по какой-то причине он ничего не сделал. Интересно, что я делаю не так.
РЕДАКТИРОВАТЬ: кажется, что я должен использовать windowManager.updateViewLayout для обновления layoutParams. Используя этот пост, я сделал его совершенно перетаскиваемым.
1 ответ
Хорошо, я пришел к некоторым выводам по этому поводу, чтобы сначала ответить на мои оригинальные вопросы:
это вероятно из-за перерисовки и представлений, которые я использовал. Я хотел опробовать библиотеки, которые могли бы заменить slideDrawer, но у каждой была своя проблема. Использование простых представлений доказало, что идея в целом работает.
в случае изменений видимости это было нервно, потому что размер представления не мог соответствовать текущему размеру WindowManager.LayoutParams.
У slideDrawaer действительно есть проблемы, поскольку он использует весь размер, полученный при закрытии или открытии.
Теперь к остальным вопросам:
не в состоянии перетащить? вместо обычного setLayoutParams используйте windowManager.updateViewLayout.
не может коснуться вне поля зрения? установите его минимальный размер в соответствии с вашими потребностями. Вы также можете установить флажки окна так, чтобы событие касания прошло.
хотите слушать звонки события? Вы можете использовать broadcastReceiver для запуска показа приложения, но я подозреваю, что зависание вызова иногда может привести к получению намерения позже. Я думаю, что вы можете использовать telephonyManager и прослушивать там события, используя сервис, который вы запускаете на переднем плане (который я создал, просто чтобы убедиться, что приложение не закроется в середине).
если у кого-то еще есть вопросы, я могу помочь.