확실히 Android에는 사용자가 의미 한 바를 확인하는 신뢰할 수있는 방법 인 클릭 또는 스크롤/움직임이 있습니다. 같은 행동을하기에 충분한 간단한 규칙이 있습니까?Android에서 클릭을 어떻게 처리합니까?
여기 내 문제입니다.
컨트롤을 클릭하여 자체 클릭 핸들러를 실행하거나 스크롤하여 (탭하고 이동) 전체보기를 스크롤합니다 (두 방향으로 스크롤하는 사용자 정의보기가있는 경우 해당 사항이있는 경우 here is the idea) . 따라서 onTouch on MotionEvent.ACTION_DOWN을 기억하고 포인트가 변경되지 않은 경우 MotionEvent.ACTION_UP에서 클릭 핸들러를 호출하는 간단한 터치 리스너를 설정했습니다.
마우스 클릭이 정확하기 때문에 에뮬레이터에서 정상적으로 작동하므로 아무런 위험을 느끼지 못했고 Samsung Galaxy S Plus에서 아무런 문제가 발생하지 않았습니다. 화면을 두드리는 데는 정말로 정확합니다. .
그러나 첫 번째 베타 테스터는 버튼이 작동하지 않는다고 불평했습니다. 대부분 100 %가 아니기 때문에 클릭을 처리 할 때까지 버튼을 여러 번 탭해야했습니다. 그들 중 일부는 또한 손가락 끝으로 화면을 터치하면 버튼이 약간 더 잘 작동한다고 말했습니다.
몇 가지 생각을 한 후에 나는 클릭하는 동안 손가락을 조금 움직일 수 있다고 생각했기 때문에 DOWN 및 UP의 지점이 다르며 처리기가 클릭을 결정하지 못했습니다. 이것을 확인하기 위해 간단한 드리프트를 허용하는 간단한 개선을 추가했습니다. 테스터들은 트릭이 상황을 훨씬 좋게한다는 것을 확인했습니다. 핸들러의 최종 코드는 다음과 같습니다.
// This interface is for a real click handler that may differ depending on control.
interface Clicker {
boolean click(View v);
}
class ButtonTouchListener implements OnTouchListener {
private boolean _trackingButtonClick = false;
private Clicker _clicker;
// These two integers are the improvement.
private int downX = 0;
private int downY = 0;
public ButtonTouchListener(Clicker clicker) {
_clicker = clicker;
}
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = (int) event.getRawX();
downY = (int) event.getRawY();
trackingButtonClick = true;
// Calling the onTouchEvent of the main view that handles the global scrolling.
return onTouchEvent(event);
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_OUTSIDE:
int newX = (int) event.getRawX();
int newY = (int) event.getRawY();
int xOffset = downX - newX;
int yOffset = downY - newY;
// These two lines are the improvement also.
// 10 is a max move distance that I've simply guessed.
if (Math.abs(xOffset) >= 10 || Math.abs(yOffset) >= 10)
_trackingButtonClick = false;
// Calling the onTouchEvent of the main view that handles the global scrolling.
return onTouchEvent(event);
case MotionEvent.ACTION_UP:
if (_trackingButtonClick) {
_trackingButtonClick = false;
// Calling the click handler of the control.
return _clicker.click((View)v.getTag());
}
_trackingButtonClick = false;
return true;
default :
return onTouchEvent(event);
}
}
}
}
그래서 나는 올바른 추측을 한 것처럼 보입니다. 안드로이드는 비슷한 비슷한 것을 가지고 있습니다. 그러나 그것을합니까? 아무도 몰라? 나는 플랫폼의 근원에 익숙하지 않고 거기에서 발굴하지 않기를 희망한다. 그래서 누군가 경험을 공유한다면 나는 감사 할 것이다.
아마도 감사합니다. 나는 당신의 대답을 받아들이 기 전에 그것을 확인해야합니다. –
확인이 GestureDetector는 내가 필요한 것을 확실히합니다. 나는 아직도 나의 활동에서 그것을 올바르게 사용하는 방법을 찾아야 만한다. 그러나 나의 원래의 질문에 답이있다. 도와 줘서 고마워. –
도움이 된 것을 기쁘게 생각합니다. 'GestureDetector'는 사소한 것이 아니지만, 온라인으로보기 좋은 예가 몇 가지 있습니다. – 323go