Mobile/Android

[Android] ListView에서 스크롤 방향 체크하기

louis.dev 2013. 11. 14. 16:31

ListView에서 스크롤 방향 체크하기

스크롤뷰, 혹은 리스트뷰에서 터치이벤트를 이용해서 스크롤이 위, 아래중 어디로 움직이는지 확인하는 방법을 포스팅해 보겠습니다.
boolean firstDragFlag = true;
boolean dragFlag = false;	//현재 터치가 드래그 인지 확인
float startYPosition = 0;		//터치이벤트의 시작점의 Y(세로)위치
listView.setOnTouchListener(new View.OnTouchListener() {
	@Override
	public boolean onTouch(View v, MotionEvent event) {
		switch (ev.getAction()) {
		case MotionEvent.ACTION_MOVE:		//터치를 한 후 움직이고 있으면
			dragFlag = true;
			if(firstDragFlag) {		//터치후 계속 드래그 하고 있다면 ACTION_MOVE가 계속 일어날 것임으로 무브를 시작한 첫번째 터치만 값을 저장함
				startYPosition = ev.getY();	//첫번째 터치의 Y(높이)를 저장
				firstDragFlag= false;	//두번째 MOVE가 실행되지 못하도록 플래그 변경
			}

			break;

		case MotionEvent.ACTION_UP : 
			endYPosition = ev.getY();
			firstDragFlag= true;

			if(dragFlag) { 	//드래그를 하다가 터치를 실행
				// 시작Y가 끝 Y보다 크다면 터치가 아래서 위로 이루어졌다는 것이고, 스크롤은 아래로내려갔다는 뜻이다.
				// (startYPosition - endYPosition) > 10 은 터치로 이동한 거리가 10픽셀 이상은 이동해야 스크롤 이동으로 감지하겠다는 뜻임으로 필요하지 않으면 제거해도 된다.
				if((startYPosition > endYPosition) && (startYPosition - endYPosition) > 10) {
					//TODO 스크롤 다운 시 작업
				} 
				//시작 Y가 끝 보다 작다면 터치가 위에서 아래로 이러우졌다는 것이고, 스크롤이 올라갔다는 뜻이다.
				else if((startYPosition < endYPosition) && (endYPosition - startYPosition) > 10) {
					//TODO 스크롤 업 시 작업
				}
			}

			startYPosition = 0.0f;
			endYPosition = 0.0f;
			motionFlag = false;
			break;
		}
		return false;
	}
});
이렇게 터치 이벤트를 통해서 스크롤의 진행방향을 체크하면 됩니다.