Какие API в Android используются Facebook для создания чат-голов?

Как Facebook создает чат-головки на Android? Что такое API для создания плавающих представлений поверх всех других представлений?

Ответ 1

Это одно:

Позволяет приложению открывать окна с использованием типа 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));

.. И добавьте эту услугу в свой манифест.

Ответ 2

Как правило, действия Android - это полноэкранный, концептуально выделенный интерфейс, который принимает все взаимодействие. Есть несколько исключений из этого. Для начала есть всплывающие диалоги, которые не заполняют экран. Другим является тост для Android, который является неинтерактивным всплывающим окном - вы не можете его трогать, и если вы попробуете, то он перейдет к тому, что под ним.

Вы также можете создавать собственные пользовательские интерфейсы. Вы можете добавлять представления непосредственно к WindowManager, указав флаг типа. Голова чата, вероятно, использует TYPE_PHONE. Существует несколько подобных типов, но цель та же: специальные наложения, которые могут появляться поверх всего остального без присутствия родительского приложения.

Это только доводит вас до сих пор, из-за проблем с взаимодействием. Сначала ваш оверлей поглотит все взаимодействие, поэтому голова не только получает события, но и блокирует взаимодействие со всем, что находится внизу.

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

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

Хороший обзор подробностей, в том числе учет потребления избирательного взаимодействия, можно найти в fooobar.com/questions/29067/.... В частности, одна из ссылок ответа в конечном итоге приведет вас к здесь, что является хорошим примером проекта. Обратите внимание, что ICS изменила то, как это работает, но потоки объясняют это.

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

Ответ 3

Springy heads дает spring поведение чат-головок из коробки. Все, что вам нужно определить, - это доступный для главы чата и фрагмент, который открывается после нажатия кнопки чата. Головки чата рушится, когда сведены к минимуму, и следуйте пальцем при перетаскивании.

Проект включает демонстрационное приложение, которое демонстрирует все встроенные функции. Чтобы использовать его, вам нужно добавить это в свои зависимости gradle.

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