2012-12-23 4 views
0

확실히 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); 
      } 
     } 
    } 
} 

그래서 나는 올바른 추측을 한 것처럼 보입니다. 안드로이드는 비슷한 비슷한 것을 가지고 있습니다. 그러나 그것을합니까? 아무도 몰라? 나는 플랫폼의 근원에 익숙하지 않고 거기에서 발굴하지 않기를 희망한다. 그래서 누군가 경험을 공유한다면 나는 감사 할 것이다.

답변

0

GestureDetector을 찾고 계십니까?

+0

아마도 감사합니다. 나는 당신의 대답을 받아들이 기 전에 그것을 확인해야합니다. –

+0

확인이 GestureDetector는 내가 필요한 것을 확실히합니다. 나는 아직도 나의 활동에서 그것을 올바르게 사용하는 방법을 찾아야 만한다. 그러나 나의 원래의 질문에 답이있다. 도와 줘서 고마워. –

+0

도움이 된 것을 기쁘게 생각합니다. 'GestureDetector'는 사소한 것이 아니지만, 온라인으로보기 좋은 예가 몇 가지 있습니다. – 323go

관련 문제