2016-10-02 32 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。