0

我正在制作一个简单的应用程序来帮助我学习一些编码基础知识。用户单击 anImageButton会发生两件事:

  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 大小自动(即适应随机图像的大小,它们略有不同,而不拉伸它们)
4

2 回答 2

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
于 2012-06-15T12:30:53.463 回答
1

好的,对于主要问题,我没有直接的答案——我不确定如果您只是删除背景资源,它为什么会起作用,但也许如果您在布局后更改背景资源?值得一试,但这并不能真正解释为什么会发生这种情况。

现在“积分”问题,我可以回答:

1:只需调用imageButton.performClick()您的onCreate()(当然,在分配您OnClickListener的之后)。

2:将ImageButton's设置LayoutParamswrap_content, wrap_content,然后调用imageButton.requestLayout();. 然后应调整其大小以适合内容。

于 2012-06-13T14:26:07.080 回答