페이스북 홈의 Chat Heads 처럼 모든화면에 떠있는 뷰 구현

페이스북 홈을 공개하면서 “Chat Heads”라는 기능을 선보였다. 어떤화면에서든 친구의 알림을 받아 볼 수있는 기능이다.

예를들어 웝브라우저를 뛰우거나 카카오톡을 하고이서도 알림이 도착하거나 친구로부터 메시지를 받으면 즉시 프로필 사진의 둥근 뷰가 화면떠다닌다.

안드로이드 앱개발자로서 어떻게 기능을 구현 했을까라는 의문이 당연히 들었다.

흔하게 갤럭시 S3 동영상 재생이나 DMB시청시 화면을 작게 뛰워서 항상 위에 배치하는것과 같다.

구현 방법은 WindowManager를 이용하여 내가 보는 화면 최상단에 뷰를 븥일수 있다. 당연히 뷰는 터치이벤트를 받을 수있기에 사용자의 액션에 따라 움직이게 하면된다.

단, 사용자가 앱을 실행했다는것을 UI상의로 표현 하지않기위해 엑티비티나 플레그먼트가 아닌 서비스에서 작업을한다.

간단하게 코드를 통해 알아보자.

public class ChatHeadsService extends Service {
private WindowManager.LayoutParams mParams;
private WindowManager mWindowManager;

private ChatHeadsView mChatHeadsView;

private float mTouchX, mTouchY;
private int mViewX, mViewY;

private OnTouchListener mViewTouchListener = new OnTouchListener() {

@Override public boolean onTouch(View v, MotionEvent event) {

switch(event.getAction()) {

case MotionEvent.ACTION_DOWN:
mTouchY = event.getRawY();
mViewX = mParams.x;
mViewY = mParams.y;
break;

case MotionEvent.ACTION_MOVE:
int x = (int)(event.getRawX() - mTouchX);
int y = (int)(event.getRawY() - mTouchY);

mParams.x = mViewX + x;
mParams.y = mViewY + y;

mWindowManager.updateViewLayout(mChatHeadsView, mParams);
break;
}

return true;
}
};

@Override
public IBinder onBind(Intent arg0) { return null; }

@Override
public void onCreate() {
super.onCreate();

mChatHeadsView = new ChatHeadsView(this);
mChatHeadsView.setOnTouchListener(mViewTouchListener);

mParams = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE, //TouchEvent 받음
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, //KeyEvent, TouchEvent를 Child(앱)로 넘김
PixelFormat.TRANSLUCENT );
mParams.gravity = Gravity.LEFT | Gravity.TOP;

mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE)
mWindowManager.addView(mChatHeadsView, mParams);

}

}

서비스에서 뷰를 생성 후 WindowManager의 addView 메소드로 생성된 뷰를 넘겨주면 된다. 터치이벤트도 처리 가능하다.

 

System Window를 사용하기위해 위와 같은 퍼미션이 있어야 하며 API1 부터 기능이 들어 가있으므로,  OS버전에 상관 없이 사용 가능하다.

솔찍히 기능구현은 참 간단하지만 안드로이드앱에서 흔히 쓰지않는 기술을 가지고 이렇게 활용했다는점에 큰 박수를 보낸다. 메세지알림시 이런 노티도 상당히 괜찮을것 같다는생각과 카카오톡이나 여러 SNS 앱에도 영향을 주지 않을까 생각된다.

댓글 남기기