2012/02/07

View.onTouchEvent() Eclipse Template 문제

Android의 View에서 Touch 이벤트 사용에 대한 공부를 하고 있던 중 이상한 점을 발견하였다.



테스트한 내용은 너문 단순한 코드 였다. 안드로이드의 기본 아이콘을 마우스를 드래그하는 동안 따라다니며 그리도록 한 소스이다.

    
private float mPosX = 0;
private float mPosY = 0;
private boolean mMove = false;
private Bitmap mBitmap = null;

public CanvasView( Context context )
{
super( context );

mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
}

protected void onDraw( Canvas canvas )
{
Paint paint = new Paint();
canvas.drawBitmap( mBitmap, mPosX, mPosY, paint );

super.onDraw( canvas );
}

@Override
public boolean onTouchEvent( MotionEvent event )
{
if ( event.getAction() == MotionEvent.ACTION_DOWN )
{
Log.i( "onTouchEvent", "ACTION_DOWN ("+event.getX()+","+event.getY()+")");
mMove = true;
}
else if ( event.getAction() == MotionEvent.ACTION_MOVE )
{
Log.i( "onTouchEvent", "ACTION_MOVE ("+event.getX()+","+event.getY()+")");
if ( mMove )
{
mPosX = event.getX();
mPosY = event.getY();

invalidate();
}
}
else if ( event.getAction() == MotionEvent.ACTION_UP )
{
Log.i( "onTouchEvent", "ACTION_UP ("+event.getX()+","+event.getY()+")");
mMove = false;
}

return super.onTouchEvent( event );
}





이 소스를 실행하여 기본 아이콘이 뷰에서 마우스를 드래그 하면 드래그하는 위치에 그려 줄 것으로 기대하였다. 하지만 아이콘은 미동도 하지 않았다. 추적을 위해 각 event 에 대하여 Log를 출력해 보니 ACTION_DOWN에 대한 이벤트만 발생을 하고 다른 이벤트는 발생하지 않았다. 코드상 문제가 없는 것 같은데 동작을 하지 않는다. 



해결책을 찾으려 우선 안드로이드 개발자 사이트를 찾아 갔다. 개발자 사이트에서 View.onTouchEvent에 대한 짧막한 설명이 나와 있었다.




public boolean onTouchEvent (MotionEvent event) Since: API Level 1


Implement this method to handle touch screen motion events.


Parameters


event The motion event.

Returns


True if the event was handled, false otherwise.





설명에도 크게 주목할 만한 사항이 보이지 않았다. 마지막 Returns 부분에 반환값이 true 이면 이벤트가 처리되고 false 이면 아니라는 말이 걸렸다.



그래서 위의 코드 중 마지막 부분에 대한 결과값을 확인해 보았다.

    
boolean bSuper = super.onTouchEvent( event );
Log.i("onTouchEvent", "Call super.onTouchEvent( event ) => " + bSuper );

결과
onTouchEvent(543): Call super.onTouchEvent( event ) => false






결과는 false를 반환하고 있었다.

eclipse 가 만들어준 코드인데 왜그러지? onTouchEvent 함수의 마지막 부분을 return super.onTouchEvent( event ); 에서 return true;로 변경하니 원하던 동작이 이루어 졌다.



Eclipse 에서 만들어준 코드를 무작정 믿기만 하면 안되겠다. 자동으로 만들어 준 코드라 해도 알고 써야 겠다.

&

Original Post : http://neodreamer-dev.tistory.com/638

No comments :

Post a Comment