2015-03-03 60 views
0

我在用於線性佈局的觸摸偵聽器中的一篇文章中發現了此代碼。 在線性佈局中有一些兒童佈局,每個人都會發出相同的聲音,但有音調。現在我怎麼能用每個孩子發揮不同的聲音。 另一個詞我怎樣才能訪問每個孩子?在佈局中使用每個孩子

public class MainActivity extends Activity { 
LinearLayout pianoKeysContainer; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    pianoKeysContainer = (LinearLayout) findViewById(R.id.key_container); 
    pianoKeysContainer.setOnTouchListener(onYourViewTouchListener); 

} 


//Here we load the view positions after render it and fill the array with the positions 
private List<Integer> positionsLeft_whiteKeys = new ArrayList<Integer>(); 
private List<Integer> positionsRight_whiteKeys = new ArrayList<Integer>(); 

public void onWindowFocusChanged(boolean hasFocus) 
{ 
    super.onWindowFocusChanged(hasFocus); 

    for (int i = 0; i < pianoKeysContainer.getChildCount(); i++) 
    { 
     //positionsLeft_whiteKeys holds the start x of each view. 
     positionsLeft_whiteKeys.add(pianoKeysContainer.getChildAt(i).getLeft()); 
     //positionsRight_whiteKeys holds the end x of each view. 
     positionsRight_whiteKeys.add(pianoKeysContainer.getChildAt(i).getRight()); 
    } 
} 

public View.OnTouchListener onYourViewTouchListener = new View.OnTouchListener() 
{ 
    float positionX; 
    FrameLayout pianoKey; 
    FrameLayout lastPlayedKey; 
    ArrayList<FrameLayout> pressedKeys = new ArrayList<FrameLayout>(); 

    @Override 
    public boolean onTouch(View view, MotionEvent motionEvent) 
    { 

     positionX = motionEvent.getX(); 

     float pitch; 

     //Looping on the child of the layout which contains the piano keys 
     for (int x = 0; x < ((LinearLayout) view).getChildCount(); x++) 
     { 
      // Calculating the pitch to get good chords 
      pitch = (float) Math.pow(Math.pow(2.0, 1/12.0), (float) x); 

      pianoKey = (FrameLayout) ((LinearLayout) view).getChildAt(x); 

      if (positionsLeft_whiteKeys.size() >= 0 && positionsRight_whiteKeys.size() >= 0) 
      { 
       if (positionX > positionsLeft_whiteKeys.get(x) && positionX < positionsRight_whiteKeys.get(x)) 
       { 
        pianoKey = (FrameLayout) ((LinearLayout) view).getChildAt(x); 

        if (pianoKey != null) 
        { 
         pianoKey.setBackgroundResource(R.drawable.dinger14); 
         pressedKeys.add(pianoKey); 
        } 
        if (lastPlayedKey != pianoKey) 
         playKey(pitch); 

        lastPlayedKey = pianoKey; 
        break; 
       } 

       if (lastPlayedKey != null) 
       { 
        pianoKey.setBackgroundResource(R.drawable.dinger14); 
        lastPlayedKey.setBackgroundResource(R.drawable.dinger14); 

       } 
      } 
     } 

     if (motionEvent.getAction() == MotionEvent.ACTION_UP) 
     { 
      lastPlayedKey = null; 

      for (FrameLayout pressedKey : pressedKeys) 
      { 
       pressedKey.setBackgroundResource(R.drawable.dinger14); 
      } 


     } 

     return false; 
    } 
}; 


//This is sound play method 
SoundPool sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 1); 
public void playKey(final float pitch) 
{ 

    //here you should store your piano sound at res/raw then load it 
    sp.load(this, R.raw.chitare3, 1); 

    sp.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() 
    { 
     @Override 
     public void onLoadComplete(SoundPool soundPool, int i, int i2) 
     { 
      soundPool.play(i, 0.99f, 0.99f, 1, 0, pitch); 
     } 
    }); 
} 

}

回答

0

如果您有沒有必要對觸摸事件父然後在每個孩子直接應用此相同的事件......

pianoKeysContainer1 = (LinearLayout) findViewById(R.id.key_child1); 
pianoKeysContainer2 = (LinearLayout) findViewById(R.id.key_child2); 

pianoKeysContainer1.setOnTouchListener(onYourViewTouchListener); 
pianoKeysContainer2.setOnTouchListener(onYourViewTouchListener); 

你可以在每一個孩子的申請onYourViewTouchListener onTouchListener如上所示。 然後在View.onTouchListener檢查通過檢查視圖ID調用哪個子監聽器。

​​