이어서....
그렇다면 이제는 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를 구현할 수 있을것이다!!