2012-06-13 80 views
0

我正在製作一個簡單的應用程序來幫助我學習一些編碼基礎知識。用戶點擊一個ImageButton發生兩件事情:在onClick中同時更改ImageButton的位置和內容

  1. Button圖像變爲隨機圖像。
  2. Button移動到屏幕上的隨機位置。

我已經想出瞭如何獨立完成這兩件事情,但是當我將兩者放在一起時onClick但是,一次只能工作一個。

onClick代碼:

ImageButton button = (ImageButton) findViewById(R.id.my_button); 
    button.setOnClickListener(new OnClickListener() { 
     public void onClick (View v) { 

      // change button image 
      int imgNo = (int) (Math.random() * 9) + 1; // 9 images in the folder, start at index 1 
      int imgID = getResources().getIdentifier("chef" + imgNo, "drawable", getPackageName()); 
      v.setBackgroundResource(imgID); 

      // move button to a random location 
      LinearLayout button_container = (LinearLayout) findViewById(R.id.my_window); 
      int x = (int) (Math.random() * (button_container.getWidth() - v.getWidth())); // might need to work out how to find if phone is landscape or portrait; 
      int y = (int) (Math.random() * (button_container.getHeight() - v.getHeight())); 
      v.layout(x, y, x + v.getWidth(), y + v.getHeight()); 

      Toast.makeText(WhackachefActivity.this, "X: " + x + " Y: " + y + " Width: " + v.getWidth() + " Height: " + v.getHeight() + " Image: " + imgNo, Toast.LENGTH_LONG).show();   
     } 
    }); 

Toast只是在那裏證明所有的變量都正常工作。如果位置更改或圖像更改代碼被註釋掉,則另一個可以正常工作。如果圖像被隨機設置爲當前圖像(即圖像沒有變化),則隨機位置起作用,否則它將被設置爲XML中的默認位置。

作爲參考,主要XML是:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" 
android:id="@+id/my_window" > 

<ImageButton 
    android:id="@+id/my_button" 
    android:layout_width="100dp" 
    android:layout_height="100dp" 
    android:layout_gravity="center" 
    android:contentDescription="@string/description" 
    /> 

作爲後續,兩個相關的問題:

  1. 我怎樣才能讓的onClick代碼運行一次當應用是第一次加載?
  2. 我怎樣才能讓ImageButton的大小本身自動(即以適應隨機圖像,這是稍有不同的大小,而不會拉伸它們)

回答

1

好吧,對於主要的問題,我沒有一個非正式的答案 - 我不確定爲什麼它會工作,如果你只是刪除背景資源,但也許如果你更改佈局後的背景資源?值得一試,但這並不能解釋爲什麼會發生。

現在的 「加分」 的問題,我可以回答:

1:只需在撥打imageButton.performClick()onCreate()(後分配你的OnClickListener,當然)。

2:設置ImageButtonLayoutParamswrap_contentwrap_content,然後調用imageButton.requestLayout();。然後應該調整大小以適應內容。

+0

感謝kcoppock - performClick()和requestLayout()解決了我的次要問題。我查了一下,不能同時做這兩件事的主要問題仍然存在。就順序而言,我想先改變圖像的位置,這樣我就可以用它的新尺寸來定位它,但我已經對它進行了兩種測試,順序似乎並不關係我的主要問題。 – Alex

1

我找到了一個解決方案 - 使用LinearLayout的填充來移動按鈕而不是使用.layout。主要活動代碼現在看起來像這樣:

final ImageButton button = (ImageButton) findViewById(R.id.my_button); 
final LinearLayout button_container = (LinearLayout) findViewById(R.id.my_window); 

button.setOnClickListener(new OnClickListener() { 
    public void onClick (View v) { 

     // change button image 
     int imgNo = (int) (Math.random() * 9) + 1; // 9 images in the folder, start at index 1 
     int imgID = getResources().getIdentifier("chef" + imgNo, "drawable", getPackageName()); 
     button.setBackgroundResource(imgID); 
     button.requestLayout(); // size to fit content 

     // move button to a random location 
     int x = (int) (Math.random() * (button_container.getWidth() - button.getWidth())); 
     int y = (int) (Math.random() * (button_container.getHeight() - button.getHeight())); 
     button_container.setPadding(x, y, 0, 0); 
    } 
}); 
button.performClick(); // run once at the start to set image and position randomly