2012-10-19 1 views
17

사용자가보기 A를 터치하고보기 위로 아래로 드래그하면 어떻게 터치 이벤트를 감지합니까?보기 B에서 터치 이벤트를 감지하고 싶습니다.다른보기에서 끌 때보기에서 터치 이벤트 감지

사용자가 처음에 감동하고

enter image description here

+0

[이 참조] (http://stackoverflow.com/questions/13309111/programatically-execute-another-touch-event-when-one-touch-event-occures-in-andr) –

답변

53

당신이 할 수있는 귀하의 요청에 따라 아래 코드를 사용하십시오 :

뷰 경계을 테스트하는

방법이 TextView

final TextView viewA = (TextView) findViewById(R.id.textView); 
    final TextView viewB = (TextView) findViewById(R.id.textView2); 

이 설정 viewA

OnClickListener가에 필요로

Rect outRect = new Rect(); 
    int[] location = new int[2]; 

    private boolean isViewInBounds(View view, int x, int y){ 
     view.getDrawingRect(outRect); 
     view.getLocationOnScreen(location); 
     outRect.offset(location[0], location[1]); 
     return outRect.contains(x, y); 
    } 

테스트를 (코드 beloow에 사용) 계속활성3210

viewA.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) {} 
    }); 

    viewA.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      int x = (int)event.getRawX(); 
      int y = (int)event.getRawY(); 
      if(event.getAction() == MotionEvent.ACTION_UP){ 
       if(isViewInBounds(viewB, x, y)) 
        viewB.dispatchTouchEvent(event); 
       else if(isViewInBounds(viewA, x, y)){ 
        Log.d(TAG, "onTouch ViewA"); 
        //Here goes code to execute on onTouch ViewA 
       } 
      } 
      // Further touch is not handled 
      return false; 
     } 
    }); 

ACTION_UP까지 설정 viewB

당신은 또한 viewA

viewB.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) {} 
    }); 

    viewB.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      int x = (int)event.getRawX(); 
      int y = (int)event.getRawY(); 
      if(event.getAction() == MotionEvent.ACTION_UP){ 
       if(isViewInBounds(viewA, x, y)) 
        viewA.dispatchTouchEvent(event); 
       else if(isViewInBounds(viewB, x, y)){ 
        Log.d(TAG, "onTouch ViewB"); 
        //Here goes code to execute on onTouch ViewB 
       } 
      } 
      // Further touch is not handled 
      return false; 
     } 
    }); 

감사에 viewB 드래그에 눌러 원하는 경우에만 필요합니다.

+1

2보다 큰보기의 경우 코드가 어떻게 보이나요? –

0

드래그를 사용하여 시도하고 프레임 워크를 드롭 B.

위로 끌면 경우

내가보기 B에서 터치 리스너를 추가했지만 이벤트를 수신하지 않습니다.

+4

만 avalible 즉 3.0 또는 그 이후 – Magakahn

1

Views A와 B가 포함 된 ViewGroup에서 override ViewGroup.dispatchTouchEvent(MotionEvent ev) 메서드가 필요하다고 확신합니다. 컨테이너는 MotionEvent.getAction() == MotionEvent.ACTION_DOWN을 수신하면 대상 뷰를 정의한 다음 수신 할 때까지 다음 터치 이벤트를 모두 대상 뷰로 전달합니다 MotionEvent.getAction() == MotionEvent.ACTION_UP 또는 MotionEvent.ACTION_CANCEL.

대상보기가 A 또는 컨테이너 자체입니다 (컨테이너 구현시 onInterceptTouchEvent(MotionEvent ev) 메소드 구현). 따라서 이러한 동작을 무시하고 터치 이벤트를 대상보기뿐만 아니라 터치 된 영역 아래의 모든보기 (예 : B보기)로 전달해야합니다.

관심이 있으시면 코드 샘플을 공유하면 도움을 드리겠습니다.

+0

[나는 또한 이것에 동일한 문제가있다] (http://stackoverflow.com/questions/13309111/programatically-execute-another-touch-event-when-one-touch-event-ocentures-in-andr). 데모 코드를 제공해 줄 수 있습니까? –

0

B면에있을 때 수동으로 onTouch이라고 부릅니다.

if (viewBRect.contains(x, y)) { 
    viewBsonTouch(view, motionEvent); 
} 
1

뷰 A의 onTouchEvent에서 true를 반환하면 이벤트가 전파되지 않습니다. 이 특별한 경우에 A가 B보다 낮 으면 온 스크린 A에서 false를 반환합니다.

일부 코드를 게시 할 수도 있습니다.다음과 같이

1

View에서 onTouchEvent를 오버라이드 (override) :

@Override 
public boolean onTouchEvent(MotionEvent event) 
{ 

    float x = event.getRawX(); 
    float y = event.getRawY(); 
    if ((B.getLeft() <= x <= B.getRight()) && 
     (B.getTop() <= y <= B.getBottom()) 
     ) 
    { 
     Log.i("A", "Motion Event is currently above B"); 
     B.dispatchTouchEvent(event); 
    } 

    return true; 
} 

BView에서, 같은 방법을 우선 확인하고 당신이 돌아 거짓 :

@Override 
public boolean onTouchEvent(MotionEvent event) 
{ 
    //TODO handle touch event 
    return false;//this will allow A to continue using the event 
} 
+0

@ dcanh121이 먼저 테스트 해 보겠습니다. 또는 건설적인 의견을 제시 할 수 있습니다. 예를 들어 왜 그것이 효과가 없다고 생각하는지, 어떻게 조정해야한다고 생각하는지 등입니다. – Phil