4

以下に、Java コードと XML コードの両方を示します。基本的に、固定ボタンをクリックして、2 番目のボタンをランダムなポイントで画面上でジャンプさせようとしています。

XML の説明: 2 つのボタンを含む相対的なレイアウトがあります... そのうちの 1 つは画面の下部に固定されています... もう 1 つのボタンの位置をランダムに設定したいと考えています。

画面が開き、固定ボタンをクリックすると、もう一方のボタンの位置がランダムに変化するはずです。

固定ボタンをもう一度クリックすると、他のボタンがランダムに飛び回るはずです。

<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)

それで、私は何を間違えましたか?

4

2 に答える 2

2

ランダム値に追加する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);

編集:
ボタンが固定ボタンと同じ位置にならないように、上部余白の計算を変更しました。

于 2013-10-02T11:38:40.333 に答える
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>
于 2016-02-15T10:18:14.993 に答える