How do I display a button in a random screen position in android? For example I have a button that is named GO. When I click GO, it will bring me to the second screen. That second screen will display another button (not the START button) in random screen position. How can I do that?
Asked
Active
Viewed 1.1k times
7
-
2get screen size, then generate random number between 0 to screen dimension then set as params to your button – Shayan Pourvatan Mar 03 '14 at 10:53
-
@Shayanpourvatan How can I generate a random and set it as params? I am kind a new to android – murrmurr Mar 03 '14 at 10:55
-
see MDMalik answer, that is what i want to say – Shayan Pourvatan Mar 03 '14 at 10:56
-
1Thank you Shayan pourvatan and MDMalik :) – murrmurr Mar 03 '14 at 11:02
-
@murrmurr Please do check the Edit.. – MDMalik Mar 03 '14 at 11:09
4 Answers
7
For the second screen use absolute layout
, but the button on X=0, Y=0
Once your second screen gets activated. onCreate
Method
Button button = (Button)findViewById(R.id.my_button);
AbsoluteLayout.LayoutParams absParams =
(AbsoluteLayout.LayoutParams)button.getLayoutParams();
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int width = displaymetrics.widthPixels;
int height = displaymetrics.heightPixels;
Random r = new Random();
absParams.x = r.nextInt(width ) ;
absParams.y = r.nextInt(height );
button.setLayoutParams(absParams);
EDIT User wanted to know how to write AbsoluteLayout
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<Button
android:id="@+id/my_button"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_x="0dp"
android:layout_y="0dp"
android:text="Yes" />
</AbsoluteLayout>

MDMalik
- 3,951
- 2
- 25
- 39
-
how will my xml code look like? Where will I set the button x=0, y=0? – murrmurr Mar 03 '14 at 11:09
-
1@murrmurr if this solved your problem you should tick this as answer to help other people – Shayan Pourvatan Mar 03 '14 at 11:25
-
-
@murrmurr for setting layout params see [this](http://stackoverflow.com/questions/3144940/set-imageview-width-and-height-programmatically) – Shayan Pourvatan Mar 03 '14 at 11:44
-
I cant run the program yet @Shayanpourvatan it says "Force Close" I'm trying to figure out what's wrong. – murrmurr Mar 03 '14 at 13:16
-
I figured it out already @Shayanpourvatan. :) I forgot to code at the manifest part that's why its forced to close. But its okay now. Thank you :) – murrmurr Mar 03 '14 at 13:25
2
displaymatrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymatrics);
textview.setOnTouchListener(new View.OnTouchListener(){
Random R = new Random();
float dx = R.nextFloat() * displaymatrics.widthPixels;
float dy = R.nextFloat() * displaymatrics.heightPixels;
public boolean onTouch(View view, MotionEvent event){
if(event.getAction() == MotionEvent.ACTION_DOWN){
view.animate()
.x(dx)
.y(dy)
.setDuration(0)
.start();
}
return true;
}
});
AbsoluteLayout is now deprecated, You can move a View(when it's touched) in random screen position this way easily.

Saba-21
- 132
- 1
- 9
0
If you target Icecream Sandwich
and above, you can set the position of the button very easily
You can use the below functions to move to a random position. You can calculate x
randomly based on the screen width.
v.setX(x);
v.setTranslationX(translationX);
For the older phones, you can make a random animation with 0 second long.

tasomaniac
- 10,234
- 6
- 52
- 84
0
This is the (though Kotlin, but easy to convert to Java) code I used to animate a movement of a view on it's Y axis:
private fun moveViewRandomlyOnVerticalAxis(view: View, topMarginPixels: Int, bottomMarginPixels: Int)
{
/* get current activity screen size in pixel **/
val metrics = DisplayMetrics()
windowManager.defaultDisplay.getMetrics(metrics)
val windowHeight = metrics.heightPixels
val viewTopPixels = view.top
val verticalPixelsToMove = Random.nextInt(-viewTopPixels + topMarginPixels, windowHeight
- viewTopPixels + 1).toFloat()
ObjectAnimator.ofFloat(view, "translationY", verticalPixelsToMove).apply {
duration = 500
start()
}
}

deepGrave
- 320
- 3
- 11