본문 바로가기

Android/Event

[Android] ScrollView 에서 Gesture 가능하게 하기!!

 어플을 만들다보니 ScrollView에서 Getsture를 사용해야 할 경우가 생겼다.. 해당 Activity에 OnGestureListener를 등록하였지만 다른 영역에서는 모드 Gesture가 정상적으로 동작하였지만 ScrollView 영역에서는 도통 Gesture가 먹히지를 않는 현상을 발견하게 되었다. 아마도 Scroll액션이 모든 Gesture를 잡아먹는가 보다...

 지식이 짧은 필자는 ScrollView를 상속받는 녀석을 하나 만들어서 어거지로 Gesture를 구현하기로 한다!!

 먼저 Activity에서 Gesture를 사용하는 방법을 알아보도록 하자.. 먼저 Activity는 OnGestureListener라는 녀석을 상속받아야 한다. 리스너를 상속받으면 아래와 같은 6개의 메소드를 오버라이드 해줘야한다.


public boolean onDown(MotionEvent e) {}

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {}

public void onLongPress(MotionEvent e) {}

public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {}

public void onShowPress(MotionEvent e) {}

public boolean onSingleTapUp(MotionEvent e) {}


 간략하게 말해보자면 최초 터치시에 호출되는 녀석이 onDown(), 그리고 바로 onShowPress(), 오래 누르면 onLongPress() 누르고 바로 떼면 onSingleTapUp(),  드래그하면 onScroll(), 드래그 하다 떼면 onFling()이 호출된다. 

 작성도중 퇴근시간이 되어버렸다.. 나머지는 내일~~ 스터디를 위해 간단히 테스트 할 수 있는 소스를 올려본다.


 
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.GestureDetector.OnGestureListener;
import android.widget.Toast;

public class TTT extends Activity implements OnGestureListener {

	private GestureDetector gd;
	private Handler mHandler;
	private static Toast mToast;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.touchlayout);
		gd = new GestureDetector(this);
		mHandler = new Handler();
		mToast = Toast.makeText(this, "", Toast.LENGTH_LONG);
	}
	
	private void makeToast(final String text, final int duration) {
		mHandler.post(new Runnable() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				mToast.cancel();
				mToast.setText(text);
				mToast.setDuration(duration);
				mToast.show();
			}
		});
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {		
		return gd.onTouchEvent(event);
	}
	
	@Override
	public boolean onDown(MotionEvent e) {
		// TODO Auto-generated method stub
		makeToast("onDown()", Toast.LENGTH_LONG);
		return false;
	}

	@Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		// TODO Auto-generated method stub
		makeToast("onFling()", Toast.LENGTH_LONG);
		return false;
	}

	@Override
	public void onLongPress(MotionEvent e) {
		// TODO Auto-generated method stub
		makeToast("onLongPress()", Toast.LENGTH_LONG);
	}

	@Override
	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
			float distanceY) {
		// TODO Auto-generated method stub
		makeToast("onScroll()", Toast.LENGTH_LONG);
		return false;
	}

	@Override
	public void onShowPress(MotionEvent e) {
		// TODO Auto-generated method stub
		makeToast("onShowPress()", Toast.LENGTH_LONG);
	}

	@Override
	public boolean onSingleTapUp(MotionEvent e) {
		// TODO Auto-generated method stub
		makeToast("onSingleTabUp()", Toast.LENGTH_LONG);
		return false;
	}

}