2017-02-07 14 views
0

コードに2つのOnTouchListenersがあり、実行するたびにリスナーの名前を変更しても機能しません。 私は2つのView.OnTouchListenersを持っていますが、1つだけが動作します

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


} 

は、ここで私はこのコードを実行すると、画面

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

の周りに文字を移動させることである秒で、OnTouchリスナーとの1は動作しますが、他にはありません。

私は多くの研究を行いました。私が試したことはすべて機能しません。

答えて

3

私は2つのView.OnTouchListeners実際

を持って、そこに一つだけだし、ここで

onTouch1

はSDKには何の意味もない理由...です。あなたがしたことはすべて方法を定義することでした。あなたのコンパイラは、メソッドが使用されていないことを伝えるかもしれません。

ここにはthisが含まれています。

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

したがって、thisView.OnTouchListenerあり、それが唯一の方法は、onTouchでいます。

メソッドに正しく注釈を付けると、そのことが分かります。例えば、

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

} 

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

} 

は、あなたの代わりにこのような何かを行うことができ...

は唯一無二のonTouchメソッドを使用し、各ボタンにcaseswitch (view.getId())を追加します。

@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 
      switch (event.getAction() & MotionEvent.ACTION_MASK) { 
       case MotionEvent.ACTION_DOWN: 
        // ... 
      return true; 
    } 
    return false; 
} 

当然のことながら、それを多くの別々の方法にリファクタリングすることを決定します。

たとえば、onTouch1のままにしたい場合は、onTouchを直接委任することができます。あなたが削除する必要がありますので、また

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

case MotionEvent.ACTION_DOWN:は、ビューのIDを使用して、スイッチ上でトリガすべきではありません、それ

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

私はあなたにいくつかの混乱を与えたが、私はの多くを理解していなかったので、申し訳ありませんあなたが研究をしても何を書いたのですか?私はそれを理解できるかどうかを知りましたか? – unnamed

+0

あなたのコードで、あなたは 'switch(v.getId()){case R.id.button1:' ...そうです;私は別のボタンIDに対して別のcase文を追加しました。それでおしまい! –

関連する問題