2013-08-20 29 views
2

你好,我基本上是在做一個鋼琴應用程序。經過深思熟慮,我想我已經想出了大多數鋼琴應用程序是如何完成的,並且我被困在這裏,這對於獲得幻燈片,多點觸控,添加按鍵等所有其他功能似乎非常重要。如何提前獲取我的Button的尺寸?

是否可以在手之前知道我的可繪製按鈕的尺寸? 說我有兩種基本繪製鍵按鈕,鋼琴鍵C和d:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="horizontal" 
android:gravity="bottom" > 

<Button 
    android:id="@+id/ckey" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@drawable/keybutton" /> 

<Button 
    android:id="@+id/dkey" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@drawable/keybutton" /> 

對於鋼琴應用程式(白鍵),它們都使用相同的選擇:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item 
    android:drawable="@drawable/key" 
    android:state_pressed="true"/> 

<item 
    android:drawable="@drawable/key_pressed"/> 
</selector> 

但我想知道尺寸或創建按鈕的位置BEFOREHAND,以便我可以在該按鈕的頂部繪製一個區域並將該區域用於onTouchListener。我需要該區域以便我可以使用onTouch。

@Override 
public boolean onTouch(View v, MotionEvent event) { 

int numberOfKeys = 2; 
Region[] keyBoard = new Region[2]; //for 2 White Piano Keys 
Integer pointerIndex = event.getActionIndex(); 
Float x = event.getX(pointerIndex); 
Float y = event.getY(pointerIndex); 

for(int j=0;j<1;j++){ 
    if(this.keyBoard[j].contains(x.intValue(),y.intValue())){ 
      //play corresponding sound 

     } 

}

因此,瞭解我的圖片的尺寸:key.png和key_pressed.png和屏幕寬度和高度,也許其他參數我就不知道了。是否可以事先知道應用程序啓動之前我的按鈕的尺寸或座標或位置?

否則,我如何獲得座標?看起來getTop()和getLeft()不是很好的選擇,因爲它們返回0,因爲圖像需要時間加載,因此代碼無法檢索它。

謝謝你們。順便說一句,我是超級noob。我很抱歉如果我錯過了什麼。

+1

你不需要事先知道如何搜索'GlobalLayoutListener'。對這些問題的一些回答也會導致你除了onCreate()之外的其他生命週期中的地方,你可以做這些事情秒。在onCreate()中,佈局尚未構建,維度將始終爲零。 – Simon

+0

此文檔可能會有所幫助:http://developer.android.com/reference/android/view/ViewTreeObserver.html – kabuko

+0

在'Button'本身上使用'setOnTouchListener(OnTouchListener)'有什麼問題?爲什麼要在上面畫一個區域? – Vikram

回答

0

您可以設置在佈局的按鈕寬度/高度 - 而不是僅僅使用wrap_content

恩:android:layout_width="100dp"

**編輯:別這樣它的過時**你也可以使用一個AbsoluteLayout(而不是你當前的LinearLayout,如果你想準確地設置事物的顯示位置)

+0

'AbsoluteLayout?'是不是因爲永遠不會被棄用? – Vikram

+0

啊,你說得對。編輯答案。 –

+0

我喜歡這個答案,我想我已經完成了應用程序。我在這裏完成; D。 – JehovahIsGod