안드로이드 개발 질문/답변
(글 수 45,052)
package exam.MultiTouchZoom;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;
public class TouchExampleView extends View
{private Drawable mIcon;
private float mPosX;
private float mPosY;
private float mLastTouchX;
private float mLastTouchY;
private static final int POINTER_ID = -1;
private int mActivePointerId=POINTER_ID;
private ScaleGestureDetector mScaleDetector;
private float mScaleFactor = 1.f;
public TouchExampleView(Context context) {this(context , null , 0);
// TODO Auto-generated constructor stub
mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
}
public TouchExampleView(Context context, AttributeSet attrs) {this(context, attrs,0);
// TODO Auto-generated constructor stub
}
public TouchExampleView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
mIcon = context.getResources().getDrawable(R.drawable.icon);
mIcon.setBounds(0, 0, mIcon.getIntrinsicWidth(), mIcon.getIntrinsicHeight());
}
@Override
public void onDraw(Canvas canvas)
{super.onDraw(canvas);
canvas.save();
canvas.translate(mPosX, mPosY);
mIcon.draw(canvas);
canvas.restore();
}
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener
{@Override
public boolean onScale(ScaleGestureDetector detector)
{mScaleFactor *= detector.getScaleFactor();
// zoom
mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));
invalidate();
return true;
}
}
@Override
public boolean onTouchEvent(MotionEvent ev)
{mScaleDetector.onTouchEvent(ev);
final int action = ev.getAction();
switch (action & MotionEvent.ACTION_MASK) {case MotionEvent.ACTION_DOWN:
{final float x = ev.getX();
final float y = ev.getY();
//시작
mLastTouchX = x;
mLastTouchY = y;
// id 기억
mActivePointerId = ev.getPointerId(0);
break;
}
case MotionEvent.ACTION_MOVE:
{ final float x = ev.getX();
final float y = ev.getY();
final int pointerIndex = ev.findPointerIndex(mActivePointerId);
if(!mScaleDetector.isInProgress())
{// 이동거리
final float dx = x - mLastTouchX;
final float dy = y - mLastTouchY;
//이동
mPosX += dx;
mPosY += dy;
//초기화
invalidate();
}
//마지막 터치기억
mLastTouchX = x;
mLastTouchY = y;
break;
}
case MotionEvent.ACTION_UP :
{mActivePointerId = POINTER_ID;
break;
}
case MotionEvent.ACTION_CANCEL :
{mActivePointerId = POINTER_ID;
break;
}
case MotionEvent.ACTION_POINTER_UP :
{final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK)
>> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
final int pointerId = ev.getPointerId(pointerIndex);
if(pointerId == mActivePointerId)
{final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
mLastTouchX = ev.getX(newPointerIndex);
mLastTouchY = ev.getY(newPointerIndex);
mActivePointerId = ev.getPointerId(newPointerIndex);
}
break;
}
default:
break;
}
return true;
}
};
멀티터치 동작 관련된 소스입니다. ( 펌 )
이 동작을 메인에서 작동을 시킬려고 하는데요.
메인 엑티비티에서 어떤식으로 해야 이 클래스를 가져와서 동작을 시킬수있나요???
TouchExampleView zoom = new TouchExampleView(this,null,0);
이거까지는 알겠는데..
그 다음에..
먼가 행위를 해줘야 동작을 할거같은데요..
갑자기 감이안오는데요...답변 부탁드려요.




제가 놓친건지 모르겠지만 위 생성자의 오버로딩이 좀 이해가 안되는데요.. 첫번째 생성자를 이용해 호출해야만 제스쳐디텍터의 인스턴스가 생성되는군요.
TouchExampleView zoom = new TouchExampleView(this);
setContentView(zoom);
요렇게 해보시면 될 것 같네요.