将按钮的位置设置为屏幕上的随机点? - Android

时间:2013-10-02 11:26:47

标签: android button random position

下面,我有Java和XML代码,基本上我试图点击一个固定的按钮,然后让第二个按钮在屏幕上随机跳转

XML说明: 所以,我有一个带有两个按钮的相对布局...其中一个固定在屏幕的底部...我想随机设置另一个位置。

屏幕打开,单击固定按钮......其他按钮的位置应随机更改。

假设我再次单击固定按钮并且另一个按钮应该随机跳转。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".Rrand" >

    <Button
        android:id="@+id/rbb1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="Button" />

    <Button
        android:id="@+id/bss"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:onClick="aa"
        android:text="Button" />

</RelativeLayout>

JAVA说明 在这里,我有固定按钮的OnClick功能。

►b=应该跳转的按钮

首先,我们获取屏幕尺寸,然后使用LayoutParams,使用随机函数设置按钮位置。

   public void Clicky(View v) {
            b = (Button) findViewById(R.id.rbb1);

    ///Getting the Screen dimensions for API 1+

            LayoutParams params = (LayoutParams) b.getLayoutParams();
            DisplayMetrics metrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(metrics);

    ///Setting the buttons paramaters, again for API 1+

            params.leftMargin = b.getWidth()
                    + new Random().nextInt(metrics.widthPixels - b.getWidth());
            params.topMargin = b.getHeight()
                    + new Random().nextInt(metrics.heightPixels - b.getHeight());
            b.setLayoutParams(params);

        }
X坐标的

随机函数

b.getWidth()+ new Random()。nextInt(metrics.widthPixels - b.getWidth());

最小值= b.getWidth()。

因此,在理论上,按钮永远不会在屏幕上显得有些偏差。

在nextInt的参数中,我使用[Screenwidth - Button Width] ...所以,在理论上,它也不应该从另一边走出屏幕......

问题 它确实如此。大约一半的时间,按钮甚至没有出现在屏幕上......问题必须出在随机函数中(我想是这样)...我只是希望它出现在屏幕上的随机点上。

我认为这个问题很合乎逻辑,因为我拥有我需要的所有功能......

这不起作用 ►在按钮和相对布局上设置边距。 ►从随机函数中删除所有按钮尺寸参数。

即使用:

new Random()。nextInt(metrics.widthPixels)

那么,我错了什么?

2 个答案:

答案 0 :(得分:0)

由于您将b.getWidth()添加到随机值,因此您必须将随机值更改为metrics.widthPixels - 2*b.getWidth(),因为其他偏移量可以是metrics.widthPixels - b.getWidth() + b.getWidth,这可以解释为什么它不在边界之内有时候是右边还是下边。所以看起来应该是这样的:

params.leftMargin = b.getWidth()
                + new Random().nextInt(metrics.widthPixels - 2*b.getWidth());
params.topMargin = b.getHeight()
                + new Random().nextInt(metrics.heightPixels - 3*b.getHeight());
b.setLayoutParams(params);

注意:在此版本中,按钮永远不会触摸屏幕的左边缘或顶边缘。


如果您想要按钮(可能)触摸上边框和/或左边框,请不要在边距上添加宽度/高度:

params.leftMargin = new Random().nextInt(metrics.widthPixels - b.getWidth());
params.topMargin = new Random().nextInt(metrics.heightPixels - 2*b.getHeight());
b.setLayoutParams(params);

编辑:
我更改了上边距的计算,因此按钮与固定按钮的位置不同。

答案 1 :(得分:0)

以下是解决方案:

public class OpenArea extends Activity {

    private RelativeLayout loOPenArea;
    private ImageView imageView;
    private DisplayMetrics metrics;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_open);

        metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        loOPenArea = (RelativeLayout) findViewById(R.id.lo_open_area);
    }

    public void addView(View v) {
        imageView = new ImageView(this);
        imageView.setImageResource(R.mipmap.ic_launcher);
        loOPenArea.addView(imageView);

        int leftMargin = new Random().nextInt(metrics.widthPixels - imageView.getWidth());;
        int topMargin = new Random().nextInt(metrics.heightPixels - 2*imageView.getHeight());;

        setMargins(imageView, leftMargin, topMargin, 0, 0);
    }

    private void setMargins(View view, int left, int top, int right, int bottom) {
        if (view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
            ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
            p.setMargins(left, top, right, bottom);
            view.requestLayout();
        }
    }
}

XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical">

    <RelativeLayout
        android:id="@+id/lo_open_area"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:layout_marginBottom="50dp">

    </RelativeLayout>

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="-50dp"
        android:onClick="addView"
        android:text="+" />
</LinearLayout>