Як Facebook створює Chat Heads на Android? Що таке API для створення плаваючих поглядів поверх усіх інших подань?
Як Facebook створює Chat Heads на Android? Що таке API для створення плаваючих поглядів поверх усіх інших подань?
Відповіді:
Цей :
Дозволяє програмі відкривати вікна, використовуючи тип TYPE_SYSTEM_ALERT, показаний поверх усіх інших програм. Дуже мало додатків повинні використовувати цей дозвіл; ці вікна призначені для взаємодії на рівні системи з користувачем.
Постійне значення: "android.permission.SYSTEM_ALERT_WINDOW"
// EDIT: Повний код тут :
public class ChatHeadService extends Service {
private WindowManager windowManager;
private ImageView chatHead;
@Override public IBinder onBind(Intent intent) {
// Not used
return null;
}
@Override public void onCreate() {
super.onCreate();
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
chatHead = new ImageView(this);
chatHead.setImageResource(R.drawable.android_head);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.LEFT;
params.x = 0;
params.y = 100;
windowManager.addView(chatHead, params);
}
@Override
public void onDestroy() {
super.onDestroy();
if (chatHead != null) windowManager.removeView(chatHead);
}
}
Не забудьте якось запустити послугу:
startService(new Intent(context, ChatHeadService.class));
.. І додайте цю послугу у свій Маніфест.
Як правило, Android-діяльність - це повноекранні, концептуально виділені інтерфейси, що займають всю взаємодію. Є кілька винятків із цього. Для початку є спливаючі діалоги, які не заповнюють екран. Інший - тост Android, який є неінтерактивним спливаючим вікном - його не можна торкатися, і якщо ви спробуєте, він перейде до того, що знаходиться під ним.
Ви також можете зробити свої власні спеціальні інтерфейси. Ви можете додавати перегляди безпосередньо у WindowManager
, вказавши прапор типу. Напевно, голова чату використовує TYPE_PHONE . Існує декілька подібних типів, але ціль однакова: накладки спеціального призначення, які можуть з’являтися вгорі будь-що інше, але, мабуть, не існує батьківського додатка.
Але це досягає вас поки що через проблеми з взаємодією. Спочатку ваша накладка поглинає всю взаємодію, тому не тільки голова отримує події, але ви блокуєте взаємодію з усім, що знаходиться внизу.
Ви конфігуруєте цю поведінку за допомогою LayoutParams . FLAG_NOT_TOUCH_MODAL
означає, що події за межами області відображення переходять до базових інтерфейсів користувача. Тепер ви побачите, що це працює, але інші погані речі все-таки трапляються, наприклад, кнопки назад / меню не спрямовуються на додатки, а також немає клавіатури. Для вирішення цього вам потрібно FLAG_NOT_FOCUSABLE
.
Ви також отримуєте побічний ефект від нефокусованого біта, що вже не є приємною взаємодією з накладкою, наприклад, натисканням кнопок. Хоча ви можете отримати кілька основних подій на дотик, які ви завжди можете робити з математики, і цього, мабуть, достатньо для чатів. Просто пам’ятайте, що це залишає вас самостійно у багатьох областях, наприклад, анімація інтерфейсу користувача.
Хороший огляд деталей, включаючи можливість селективного споживання взаємодії, можна знайти в цій темі StackOverflow . Зокрема, одне із посилань на відповіді з часом перенесе вас сюди , що є хорошим прикладом проекту. Зауважте, що ICS змінив, як це працює трохи, але нитки пояснюють це.
Це все, що стосується загальнодоступних API, але це насправді не здається основним, що потрібно робити, як звичайно. Документація засвідчена посиланнями на особливості поведінки програмних систем та з поважною причиною; що якби всі це зробили?
Springy Head дає весняну поведінку чатових голів поза коробкою. Все, що вам потрібно визначити, - це малюнок для голови чату та фрагмент, який потрібно відкрити після натискання на голову чату. Голови чату руйнуються при мінімізації та йдуть пальцем при перетягуванні.
Проект включає демонстраційний додаток, який демонструє всю вбудовану функціональність. Щоб скористатися ним, потрібно додати це до залежностей від градуля.
compile 'com.flipkart.springyheads:library:0.9.6'