2013-10-24 4 views
10

Ich habe ein Raster von 66 Ansichten und wenn eine Ansicht berührt oder gezogen/verschoben wird, möchte ich die Hintergrundfarbe ändern.Ermitteln, welche Ansicht gerade berührt wird, während der Benutzer Finger bewegt

Ich schätze, ich muss einen Touch-Listener auf die übergeordnete ViewGroup setzen, aber wie kann ich feststellen, welche Child-Ansicht gezogen/verschoben wird?

+0

können Sie bitte die Lösung für dieses Problem teilen. Da ich ähnliche Aufgaben erledigen wollte. – Anmol

+0

@Annol Siehe die akzeptierte Antwort unten. – bgolson

Antwort

11

gefunden meine Antwort hier:

Android : Get view only on which touch was released

Sieht aus wie Sie eine Schleife durch die Ansichten Kind haben und sie manuell Treffererkennung, welche die Berührung ist derzeit mehr als sehen zu finden.

tat dies, indem dispatchTouchEvent zwingende auf der übergeordneten Linearlayout:

LinearLayout parent = new LinearLayout(this.getActivity()){ 
    @Override 
    public boolean dispatchTouchEvent(MotionEvent ev) { 
     int x = Math.round(ev.getX()); 
     int y = Math.round(ev.getY()); 
     for (int i=0; i<getChildCount(); i++){ 
      LinearLayout child = (LinearLayout)row.getChildAt(i); 
      if(x > child.getLeft() && x < child.getRight() && y > child.getTop() && y < child.getBottom()){ 
       //touch is within this child 
       if(ev.getAction() == MotionEvent.ACTION_UP){ 
        //touch has ended 
       } 
      } 
     } 
     return true; 
    } 
} 
1

Nicht getestet, aber ich würde denken, dass Sie etwas tun könnte, ähnlich wie: ScrollView Inside ScrollView

parentView.setOnTouchListener(new View.OnTouchListener() { 

       public boolean onTouch(View v, MotionEvent event) { 
        Log.v(TAG,"PARENT TOUCH"); 
        findViewById(R.id.child).getParent().requestDisallowInterceptTouchEvent(false); 
        return false; 
       } 
      }); 
      childView.setOnTouchListener(new View.OnTouchListener() { 

       public boolean onTouch(View v, MotionEvent event) 
       { 
        Log.v(TAG,"CHILD TOUCH"); 
        // Disallow the touch request for parent on touch of child view 
        v.getParent().requestDisallowInterceptTouchEvent(true); 
        return false; 
       } 
      }); 

Vielleicht, indem Sie einfach durch alle childViews Looping, die OnTouchListener Einstellung.

+0

Danke für Ihre Antwort. Das Problem ist onTouch auf dem Kind wird nur ausgelöst, wenn eine Berührung in der Ansicht beginnt. Es reagiert nicht auf Ziehen. Ich habe eine Lösung gefunden und oben gepostet. Danke noch einmal! – bgolson