2017-03-12 1 views
0

Ich erstelle eine Schnittstelle, wo Sie Punkte berühren können, indem Sie sie berühren, aber wenn ich versuche, zu erkennen, ob die Bildansicht berührt wird, erkennt nur Taps, und nicht wenn ich mehrere Punkte gleichzeitig berühre .Suche nach berührten ImageView

Beispiel: Wenn ich auf einen Punkt klicke, leuchtet es auf. Aber wenn ich über mehrere Punkte wische, leuchtet nur der erste Punkt, den ich berührt habe, und nicht alle Punkte, die ich berührte.

Ich habe derzeit eine onTouchlistener wie diese ein:

v.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     ImageView view = (ImageView) v; 
     if(toState == 1){ 
      view.setImageResource(R.mipmap.dot_on); 
     }else if(toState == 0){ 
      view.setImageResource(R.mipmap.dot_off); 
     } 

     return false; 
    } 
v}); 

‚toState‘ wird durch eine Taste geändert, damit Sie sie zwischen Drehen der Punkte auf oder Ausschalten umschalten.

Kann mir bitte jemand sagen, was ich falsch mache?

EDIT

der Aktivität:

public class new_frame extends AppCompatActivity { 
     public int toState = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_new_frame); 
     Display display = getWindowManager().getDefaultDisplay(); 
     final ToggleButton toStateBTN = (ToggleButton) findViewById(R.id.toggleButton); 
     toStateBTN.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if(toState == 1){ 
       toState = 0; 
      }else if(toState == 0){ 
       toState = 1; 
      }else{ 
       Toast.makeText(getApplicationContext(),"Something went wrong",Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }); 
    Point size = new Point(); 
    display.getSize(size); 
    int width = size.x; 
    int Dim = width/24; 
    RelativeLayout View = (RelativeLayout) findViewById(R.id.Layout); 
    for (int i = 0;i<View.getChildCount();i++) { 
     View v = View.getChildAt(i); 
     if (v instanceof ImageView) { 
      //((ImageView) v).setMaxHeight(ledDim); 
      //((ImageView) v).setMaxWidth(ledDim); 
      ViewGroup.LayoutParams params = (ViewGroup.LayoutParams)v.getLayoutParams(); 
      Log.d("NewFrame", "child found: " + v.getId() + ". Set dimensions from " + params.height + "," + params.width + " to " + Dim + "," + Dim); 
      params.width = Dim; 
      params.height = Dim; 
      v.setLayoutParams(params); 
      v.setOnTouchListener(new View.OnTouchListener() { 
       @Override 
       public boolean onTouch(View v, MotionEvent event) { 
        ImageView view = (ImageView) v; 
        if(toState == 1){ 
         view.setImageResource(R.mipmap.dot_on); 
        }else if(toState == 0){ 
         view.setImageResource(R.mipmap.dot_off); 
        } 

        return false; 
       } 
      }); 
     } 
    } 
    } 
} 

die xml nur 200 Punkte, mit einem Knopf daneben. Der Knopf und die Punkte funktionieren, ich kann Punkte an/aus tippen, ich kann nur nicht die Swipe-An/Aus-Funktionalität zu arbeiten.

+0

Verwendung Kombination von Geste lister mit Touch Zuhörer –

Antwort

0

Sie können wie folgt tun. Legen Sie den gleichen Code für jede Art von Motion Event fest. Und zurück auch TRUE:

v.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent arg1) { 
     final ImageView view = (ImageView) v; 
     switch (arg1.getAction()) { 
      case MotionEvent.ACTION_DOWN: { 

      if(toState == 1){ 
       view.setImageResource(R.mipmap.dot_on); 
      }else if(toState == 0){ 
       view.setImageResource(R.mipmap.dot_off); 
      } 
      break; 
      } 

      case MotionEvent.ACTION_MOVE:{ 

      if(toState == 1){ 
       view.setImageResource(R.mipmap.dot_on); 
      }else if(toState == 0){ 
       view.setImageResource(R.mipmap.dot_off); 
      } 
      break;   
      } 

      case MotionEvent.ACTION_UP: { 

      if(toState == 1){ 
       view.setImageResource(R.mipmap.dot_on); 
      }else if(toState == 0){ 
       view.setImageResource(R.mipmap.dot_off); 
      } 
      break; 
      } 
     } 
     return true; 
    } 
}); 
+0

Es funktioniert immer noch nicht –

+0

Welche Probleme stehen vor Ihnen? Kannst du deiner Aktivität bitte volle Aktivität und Layout hinzufügen? – tahsinRupam

+0

Es gibt ein kleines Update in v.setOnTouchListener (neue View.OnTouchListener() Zeile. Sie können versuchen. – tahsinRupam

0

fand ich die Antwort selbst, da keiner Ihrer Vorschläge gearbeitet.

Ich habe es funktioniert mit einer Vielzahl von Rect mit einem onTouchListener auf der Hauptansicht (Eltern der Ansicht der Punkte).

In der onCreate() Methode initiierte ich ein Rect [] mit einem Rect für jeden Punkt, den ich habe.

for (int i=0;i<v.getChildCount;i++) { 
    Rects[i] = new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()); 
} 

Dann in den onTouchListener der Hauptansicht ich überprüfen, ob eine der Rects die Position in dem OnTouchListener markiert enthält. Wenn einer von ihnen tut, schalte ich sie ein/aus.

mainView.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) {   
     for (int i=0;i<v.getChildCount;i++) { 
      if (Rects[i].contains((int) event.getX(), (int) event.getY())) { 
       //turn dot on/off 
      } 
     } 
    } 
}