현재 윈도우매니저에 리니어레이아웃을 넣고 화면에 띄운뒤
양손가락을 이용해서 확대/축소하는 기능을 시험하고 있습니다
원래는 scalegesturedetector를 이용해서 구현을 했는데
원하는 방향으로만 커지는게 아니라 비율로 증가하는 형태여서 간단하게 직접 구현해봤습니다
문제는 확대/축소가 상당히 크기가 커졌다 작아졌다하면서 흔들리면서 진행이 되고
가로로는 이동이 되면서 커지지만 세로로는 고정된 상태에서 커지는 이상한 현상이 발생하고 있습니다.
손가락이 움직이는 방향대로 크기가 부드럽게 커지려면 어떤 점을 고쳐야 할까요?
아래는 터치리스너 소스코드입니다.
ll.setOnTouchListener(new View.OnTouchListener() {
WindowManager.LayoutParams updatedParameters = parameters;
//updatedParameters.x와 y
double x,y;
//x,y 좌표값이 더 작은 인덱스 저장용 변수
int indexX, indexY;
//작은 xy 좌표값 저장용 변수
double posX,posY;
//손가락 사이의 xy거리 구하기
int dist0X, dist0Y;
//움직인 후 손가락 사이의 xy거리
int dist1X, dist1Y;
//원래 너비/높이 저장용 변수
int orgWidth , orgHeight;
boolean pinch = false;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_POINTER_DOWN:
pinch = true;
x = updatedParameters.x;
y = updatedParameters.y;
//두 손가락 위치 중 작은 x값/y값 좌표를 지닌 인덱스를 얻고 그 좌표값을 각각 저장합니다.
indexX = event.getX(0) > event.getX(1) ? 1:0;
indexY = event.getY(0) > event.getY(1) ? 1:0;
posX = event.getX(indexX);
posY = event.getY(indexY);
//두 손가락 사이의 x,y좌표 거리를 구합니다.
dist0X = (int)(event.getX(1-indexX) - event.getX(indexX));
dist0Y = (int)(event.getY(1-indexY) - event.getY(indexY));
//원래 크기 구하기
orgWidth=v.getMeasuredWidth();
orgHeight=v.getMeasuredHeight();
break;
case MotionEvent.ACTION_MOVE:
if(pinch){
//현재 x,y좌표에 가장 좌측/상단의 x/y좌표의 변화 값을 더하여 갱신합니다.
updatedParameters.x=(int)(x+(event.getX(indexX)-posX));
updatedParameters.y=(int)(y+(event.getY(indexY)-posY));
//움직인 두 손가락 사이의 x,y좌표 거리를 구합니다.
dist1X = (int)(event.getX(0) > event.getX(1) ? event.getX(0) - event.getX(1) : event.getX(1) - event.getX(0));
dist1Y = (int)(event.getY(0) > event.getY(1) ? event.getY(0) - event.getY(1) : event.getY(1) - event.getY(0));
//움직인 후의 x/y거리와 처음의 x/y거리의 차를 구하고 각 너비/높이의 값을 변경합니다.
updatedParameters.width = dist1X - dist0X + orgWidth;
updatedParameters.height = dist1Y - dist0Y + orgHeight;
//업데이트
wm.updateViewLayout(ll,updatedParameters);
}
break;
default:
pinch = false;
break;
}
return false;
}
});