전화가 걸려왔을 때 움직이는 팝업창으로 만드는 방법을 찾다가 구글링에서 찾은 것으로 테스트한 걸 적어둔다.
테스트 환경 : Android Studio 3.3
일반적인 코드
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_callingincoming);
|
Draggable Code
View mPopupView; WindowManager.LayoutParams mParams; WindowManager mWindowManager;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); // 타이틀바 없애기
mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); mPopupView = getLayoutInflater().inflate(R.layout.activity_callingincoming, null);
Display display = mWindowManager.getDefaultDisplay(); @SuppressWarnings("deprecation") int width = (int) (display.getWidth() * 0.9); //Display 사이즈의 90%
mParams = new WindowManager.LayoutParams( width, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_TOAST, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON, PixelFormat.TRANSLUCENT);
mParams.gravity = Gravity.CENTER | Gravity.START; mParams.x = 0; // initial position mParams.y = 0; // initial position
mPopupView.setOnTouchListener(new View.OnTouchListener() { private int initialX; private int initialY; private float initialTouchX; private float initialTouchY;
@Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: initialX = mParams.x; initialY = mParams.y; initialTouchX = event.getRawX(); initialTouchY = event.getRawY(); return true; case MotionEvent.ACTION_UP: return true; case MotionEvent.ACTION_MOVE: int newX = initialX + (int) (event.getRawX() - initialTouchX); // new position int newY = initialY + (int) (event.getRawY() - initialTouchY); // new position mParams.x = newX; mParams.y = newY; mWindowManager.updateViewLayout(mPopupView, mParams); return true; } return false; } });
isPopupChk(); mWindowManager.addView(mPopupView, mParams); }
public void isPopupChk(){ // 팝업창이 떠있는지 검사 if (mPopupView.getParent() != null) { mWindowManager.removeView(mPopupView); } } |
https://stackoverflow.com/questions/10373078/transparent-activity-floating-draggable-on-homscreen
에 나온 Answer 를 참조해서 구현 성공했다.
테스트시 기본개념이 약해서 어려움을 겪었던 부분은
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
부분이었다.
폰 사이즈가 각각 다르므로 폰 사이즈가 달라도 화면에 보여주는 결과는 일정한 비율로 보여주도록 처리해야 하므로 이 부분을
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.WRAP_CONTENT,
로 변경하고 일정한 비율로 Linearlayout 을 구현하고나서 원하는 결과를 얻었다.
추가 확인 사항
- 삼성 갤럭시 노트 8(안드로이드 7.1.1)에서 팝업창 방식으로 activity 를 동작시키니까 창이 1~2초후 사라진다.
- 삼성 갤럭시 S7, S8 (안드로이드 7.0) 에서는 팝업창 방식(service, activity) 모두 정상 동작한다.
- 삼성 갤럭시 노트 8 에서 Main UI 방식으로 동작시키니까 팝업창 오랫동안 지속된다.