2013-10-02 41 views
3

下面,我已經得到了Java和XML代碼,基本上我想點擊一個固定的按鈕,並在屏幕上的第二個按鈕跳躍在任意點將按鈕的位置設置爲屏幕上的隨機點? - Android電子

XML解釋: 所以,我有一個有兩個按鈕的相對佈局......其中一個是固定在屏幕的底部......我想隨機設置另一個的位置。

屏幕打開,點擊固定按鈕...另一個按鈕的位置應隨機更改。

說我再次點擊固定按鈕,然後agin,另一個按鈕應該隨機跳轉。

<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,利用隨機函數設置按鈕的位置。用於X

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

     } 

隨機函數座標:

b.getWidth()+新的隨機()nextInt(metrics.widthPixels - b.getWidth());。

最小值= b.getWidth()。

因此,在理論上,按鈕應該永遠不會出現在屏幕上。

在爲nextInt的參數,我用[屏幕寬度 - 按鈕寬度] ...所以,從理論上講,它不應該走出去,從對方太屏幕...

問題 但它確實如此。大約一半時間,按鈕甚至不會出現在屏幕上......問題必須出現在隨機函數中(我認爲是這樣)......我只是希望它出現在屏幕上的隨機點上。

我認爲這個問題很簡單的邏輯,因爲我有我需要的所有功能..

這不起作用 ►Setting上的按鈕和相對Layour的餘量。 ►從隨機函數中刪除所有按鈕尺寸參數。

也就是說,使用:

新的隨機()nextInt(metrics.widthPixels)

所以,我怎麼拿錯?

回答

0

既然你添加b.getWidth()的隨機值,您必須將隨機值更改爲metrics.widthPixels - 2*b.getWidth(),因爲otherwize偏移可能是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); 

編輯:
我改變了上邊距的計算,使得按鈕與固定按鈕的位置不一樣。

+0

都能跟得上! ...仍然不起作用(儘管它在屏幕上出現大約80%的時間......) – Zenis

+0

如果您從XML文件中的RelativeLayout中移除填充項,那麼該怎麼辦? – MalaKa

+0

沒關係!我得到它的工作....雜亂地與我在Random()中減去多少......以及我在外面添加了多少......:是的,事實證明,填充導致它在相撞時不可見:-) – Zenis

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> 
相關問題