728x90

전화가 걸려왔을 때 움직이는 팝업창으로 만드는 방법을 찾다가 구글링에서 찾은 것으로 테스트한 걸  적어둔다.

테스트 환경 : 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 방식으로 동작시키니까 팝업창 오랫동안 지속된다.

블로그 이미지

Link2Me

,