본문 바로가기

Android/Event

[Android] ScrollView 에서 Gesture 가능하게 하기!!....(2)

 이어서....

 그렇다면 이제는 Layout에 ScrollView와 그 안에 TextView를 만들어서 ScrollView가 스크롤이 될 때 그리고 스크롤이 필요 없을때 터치 이벤트가 어떻게 동작하는지 확인해 보도록 하자...



 

  
    
    	
    




 간단한 레이아웃이다.. 단지 ScrollView와 TextView만 있을뿐이다. 그렇다면 소스를 수정해보자.



 
	@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);

		final TextView tv = (TextView) findViewById(R.id.textView01);
		
		tv.setTextSize(30);
		tv.setText("aaaa");
	}



 위의 소스는 단지 TextView에 aaaa라는 텍스트만 넣어줬기 때문에 스크롤바가 생기지않는다. 이 상태에서는 ScrollView영역에서도 Activity에 등록한 Gesture event가 일어난다. 넣기 전과 후가 전혀 다르지않다. 그렇다면 바꿔서 

tv.setText("aaaaaaaaaaaaaaa...aaaaaaaaaaaa");

 위처럼 스크롤바가 생길만큼 텍스트를 넣어준다. 그 후에 ScrollView영역에서 Gesture event가 일어나도록 해보자...... 안된다.. 스크롤만 될 뿐 Toast메세지가 나오지 않는다. 필자도 정확하게는 모르겠지만 ScrollView에 구현되어있는 TouchEvent()에서 스크롤만 되도록 설정한것이 아닐까 한다. 그렇게 추측이 되었다면 우리가 TouchEvent()메소드를 바꿔보자.. 

 먼저 ScrollView를 상속받는 클래스를 하나 생성한다.



 
import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ScrollView;

public class MyScrollView extends ScrollView {
	
	private float LastX = 0.0f;
	
	private Context mContext;

	public MyScrollView(Context context, AttributeSet attrs) {
		super(context, attrs);
		mContext = context;
		// TODO Auto-generated constructor stub
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		float x = event.getX();
		if (LastX != 0.0f && (Math.abs(LastX - x) > 15.0f)) {
			LastX = x;
			return ((Activity) mContext).onTouchEvent(event);
		} else {
			LastX = x;
			return super.onTouchEvent(event);
		}
	}
}



 위의 소스는 좌우 Gesture에 대해서만 Activity의 메소드를 이용하도록 구현했다. 간단하게... 이제 알아서 좀 더 복잡한 Gesture를 구현할 수 있을것이다!!