Які API використовуються для залучення інших програм (наприклад, Facebook Heats Heads)?


226

Як Facebook створює Chat Heads на Android? Що таке API для створення плаваючих поглядів поверх усіх інших подань?


6
Цей додаток також має "Heads Heads" play.google.com/store/apps/details?id=com.ninja.sms
Олі

11
Якщо ви шукаєте приклад, див. Github.com/marshallino16/FloatingNotification
marshallino16

5
Ви можете знайти демонстрацію та просту бібліотеку тут: github.com/ericbhatti/floaties За допомогою цієї бібліотеки ви можете створювати плаваючі вікна, використовуючи лише 2 рядки.
Ерік Б.

Відповіді:


217

Цей :

Дозволяє програмі відкривати вікна, використовуючи тип 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));

.. І додайте цю послугу у свій Маніфест.


4
Думаю, є ще дивні речі. Що з керуванням входом поза "головою", а також з перетягуванням? Я думаю, вам хоч би знадобився FLAG_NOT_TOUCH_MODAL , а також трохи розумної логіки, щоб оновити атрибути Window (тобто перемістити його) під час перетягування.
Делян

2
в тому, як видалити чат -головок?
Нірав Мехта

6
Думав, що варто згадати SDK, який я розробив для створення плаваючого інтерфейсу: www.tooleap.com
Арік,

@NiravMehta Чи можете ви видалити голови чату?
KK_07k11A0585

як зняти межу голови чату. Тому що у наведеному вище кодовому коді є певний простір від кордону. У Facebook у міхура немає цього простору
налагоджувач

51

Як правило, Android-діяльність - це повноекранні, концептуально виділені інтерфейси, що займають всю взаємодію. Є кілька винятків із цього. Для початку є спливаючі діалоги, які не заповнюють екран. Інший - тост Android, який є неінтерактивним спливаючим вікном - його не можна торкатися, і якщо ви спробуєте, він перейде до того, що знаходиться під ним.

Ви також можете зробити свої власні спеціальні інтерфейси. Ви можете додавати перегляди безпосередньо у WindowManager, вказавши прапор типу. Напевно, голова чату використовує TYPE_PHONE . Існує декілька подібних типів, але ціль однакова: накладки спеціального призначення, які можуть з’являтися вгорі будь-що інше, але, мабуть, не існує батьківського додатка.

Але це досягає вас поки що через проблеми з взаємодією. Спочатку ваша накладка поглинає всю взаємодію, тому не тільки голова отримує події, але ви блокуєте взаємодію з усім, що знаходиться внизу.

Ви конфігуруєте цю поведінку за допомогою LayoutParams . FLAG_NOT_TOUCH_MODALозначає, що події за межами області відображення переходять до базових інтерфейсів користувача. Тепер ви побачите, що це працює, але інші погані речі все-таки трапляються, наприклад, кнопки назад / меню не спрямовуються на додатки, а також немає клавіатури. Для вирішення цього вам потрібно FLAG_NOT_FOCUSABLE.

Ви також отримуєте побічний ефект від нефокусованого біта, що вже не є приємною взаємодією з накладкою, наприклад, натисканням кнопок. Хоча ви можете отримати кілька основних подій на дотик, які ви завжди можете робити з математики, і цього, мабуть, достатньо для чатів. Просто пам’ятайте, що це залишає вас самостійно у багатьох областях, наприклад, анімація інтерфейсу користувача.

Хороший огляд деталей, включаючи можливість селективного споживання взаємодії, можна знайти в цій темі StackOverflow . Зокрема, одне із посилань на відповіді з часом перенесе вас сюди , що є хорошим прикладом проекту. Зауважте, що ICS змінив, як це працює трохи, але нитки пояснюють це.

Це все, що стосується загальнодоступних API, але це насправді не здається основним, що потрібно робити, як звичайно. Документація засвідчена посиланнями на особливості поведінки програмних систем та з поважною причиною; що якби всі це зробили?


Чи можу я якось блокувати зміни орієнтації для цих поглядів? Якщо основна діяльність перемикає орієнтацію, мій погляд також змінює його орієнтацію.
MG

1
Ні. Зміна орієнтації залежить від пристрою, не лише для діяльності.
Роб Приддам

7

Springy Head дає весняну поведінку чатових голів поза коробкою. Все, що вам потрібно визначити, - це малюнок для голови чату та фрагмент, який потрібно відкрити після натискання на голову чату. Голови чату руйнуються при мінімізації та йдуть пальцем при перетягуванні.

Проект включає демонстраційний додаток, який демонструє всю вбудовану функціональність. Щоб скористатися ним, потрібно додати це до залежностей від градуля.

compile 'com.flipkart.springyheads:library:0.9.6'

Привіт, @KiranKumar, ти створив дуже чітку бібліотеку .. Мені просто подобається .. Я намагаюся вивчити різні аспекти з цієї бібліотеки .. Я намагався запустити її за межами вікна програми, якось я трохи успішний у виконанні це так .. Але проблема виникає, коли я натискаю голову чату за вікном програми .. фрагмент не вдасться відкрити і повернути java.lang.OutOfMemoryError .. якби це було можливо з вашого боку до дайте мені шлях через це .. Це буде з радістю шанувати ..
arraystack

@arraystack тепер ви можете запустити його в сервісі. Перевірте список, якщо філії в репо GitHub
Кіран Кумар

@KiranKumar Дякую, Проблема з новою lib - це дозвіл Draw over application у версії Marshmallow
arraystack
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.