2016-10-02 4 views
0

Я разрабатываю приложение для фортепиано, это не самое лучшее, но это начало.Правильно ли иметь много onTouchListener?

Я использую ниже код для воспроизведения звука и изменения изображения кнопки с событием касания.

 C4.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      switch(event.getAction()) { 

       case MotionEvent.ACTION_DOWN: 
        // PRESSED 
        if (Sustain == "false") { 

         streamI25 = sp.play(SC4, Volume, Volume, 0, 0, 1); 
         C4.setBackgroundResource(R.drawable.whitekey1cilicked); 
        } 

        else { 

         sp.play(SC4, Volume, Volume, 0, 0, 1); 
         C4.setBackgroundResource(R.drawable.whitekey1cilicked); 
        } 

        // just in case somthings happend 
        final Handler handler2 = new Handler(); 
        handler2.postDelayed(new Runnable() { 
         @Override 
         public void run() { 
          //Do something after 100ms 
          C4.setBackgroundResource(R.drawable.whitekey1); 
         } 
        }, keyUpTime); 


        return true; // if you want to handle the touch event 
       case MotionEvent.ACTION_UP: 
        // RELEASED 


        C4.setBackgroundResource(R.drawable.whitekey1); 

        final Handler handler = new Handler(); 
        handler.postDelayed(new Runnable() { 
         @Override 
         public void run() { 
          //Do something after 100ms 
          sp.pause(streamI25); 

         } 
        }, releaseTime); 


        return true; // if you want to handle the touch event 
      } 
      return false; 
     } 
    }); 

Правильно ли это? Разве это не глупо писать весь этот код для каждого ключа на фортепиано?

Я могу использовать только несколько строк кода для всех своих кнопок в методе OnClick, но мне нужны события onTouch. Правильно ли писать 72 onTouchListener?

+0

Я не один, чтобы сказать очень много мудрых. Однако, если вы хотите сделать это таким образом, я лично создам класс для ключа фортепиано и создаю ваши ключи как объекты и сохраняю их в массиве. таким образом вы могли бы дать им все, что им нужно, и сэкономить много места. Это только если вы решите сделать это именно так. – Pixelknight1398

ответ

1

Лучше реализовать OnTouchListener в своей деятельности или другом классе обработки, который вы продляете с помощью implements OnTouchListener. В вашем представлении может быть тег, который вы затем анализируете в своих методах (представление передается как параметр вызова функции).

Вы могли бы написать

class MyActivity extends Activity implements View.OnTouchListener 

, а затем

C4.setTag("C4"); // or by XML 
C4.setOnTouchListener(this); 

и onTouch изменить view вместо C4 и выберите звук, основанный на бирке.

1

Повторение одного и того же кода много раз - это плохая идея. Один из вариантов здесь - создать именованный класс, который добавит PianoKeyTouchListener, который содержит этот код обработки событий.

Смежные вопросы