본문 바로가기

소프트웨어/Android/Java/Ndk

android] WindowManager UpdateViewLayout이 벌벌벌 떨릴때

WindowManager의 params의 x,y를 바꾸고 updateViewLayout 매서드를 불렀다.

그런데 뷰가 옮겨지긴 하는데 덜덜덜 떨리면서 되는 문제가 생겼다.


해결법

getX()대신 getRawX()를 사용한다. 왜냐하면, getX()는 onTouchListener가 달린 Layout을 기준으로 계산된 좌표가 나오고(내부 레이아웃) getRawX()는 화면 전체에서 터치가 일어난 좌표가 나오기 때문이다.




code


pmTransLayout.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Utils.logd("Touch : "+event.getAction());
                if(event.getAction() == MotionEvent.ACTION_DOWN) {
                    pmInitDownX = pmWParams.x;
                    pmInitDownY = pmWParams.y;
                    pmInitDownRawX = event.getRawX();
                    pmInitDownRawY = event.getRawY();
                } else if(event.getAction() == MotionEvent.ACTION_MOVE) {
                    Utils.logd("[X,Y]] "+event.getX()+" "+event.getY());
                    pmWParams.x = pmInitDownX + (int)(event.getRawX() - pmInitDownRawX);
                    pmWParams.y = pmInitDownY + (int)(event.getRawY() - pmInitDownRawY);

                    pmWManager.updateViewLayout(pmMainLayout, pmWParams);
                } else if(event.getAction() == MotionEvent.ACTION_UP) {
                }
                return true;
            }
        });