2013-08-05 3 views
2

나는이 복잡한 질문에 내가 당신에게서 아이디어를 얻기를 바라고 있습니다. 여기 onInterceptTouchEvent()를 사용할 때 터치 이벤트 감지

는 일이 : 나는 사용자 지정 목록보기 클래스를 생성 한, 위의 하나

public class FolderListView extends ListView { 

    private float xDistance, yDistance, lastX, lastY; 
    private int folder_index; 
    private FolderViewInterface openFolder; 

    // private boolean swiping = false; 

    // If built programmatically 
    public FolderListView(Context context) { 
     super(context); 
    } 

    // This example uses this method since being built from XML 
    public FolderListView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    // Build from XML layout 
    public FolderListView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 

     switch (ev.getAction()) { 

     case MotionEvent.ACTION_UP: 
      // if (swiping == false) { 

      //if (xDistance > yDistance) 
      // return false; 
     // else { 
       folder_index = pointToPosition((int) lastX, (int) lastY); 
      // Toast.makeText(getContext(), 
      //   "You pressed a folder with index: " + folder_index, 
      //   Toast.LENGTH_SHORT).show(); 
     // } 
      HomeScreenFragment f = new HomeScreenFragment(); 
      openFolder = (FolderViewInterface) f; 
      openFolder.onFolderOpened(folder_index); 
      // } 
      // swiping = false; 
      break; 

     case MotionEvent.ACTION_DOWN: 
      // swiping = false; 
      xDistance = yDistance = 0f; 
      lastX = ev.getX(); 
      lastY = ev.getY(); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      // swiping = true; 
      final float curX = ev.getX(); 
      final float curY = ev.getY(); 
      xDistance += Math.abs(curX - lastX); 
      yDistance += Math.abs(curY - lastY); 
      lastX = curX; 
      lastY = curY; 
      if (xDistance > yDistance) 
       return false; 
     } 

     return super.onInterceptTouchEvent(ev); 

    } 

} 

것은 여기에 내가 제대로 터치 이벤트를 감지 찾고 있어요. 다른 조각을 열려면 터치하고 싶지만, 지금은 조각을 터치하거나 스 와이프하여 열 수 있습니다.

내 목록의 요소가 뷰 페이지이고 스크롤 할 때 제대로 작동하지 않았기 때문에 onInterceptTouchEvent를 사용했습니다.

본인은 스 와이프를 감지하고이 부분을 수행하지 여기 로직의 일종이 필요합니다

이벤트가 터치 이벤트가 아닌 슬쩍 한 경우에만
HomeScreenFragment f = new HomeScreenFragment(); 
      openFolder = (FolderViewInterface) f; 
      openFolder.onFolderOpened(folder_index); 

.

어떤 종류의 제안/도움도 매우 높이 평가됩니다. 자세한 내용이 필요하면 알려주십시오.

감사합니다.

+0

왜 그냥 추가하지를 onClickListener'? – Desert

+0

시도해 보니 작동하지 않습니다 ... –

+0

시도해 볼 수있는 코드를 게시 할 수 있습니까? – Desert

답변

2

내가 time 125 PRESSED_STATE_DURATION

에 따라이

//Declare as instance variables 
int oldX,oldY,newX,newY; 
//State the minimum distance of swipe that you forgive the user for ;) 
int distance = 10; 
int time = 125; 
boolean cancel = false; 
case MotionEvent.ACTION_DOWN: 
cancel = false; 
//Get x and y of touch 
oldX = ev.getX(); 
oldY = ev.getY(); 
startActionTimer(); 

case MotionEvent.ACTION_MOVE: 
//Get x and y of touch 
newX = ev.getX(); 
newY = ev.getY(); 

case MotionEvent.ACTION_UP: 
cancel = true; 

private void startActionTimer(){ 
     //time is pressed state duration 
      new CountDownTimer(time, time) { 
      public void onTick(long millisUntilFinished) {} 

      public void onFinish() { 
       //Time to do our action!!! 
       // please consider 
       if((Math.abs(newX - oldX)< distance) && (Math.abs(newY - oldY) <distance)){ 
        if(cancel == false){ 
        // Now its a touch so do your action 
        } 
       } 
      } 
      }.start(); 
    } 

참고하십시오 복용하고 있습니다 :이 문제를 방지하기 위해 클래스 변수로 모든 변수 (인스턴스 변수)를 사용하세요. 가끔 내가 이상한 상황을 얻을 수 있기 때문에 값은

또는

왜 당신이 gesture detection

을 시도하고 onSingleTapUp 방법 여기

+0

당신의 방법을 시도 할 것입니다, 귀하의 신속한 회신을 주셔서 감사합니다 –

+0

안녕하세요 'ACTION_UP ', 그래서 그냥 코드를 편집했습니다 : –

+0

죄송합니다 나를 위해 작동하지 않습니다 ... 나는 당신의 코드를 시도했지만이 방식으로 내 초기 기능을 잃고있다 : 어느 목록을 가로 챌 수있는 호출기로 스크롤 목록을 가로 챌 수 없었다 스크롤은 호출기가 스 와이프하는 것을 허용하지 않습니다 ... 이미 작성한 것에 기초한 무언가가 필요합니다 ...하지만 힌트를 주셔서 고맙습니다. –

0

항목을 만졌을 때 무언가를해야한다면 사용자 정의 ListView이 필요하지 않으며 listView의 어댑터 인 수신기 .setOnItemClickListener()을 설정하기 만하면됩니다.

+0

그게 문제입니다. 두 가지 일을해야합니다. 한 번 스 와이프했을 때 하나는 만졌을 때. 스 와이프는 viewpager에 의해 처리되고 두 이벤트가 간섭합니다. 즉, 내 문제입니다 ... –

+0

글쎄, 클릭이 해당 리스너에 의해 처리됩니다. 스 와이프에 문제가 있으면 'requestDisallowInterceptTouchEvent ()' – bogdan

+0

그래서 스 와이프는 viewpager의 구현에 의해 커버되고 잘 동작합니다. 문제는 여기에 새 조각이 나는 슬쩍 때 열고 터치, 난 단지 그것을 만지기 만하면됩니다 .... –

0

내 질문에 대한 대답은 우선하지 않습니다 제대로 업데이트되지 않은 경우 나는 결국 그것을 알아 냈다. 난 그냥 부울 변수를 사용하여 스 와이프가 수행되었는지 확인하고 스 와이프하지 않을 때 적절한 작업을 수행해야했습니다. 그것은 매우 민감하기 때문에 가장 좋은 해결책은 아니지만 (조금이라도 스 와이프를 시도해도 감지 할 수 있지만) 여전히 뭔가 있습니다.

도와 주셔서 감사합니다. 여기

은 내 업데이트 된 코드입니다 :`당신의 품목보기로

package ro.gebs.captoom.utils; 

import ro.gebs.captoom.fragments.HomeScreenFragment; 
import ro.gebs.captoom.interfaces.FolderViewInterface; 
import android.content.Context; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.widget.ListView; 

public class FolderListView extends ListView { 

    private float xDistance, yDistance, lastX, lastY; 
    private int folder_index; 
    private FolderViewInterface openFolder; 

    private boolean swiping = false; 

    // If built programmatically 
    public FolderListView(Context context) { 
     super(context); 
    } 

    // This example uses this method since being built from XML 
    public FolderListView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    // Build from XML layout 
    public FolderListView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 

     switch (ev.getAction()) { 

     case MotionEvent.ACTION_UP: 
      folder_index = pointToPosition((int) lastX, (int) lastY); 
      if (!swiping) { 
       HomeScreenFragment f = new HomeScreenFragment(); 
       openFolder = (FolderViewInterface) f; 
       openFolder.onFolderOpened(folder_index); 
      } 
      swiping = false; 
      break; 

     case MotionEvent.ACTION_DOWN: 
      xDistance = yDistance = 0f; 
      lastX = ev.getX(); 
      lastY = ev.getY(); 

      break; 
     case MotionEvent.ACTION_MOVE: 
      final float curX = ev.getX(); 
      final float curY = ev.getY(); 
      xDistance += Math.abs(curX - lastX); 
      yDistance += Math.abs(curY - lastY); 
      lastX = curX; 
      lastY = curY; 
      if (xDistance > yDistance) { 
       swiping = true; 
       System.out.println("I AM HEREEEEEE"); 
       return false; 
      } 

     } 

     return super.onInterceptTouchEvent(ev); 

    } 

}