private static HorizontalScrollView Scroll_Horizontal; private static ScrollView Scroll_Vertical; protected static int currentX = 0;protected static int currentY = 0;
멤버변수를 선언하기 위해서는 두가지 widget이 import 되어 있어야한다.
import android.widget.HorizontalScrollView; import android.widget.ScrollView;
HorizontalScrollView와 ScrollView는 가로 스크롤, 세로 스크롤로 사용된다. currentX와 currentY는 화면에서 터치된 x, y 좌표의 최신 좌표로 사용된다.
2. 좌표처리 메소드 구현
public static void scrollBy(int x, int y) { Scroll_Horizontal.scrollBy(x, 0); Scroll_Vertical.scrollBy(0, y); }
scrollBy는 ScrollView의 scrollBy가 아닌 사용자정의메소드이다. (override한 메소드가 아니라는 것)
이 메소드를 통해 이벤트 발생시, 하나의 좌표(가로, 또는 세로)만 처리하는게 아닌,두가지 좌표(가로와 세로)를 한꺼번에 처리 할 수 있다.
3. OnTouchListener
OnTouchListener touchHandler = new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN : ScrollTest.currentX = (int)event.getRawX(); ScrollTest.currentY = (int)event.getRawY();break; case MotionEvent.ACTION_MOVE : int x2 = (int)event.getRawX(); int y2 = (int)event.getRawY(); ScrollTest.scrollBy(currentX-x2, currentY-y2); ScrollTest.currentX = x2; ScrollTest.currentY = y2; break; case MotionEvent.ACTION_UP : break; default : ScrollTest.currentX = (int)event.getRawX(); ScrollTest.currentY = (int)event.getRawY(); break; } ScrollTest.currentX = (int)event.getRawX(); ScrollTest.currentY = (int)event.getRawY(); return false; } };
MotionEvent가 일어났을 때,
event가 Down이면 x좌표, y좌표를 event를 통해 얻어와서 멤버변수(currentX, currentY)에 저장해 둔다,
event가 Move이면 로컬변수(x2, y2)에 이동된 최신좌표를 저장하고,
이 두 좌표를 통해 이동한 거리를 계산해 실제 스크롤 바에 직접 입력시주는 것이다. (기존좌표-현재좌표)를 통해 처리한다.
이 처리를 static 멤버 메소드 scrollBy에 넘겨주어
두가지 스크롤 뷰를 각각 x, y에 맞게 갱신하여 준다.