2012-10-19 6 views
17

Wie erkenne ich das Berührungsereignis, wenn der Benutzer die Ansicht A berührt und sich über die Ansicht B nach unten bewegt. Ich möchte das Berührungsereignis in Ansicht B erkennen.Touch-Ereignis in einer Ansicht erkennen, wenn aus einer anderen Ansicht gezogen wird

ich habe im Hinblick auf B Touch Zuhörer aber die Ereignisse nicht empfangen, wenn der Benutzer zunächst A berührt und über die B gezogen

enter image description here

+0

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

Antwort

53

Sie können Verwenden Sie den folgenden Code, um Ihre Anfrage zu beantworten:

Method Ansicht Grenzen testen (in Code beloow verwendet)

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); 
    } 

Testing mit zwei TextView

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

Einrichtung ViewA

Der leere OnClickListener zu erforderlich ist behalte OnTouchListener aktiv, bis ACTION_UP

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; 
     } 
    }); 

Setup-ViewB

Dies nur, wenn Sie auch auf ViewB und ziehen, um 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; 
     } 
    }); 

Grüße drücken wollen erforderlich ist.

+1

Wie sieht der Code im Fall von mehr als 2 Ansichten aus? –

0

Versuchen Sie, die Drag-and-Drop-Rahmen.

+4

Das ist nur möglich für 3.0 oder später – Magakahn

1

Ich bin sicher, dass Sie die Methode ViewGroup.dispatchTouchEvent(MotionEvent ev) in Ihrer ViewGroup mit den Ansichten A und B überschreiben müssen. Die ursprüngliche Implementierung definiert die Zielansicht, wenn der Container MotionEvent.getAction() == MotionEvent.ACTION_DOWN empfängt und dann alle folgenden Touch-Ereignisse an die Zielansicht sendet, bis sie empfangen wird MotionEvent.getAction() == MotionEvent.ACTION_UP oder MotionEvent.ACTION_CANCEL.

In Ihrem Fall ist die Zielansicht A oder der Containter selbst (hängt von Ihrem Container ab onInterceptTouchEvent(MotionEvent ev) Methodenimplementierung). Sie sollten also dieses Verhalten außer Kraft setzen und Berührungsereignisse nicht nur an die Zielansicht senden, sondern auch an alle Ansichten, die sich unter dem berührten Bereich befinden (z. B. um B anzuzeigen).

Wenn Sie interessiert sind, können Sie Code-Beispiel teilen und ich werde versuchen, Ihnen weiter zu helfen.

+0

[Ich habe auch das gleiche Problem] (http://stackoverflow.com/questions/13309111/programatically-execute-another-touch-event-when-one-touch-event-occures-in-andr). Kannst du Democode für Hilfe geben? –

0

Wenn Sie über Ansicht B sind, rufen Sie die Nummer onTouch manuell an.

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

Wenn Sie true vom onTouchEvent der Ansicht A zurückgeben, wird das Ereignis nicht weitergegeben. In diesem speziellen Fall, wenn A unter B ist, gebe false von onTouch der Ansicht A zurück.

Es würde auch helfen, wenn Sie etwas Code posten können.

1

In ViewA, außer Kraft setzen onTouchEvent wie folgt:

@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; 
} 

In ViewB, überschreiben Sie die gleiche Methode, dafür, dass Sie return false:

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

Lassen Sie uns @ dcanh121 zuerst testen. Oder Sie können einen konstruktiven Kommentar abgeben - zum Beispiel, warum Sie glauben, dass es nicht funktioniert und wie Sie glauben, dass es angepasst werden sollte. – Phil