안드로이드 개발 질문/답변
(글 수 45,052)
제스처에서 더블탭 이란게 있던데...
이걸 쓰려니... 소스 전체를 갈아 엎어야 할 정도로 고된 작업이라서..
더블터치를 만들어 보기로 했습니다..;;
timer로 만들면 된다고 해서 무작정 해 봤는데
안되는군요.. ;ㅁ;
제가 해본 방식이...
다운 이밴트를 받으면
if문으로 업 이밴트를 받을 시에
타이머를 시작 하구요...
1초 뒤에 boolean 값이 true에서 false로 바뀝니다..
여기서 다시 if문으로...
boolean 값이true이고 다운 이밴트를 받을때
제가 구현하는 작업을 실행 하려고 합니다..
제가 생각한 방식이 맞는지 모르겠습니다..
Timer timer = new Timer();
showToast("다운!");
if((event.getAction() == MotionEvent.ACTION_UP)) {
timer.schedule(task, 1000);
showToast("업!");
if(dubleTouch == true && event.getAction() == MotionEvent.ACTION_DOWN) {
showToast("더블터치!");
dubleTouch = true;
}
}else if(dubleTouch == false) {
showToast("실패!");
}
소스는 이렇구요..
지적 이나 가르침 해 주셨으면 합니다
2011.03.16 15:30:24
저두 그러고 싶은데 제스처를 처음 다뤄서 그런지 혼용하기가 힘들더라구요 ...
그래서 결론은 만들자 라고 생각 했는데요...
뎃글보고 혼용하는걸 한번 해 봤습니다..
기존에 더블탭을 하는 방법이 많이 나와있어서 그걸 이용해서 onTouch 하단에 만들어 줘 봤는데... 안되더라구요...
일단 혼용한 것도 올려 봅니다..
public boolean onTouch(View v, MotionEvent event) {
ImageView view = (ImageView) v;
// Dump touch event to log
dumpEvent(event);
// Handle touch events here...
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
savedMatrix.set(matrix);
start.set(event.getX(), event.getY());
Log.d(TAG, "mode=DRAG");
mode = DRAG;
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
Log.d(TAG, "oldDist=" + oldDist);
if (oldDist > 10f) {
savedMatrix.set(matrix);
midPoint(mid, event);
mode = ZOOM;
Log.d(TAG, "mode=ZOOM");
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
Log.d(TAG, "mode=NONE");
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
// ...
matrix.set(savedMatrix);
matrix.postTranslate(event.getX() - start.x,
event.getY() - start.y);
}
else if (mode == ZOOM) {
float newDist = spacing(event);
Log.d(TAG, "newDist=" + newDist);
if (newDist > 10f) {
matrix.set(savedMatrix);
float scale = newDist / oldDist;
matrix.postScale(scale, scale, mid.x, mid.y);
}
}
break;
}
GestureDetector mGesture;
mGesture = new GestureDetector(this,new GestureListener());
if (mGesture.onTouchEvent(event))
return true;
view.setImageMatrix(matrix);
return true;
}
onTouch 부분이구요..
class GestureListener extends GestureDetector.SimpleOnGestureListener{
@Override
public boolean onDoubleTap(MotionEvent e) {
showToast("더블터치!!!!");
return true;
}
}
이렇게 onDoubleTap 했을시 이밴트를 만들어 주었구요
도움 부탁 드립니다
2011.03.16 15:50:39
제가 볼 땐 제스처의 기본 사용법 부터 공부하셔야 할 것 같습니다.
터치 이벤트 받을 때 마다 체스처를 새로 만들고 계시군요.
터치 이벤트와 더블탭만을 위한 제스처 혼용하는 예제 소스 입니다.
참고하세요.
public class DoubleTapTest extends Activity{
private GestureDetector mDoubleTapGesture;
//아무것도 안하는 제스쳐 리스너
private OnGestureListener mNullListener = new OnGestureListener() {
@Override public boolean onSingleTapUp(MotionEvent e) { return false; }
@Override public void onShowPress(MotionEvent e) {}
@Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return false; }
@Override public void onLongPress(MotionEvent e) {}
@Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return false; }
@Override public boolean onDown(MotionEvent e) { return false; }
};
//더블탭 리스너
private OnDoubleTapListener mDoubleTapListener = new OnDoubleTapListener() {
@Override public boolean onSingleTapConfirmed(MotionEvent e) { return false; }
@Override public boolean onDoubleTapEvent(MotionEvent e) { return false; }
@Override public boolean onDoubleTap(MotionEvent e) {
/*
여기에 더블탭 이벤트
*/
return true;
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/*
하실 것들 하시고
*/
mDoubleTapGesture = new GestureDetector(context, mNullListener); //더블탭 제스쳐 생성
mDoubleTapGesture.setOnDoubleTapListener(mDoubleTapListener); //더블 탭 리스너 등록
}
@Override
public boolean onTouchEvent(MotionEvent e){
if(mDoubleTapGesture != null)
mDoubleTapGesture.onTouchEvent(e); //제스처는 더블탭만 인식, 사용.
/*
터치 이벤트 직접 구현
*/
return super.onTouchEvent(e);
}
}
터치 이벤트 받을 때 마다 체스처를 새로 만들고 계시군요.
터치 이벤트와 더블탭만을 위한 제스처 혼용하는 예제 소스 입니다.
참고하세요.
public class DoubleTapTest extends Activity{
private GestureDetector mDoubleTapGesture;
//아무것도 안하는 제스쳐 리스너
private OnGestureListener mNullListener = new OnGestureListener() {
@Override public boolean onSingleTapUp(MotionEvent e) { return false; }
@Override public void onShowPress(MotionEvent e) {}
@Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return false; }
@Override public void onLongPress(MotionEvent e) {}
@Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return false; }
@Override public boolean onDown(MotionEvent e) { return false; }
};
//더블탭 리스너
private OnDoubleTapListener mDoubleTapListener = new OnDoubleTapListener() {
@Override public boolean onSingleTapConfirmed(MotionEvent e) { return false; }
@Override public boolean onDoubleTapEvent(MotionEvent e) { return false; }
@Override public boolean onDoubleTap(MotionEvent e) {
/*
여기에 더블탭 이벤트
*/
return true;
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/*
하실 것들 하시고
*/
mDoubleTapGesture = new GestureDetector(context, mNullListener); //더블탭 제스쳐 생성
mDoubleTapGesture.setOnDoubleTapListener(mDoubleTapListener); //더블 탭 리스너 등록
}
@Override
public boolean onTouchEvent(MotionEvent e){
if(mDoubleTapGesture != null)
mDoubleTapGesture.onTouchEvent(e); //제스처는 더블탭만 인식, 사용.
/*
터치 이벤트 직접 구현
*/
return super.onTouchEvent(e);
}
}




제스처는 그냥 더블탭만 익식하도록 하고 나머지 이벤트는 무시하게 하면
기존 터치 이벤트 소스 고치지 않아도 둘다 사용 가능합니다.