2011-11-20 3 views
2

현재 상당히 잘 작동하는 드로잉 응용 프로그램을 위해 줌이 구현되어 있습니다. 그냥 몇 줄에 내가 무슨 말을하는지 알 수 있습니다 :android : 클릭 (ACTION_DOWN)을 트리거하지 않고 줌을 집어 넣는 방법

setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent rawEvent) { 
       WrapMotionEvent event = WrapMotionEvent.wrap(rawEvent); 

       // Handle touch events here... 
       switch (event.getAction() & MotionEvent.ACTION_MASK) { 
       case MotionEvent.ACTION_DOWN: 
        drawSomethingHere(); 
       case MotionEvent.ACTION_POINTER_DOWN: 
        startZoomingModeHere(); 
... 

그래서 내가 원하는 것은 : 한 손가락으로 그립니다. 두 손가락으로 확대/축소합니다. 문제 : 두 번째 손가락이 표면에 닿기 전에 항상 ACTION_DOWN 이벤트가 트리거됩니다. 그래서 언제든지 확대하고 싶을 때마다 내 앱이 줌 모드가 시작되기 전에 포인트를 그립니다.

누군가이 문제를 해결하는 방법에 대해 알고 있습니까?

답변

0

은 다음과 같습니다 ACTION_UP와 ACTION_MOVE에

  1. 그리기 대신 ACTION_MOVE에 ACTION_DOWN
  2. 의 대신 (이 있는지 확인합니다 버퍼에 포인트를 넣어, 즉시 그릴하지 않습니다 당신이 멀티 터치 이벤트가 발생하기 전에 우발적 인 단일 터치 이벤트를 해석하지 마십시오.)
  3. 버퍼가 3 포인트가되자 마자 드로잉 모드를 시작합니다.
  4. ACTION_POINTER_ DOWN 이벤트가 발생했습니다 (멀티 터치가 발생했습니다). 버퍼를 지우고 확대/축소 모드를 시작하십시오.

이것은 내가 할 수있는 최선의 방법입니다. 결과는 꽤 설득력이 있습니다 ...

+0

동일한 문제에 직면하고 있습니다. 솔루션에 대해 자세히 설명해 주시겠습니까? – anz

0

그리기를 시작하기 전에 몇 밀리 초를 기다려야한다고 생각합니다. 동일한 밀리 초에 정확하게 두 손가락을 넣을 수 없기 때문입니다.

대기 할 부울 변수를 가질 수 있습니다.

부울 boolean_pointer_down = false; 로 해결

switch (event.getAction() & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_DOWN: 
      // Start a thread to call drawSomethingHere in 300 - 700 milliseconds 
      // if action_pointer_down haven’t been called. 
      new ThreadDraw().start(); 
      case MotionEvent.ACTION_POINTER_DOWN: 
       boolean_pointer_down=true; 
       startZoomingModeHere(); 
.... 

//Method run in the thread 
public void run(){ 
    wait(300); //if the user didn't put more fingers in 300 ms he's not going to zoom 
    if (!boolean_pointer_down){ 
    drawSomethingHere(); 
    boolean_pointer_down = false; 
    } 
    } 
+0

thats 아이디어. 그리기를 원한다면 기다리지 않고 그릴 수 있어야합니다. 코드를 사용하면 사용자는 그림을 그릴 때 약간의 지연 시간을 느낄 것입니다./ – stoefln

관련 문제