2016-05-01 1 views
1

Почему View.OnTouchListener() работает так странно, когда я просто прошу его увеличивать 1? приращения нажмитеДискретные события OnTouchListener

public class Clicker extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.clicker); 
     TextView t = (TextView) findViewById(R.id.counter); 
     ImageView v = (ImageView) findViewById(R.id.image); 
     if (v != null) { 

      v.setOnTouchListener(new View.OnTouchListener() { 
       int count = 3123; 
       @Override 
       public boolean onTouch(View arg0, MotionEvent me) { 
        v.setSelected(me.getAction()== MotionEvent.ACTION_DOWN); 
        count = count + 1; 
        t.setText(String.format("%d",count)); 
        return true; 
       } 
      }); 
     } 
    } 
} 

enter image description here 1 2 или 3 балла.

+1

onTouch будет вызывать больше, чем один раз, как ACtion_down, action_up и т.д .. – Krish

ответ

1

Метод onTouch вызывается для множества различных событий касания, включая ACTION_DOWN, ACTION_MOVE и ACTION_UP. Просто нажав кнопку, этот метод вызывается дважды, один раз для нажатия вниз, и один раз, когда ваш палец поднимается. Для того, чтобы рассчитывать только один раз при нажатии кнопки, вы должны написать что-то вроде этого:

v.setOnTouchListener(new OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN){ 
      count += 1; 
     } 
     return true; 
    } 
}); 
+0

yeap, спасибо, чемпион! –

1

Метод:

onTouch(View arg0, MotionEvent me)

вызывается для каждого сенсорного события. За клик вы получите два события MotionEvent.ACTION_DOWN и MotionEvent.ACTION_UP, также если вы переместите палец, вы также можете получить MotionEvent.ACTION_MOVE.

+0

как тогда я могу поймать MotionEvent.ACTION_DOWN только? –

+1

Для каждого события касания вызывается прослушиватель событий прикосновения. Возможно, OnClickListener лучше для того, что вам нужно. Или вы можете сделать оператор if, чтобы проверить, будет ли действие, переданное методом ACTION_DOWN. – elvisrusu