Facebook의 채팅 헤드와 같은 다른 앱을 그리는 데 사용되는 API는 무엇입니까? 헤드를 어떻게 작성합니까? 다른

Facebook은 Android에서 채팅 헤드를 어떻게 작성합니까? 다른 모든보기 위에 부동보기를 작성하는 API는 무엇입니까?



답변

하나

애플리케이션이 다른 모든 애플리케이션 위에 표시된 TYPE_SYSTEM_ALERT 유형을 사용하여 창을 열 수 있도록합니다. 이 권한을 사용해야하는 응용 프로그램은 거의 없습니다. 이 창은 시스템 수준의 사용자와의 상호 작용을위한 것입니다.

상수 값 : “android.permission.SYSTEM_ALERT_WINDOW”

// 편집 : 전체 코드는 다음과 같습니다.

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 활동은 모든 상호 작용을 취하는 개념적으로 전용 UI 인 전체 화면입니다. 이에 대한 몇 가지 예외가 있습니다. 시작을 위해 화면을 채우지 않는 팝업 대화 상자가 있습니다. 또 다른 하나는 Android 대화식으로, 비 대화식 팝업입니다. 터치 할 수 없으며 시도하면 아래에있는 모든 항목으로 이동합니다.

자신 만의 특별한 UI도 할 수 있습니다. WindowManager유형 플래그를 지정하여 뷰를 직접에 추가 할 수 있습니다 . 채팅 헤드는 아마도 TYPE_PHONE을 사용 합니다. . 몇 가지 유사한 유형이 있지만 목적은 동일합니다. 부모 응용 프로그램이 존재하지 않고 다른 것 위에 나타날 수있는 특수 목적 오버레이.

그러나 상호 작용에 문제가 있기 때문에 지금까지만 가능합니다. 처음에는 오버레이가 모든 상호 작용을 흡수하므로 헤드가 이벤트를받을뿐만 아니라 아래의 모든 항목에 대한 상호 작용을 차단합니다.

LayoutParams를 사용하여이 동작을 구성합니다 . FLAG_NOT_TOUCH_MODAL표시 영역 외부의 이벤트는 기본 UI로 이동합니다. 이제는 작동하지만 뒤로 / 메뉴 버튼이 앱으로 연결되지 않고 키보드가 아닌 다른 나쁜 일이 여전히 발생한다는 것을 알 수 있습니다. 당신이 필요로 해결하기 위해 FLAG_NOT_FOCUSABLE.

초점을 맞출 수없는 비트에서도 부작용이 발생합니다. 버튼 누르기와 같이 오버레이와 더 이상 상호 작용하지 않습니다. 그래도 기본적인 터치 이벤트를 얻을 수 있습니다.이 이벤트는 항상 수학을 할 수 있으며 채팅 헤드에 충분합니다. UI 애니메이션과 같은 많은 영역에서 자신을 떠난다는 점에 유의하십시오.

선택적 상호 작용 소비를 포함하여 세부 사항에 대한 좋은 개요는 이 StackOverflow 스레드 에서 찾을 수 있습니다 . 특히 답변 링크 중 하나가 결국 여기로 이동합니다 . 이는 훌륭한 예제 프로젝트입니다. ICS는이 작동 방식을 약간 변경했지만 스레드가이를 설명합니다.

이것은 모두 공개 API 일이지만 실제로 당연히해야 할 주류 일처럼 보이지는 않습니다. 이 문서에는 특별한 시스템 응용 프로그램 동작에 대한 언급이 있으며 합당한 이유가 있습니다. 모두가 그렇게했다면 어떻게해야합니까?


답변

스프링 헤드기본적 으로 채팅 헤드의 스프링 기반 동작을 제공합니다. 채팅 헤드를위한 드로어 블과 채팅 헤드를 클릭하면 조각이 열리기 만하면됩니다. 채팅 헤드는 최소화되면 축소되고 드래그하면 손가락을 따라갑니다.

이 프로젝트에는 모든 내장 기능을 보여주는 데모 앱이 포함되어 있습니다. 그것을 사용하려면 이것을 gradle 의존성에 추가해야합니다.

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