2017-02-07 2 views
0

Ich habe zwei OnTouchListeners in meinem Code und jedes Mal wenn ich es ausführen - auch wenn ich den Namen des Hörers ändern - es funktioniert nicht.Ich habe zwei View.OnTouchListeners, aber nur eine funktioniert

//here is one 
public boolean onTouch(View view, MotionEvent event){ 

    // this is for being able to move a spawned image with no id and id not on the activity till created 
    final int X = (int) event.getRawX(); 
    final int Y = (int) event.getRawY(); 

    switch (event.getAction() & MotionEvent.ACTION_MASK) { 
     case MotionEvent.ACTION_DOWN: 
      RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) view.getLayoutParams(); 
      _xDelta = X - lParams.leftMargin; 
      _yDelta = Y - lParams.topMargin; 
      break; 
     case MotionEvent.ACTION_UP: 
      break; 
     case MotionEvent.ACTION_POINTER_DOWN: 
      break; 
     case MotionEvent.ACTION_POINTER_UP: 
      break; 
     case MotionEvent.ACTION_MOVE: 
      if (no == 1) ; 
       //do nothing 
      else { 
       RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams(); 
       layoutParams.leftMargin = X - _xDelta; 
       layoutParams.topMargin = Y - _yDelta; 
       layoutParams.rightMargin = -250; 
       layoutParams.bottomMargin = -250; 
       view.setLayoutParams(layoutParams); 
       break; 
      } 
      _root.invalidate(); 
      return true; 

    } 
    return true; 

} 


@Override 
public void onBackPressed() { 
    new AlertDialog.Builder(this) 
      .setIcon(android.R.drawable.ic_dialog_alert) 
      .setTitle("    exit") 
      .setMessage("Are you sure you want to exit?." + 
        "your progress will not be saved") 
      .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        finish(); 
        startActivity(new Intent(getApplicationContext(), level.class)); 

       } 

      }) 
      .setNegativeButton("No", null) 
      .show(); 
} 

Button left, right; 
ImageView i1, pic2; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_level1_game); 

    _root = (ViewGroup) findViewById(R.id.root); 
    addnumbers = new TextView(this); 
    addnumbers.setText(Integer.toString(number)); 
    _root.addView(addnumbers); 

    left = (Button) findViewById(R.id.button1); 
    right = (Button) findViewById(R.id.button2); 
    left.setOnTouchListener(this); 
    right.setOnTouchListener(this); 

    i1 = (ImageView) findViewById(R.id.imageView2); 

    findViewById(R.id.button2).setVisibility(View.INVISIBLE); 
    findViewById(R.id.button1).setVisibility(View.INVISIBLE); 
    findViewById(R.id.button3).setVisibility(View.INVISIBLE); 
    findViewById(R.id.button4).setVisibility(View.INVISIBLE); 
    findViewById(R.id.imageView2).setVisibility(View.INVISIBLE); 


} 

Hier ist die zweite, die einen Charakter auf dem Bildschirm

public boolean onTouch1(View v, MotionEvent event) { 

    switch (v.getId()) { 
     case R.id.button1: 
     case MotionEvent.ACTION_DOWN: { 
      RelativeLayout.LayoutParams mParams = (RelativeLayout.LayoutParams) 
        i1.getLayoutParams(); 
      findViewById(R.id.imageView2).setBackgroundDrawable(getResources().getDrawable(R.drawable.realguy1)); 
      mParams.leftMargin -= 20; 
       i1.setLayoutParams(mParams); 
       break; 
      } 
     } 

Wie ich diesen Code ausführen zu bewegen ist, funktioniert das mit dem OnTouch Zuhörer, aber der andere nicht.

Ich habe viel Forschung gemacht, und alles, was ich versucht habe, funktioniert einfach nicht.

Antwort

3

Ich habe zwei View.OnTouchListeners

Eigentlich ist es nur eine, und hier ist der Grund ...

onTouch1 nichts mit dem SDK bedeutet. Sie haben lediglich eine Methode definiert. Ihr Compiler könnte Ihnen sogar sagen, dass die Methode nicht verwendet wird.

Beide gehen zu onTouch, denn so ist this hier impliziert. Deshalb

left.setOnTouchListener(this); 
right.setOnTouchListener(this); 

, this ist die einzige View.OnTouchListener und es ist nur Methode onTouch ist.

Wenn Sie Ihre Methoden richtig annotiert haben, würden Sie das sehen. Zum Beispiel

@Override // This is okay 
public boolean onTouch(View view, MotionEvent event){ 

} 

@Override // Not okay, nothing to override 
public boolean onTouch1(View view, MotionEvent event){ 

} 

Nun könnte man so etwas wie dies stattdessen tun ...

Verwenden Sie die einzige onTouch Methode und fügen Sie eine switch (view.getId()) mit einem case auf jeder Taste.

Natürlich ist es Ihre Entscheidung, das in viele separate Methoden umzuwandeln, wie Sie es für richtig halten.

Zum Beispiel, wenn Sie behalten möchten, können Sie onTouch direkt an ihn delegieren.

@Override 
public boolean onTouch(View view, MotionEvent event){ 
    final int X = (int) event.getRawX(); 
    final int Y = (int) event.getRawY(); 
    switch (view.getId()) { 
     case R.id.button1: 
      // left 
      switch (event.getAction() & MotionEvent.ACTION_MASK) { 
       case MotionEvent.ACTION_DOWN: 
        // ... 
      } 
      return true; 
     case R.id.button2: 
      // right 
      return onTouch1(view, event); // delegate to other method 
    } 
    return false; 
} 

Auch case MotionEvent.ACTION_DOWN: sollte nie auf einen Schalter ausgelöst werden, um die Ansicht ID verwenden, so sollten Sie es entfernen

switch (v.getId()) { 
    case R.id.button1: 
    case MotionEvent.ACTION_DOWN: // Shouldn't work 
+0

So sorry ich habe Ihnen einige Verwirrung, aber ich verstand nicht viel von was du geschrieben hast, sogar mit der Forschung, die ich getan habe, um zu sehen, ob ich es verstehen konnte – unnamed

+0

In deinem Code hast du 'switch (v.getId()) {case R.id.button1:' ... also tue ich;) Now , Habe ich nur eine weitere case-Anweisung für eine andere Schaltflächen-ID hinzugefügt. Das ist es! –

Verwandte Themen