Facebook의 채팅 헤드와 같은 다른 앱을 그리는 데 사용되는 API는 무엇입니까?


226

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


6
이 응용 프로그램은 또한 "채팅 헤드" play.google.com/store/apps/details?id=com.ninja.sms
Oli


5
당신은 데모 여기에 간단한 라이브러리를 찾을 수 있습니다 github.com/ericbhatti/floaties는 당신이 단지 2 라인을 사용하여 부동 창을 만들 수있는이 라이브러리를 사용.
Eric B.

답변:


217

하나

애플리케이션이 다른 모든 애플리케이션 위에 표시된 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));

.. 그리고이 서비스를 매니페스트에 추가하십시오.


4
더 이상한 것들이 있다고 생각합니다. 드래그 가능성뿐만 아니라 "헤드"외부의 입력을 처리하는 것은 어떻습니까? 최소한 FLAG_NOT_TOUCH_MODAL 과 드래그하는 동안 Window 속성을 업데이트 (즉, 이동)하는 영리한 논리가 필요하다고 생각 합니다.
Delyan

2
그 채팅 헤드를 제거하는 방법?
Nirav Mehta

6
플로팅 UI를 만들기 위해 개발 한 SDK를 언급 할 가치가 있다고 생각했습니다. www.tooleap.com
Arik

@NiravMehta 채팅 헤드를 제거 할 수 있습니까?
KK_07k11A0585

위의 코드 출력에서 ​​원은 경계에서 약간의 공간을 갖습니다. Facebook에서는 거품이 그 공간을 가지고 있지 않습니다
Debugger

51

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

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

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

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

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

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

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


이 뷰의 방향 변경을 어떻게 막을 수 있습니까? 기본 활동이 방향을 전환하면 내보기도 방향을 변경합니다.
MG

1
아니요. 오리엔테이션 변경은 활동만을위한 것이 아니라 장치 전체에 적용됩니다.
Rob Pridham

7

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

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

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

@KiranKumar, 당신은 매우 명확한 라이브러리를 만들었습니다 .. 나는 그것을 좋아합니다 ..이 라이브러리에서 다양한 측면을 배우려고 노력하고 있습니다. 나는 응용 프로그램 창 밖에서 그것을 실행하려고 노력하고 있습니다. 하지만 응용 프로그램의 창 밖에서 채팅 헤드를 클릭하면 문제가 발생합니다. 조각이 측면에서 가능할 경우 java.lang.OutOfMemoryError ..를 열고 반환 할 수 없습니다. 이 방법을 알려주세요.
기뻐할 것입니다

@arraystack 이제 서비스에서 실행할 수 있습니다. GitHub 리포지토리의
Kiran Kumar

@KiranKumar 감사합니다. 새로운 lib의 문제점은 Marshmallow Version의 Draw over application 권한입니다.
arraystack
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.