Reputation: 437
I want to make an app that when you click a button it will go to a random place on the screen. I want it to be an ImageButton the when onClick well go to a random place on the screen. I've attempted before. But to no success. Here is some of the code I've already attempted with. --->
package com.example.e99900004533.candycollector;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.graphics.Point;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Display;
import android.view.ViewGroup.MarginLayoutParams;
import android.animation.ObjectAnimator;
import android.widget.RelativeLayout;
import android.widget.EditText;
import android.widget.ImageButton;
import java.util.Random;
public class MainActivity extends ActionBarActivity {
public EditText collectedTextEdit;
public ImageButton candyEdit;
public int collected = 0;
public int screenWidth = 300;
public int screenHeight = 300;
Random random = new Random();
public boolean running = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
collectedTextEdit = (EditText) findViewById(R.id.collectedText);
candyEdit = (ImageButton) findViewById(R.id.candy);
collectedTextEdit.setText("Collected: " + collected);
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
screenWidth = size.x;
screenHeight = size.y;
addListenerOnButton();
}
public void addListenerOnButton() {
candyEdit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
collected += 1;
collectedTextEdit.setText("Collected: " + collected);
int candyX = random.nextInt(screenWidth - 50);
int candyY = random.nextInt(screenHeight - 50);
System.out.println(candyX + " : " + candyY);
MarginLayoutParams marginParams = new MarginLayoutParams(candyEdit.getLayoutParams());
marginParams.setMargins(candyX, candyY, 0, 0);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(marginParams);
candyEdit.setLayoutParams(layoutParams);
//if (candyX > screenWidth) {
//screenWidth -= 50;
//layoutParams.setMargins(candyX, candyY, candyX, LayoutParams.WRAP_CONTENT);
//candyEdit.setLayoutParams(layoutParams);
//}
//if (candyY > screenHeight) {
//screenHeight -= 50;
//layoutParams.setMargins(candyX, candyY, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
//candyEdit.setLayoutParams(layoutParams);
//}
//while (running == true) {
//candyY -= 1;
//layoutParams.setMargins(candyX, candyY, candyX, candyY);
//candyEdit.setLayoutParams(layoutParams);
//}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Upvotes: 0
Views: 1916
Reputation: 1605
I hope you are using Android Studio as it gives you a beautiful way of accessing all the benefits of the Android API.
Anyway, before I post the code, you set the onClickListener within your java code and while that is fine, it can clutter up your code. A much more aesthetically pleasing solution is to use XML and a button's android:onClick. You will see this in the code.
Java:
package testinc.com.randombutton;
import android.graphics.Point;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.*;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.Random;
public class MainActivity extends ActionBarActivity {
// Encapsulating the data just to be safe...
private int collected = 0;
private int screenWidth = 300;
private int screenHeight = 300;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
screenWidth = size.x;
screenHeight = size.y;
TextView collectedView = (TextView) findViewById(R.id.collectedTV);
collectedView.setText("Collected: " + collected);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public void toRandomPosition(View view) {
// Based on our collection candy collection:
collected += 1;
TextView collectedView = (TextView) findViewById(R.id.collectedTV);
collectedView.setText("Collected: " + collected);
// Based on position of our candy:
Random random = new Random();
// Understand nextInt(N) will go from 0 -> N-1, also are you trying to control where it can go?
float candyX = (float) random.nextInt(screenWidth - 50);
float candyY = (float) random.nextInt(screenHeight - 50);
// I didn't write it, but you need to check these float values if they exceed the screen width and the screen length. */
// Sout to check coordinates
System.out.println(candyX + " : " + candyY);
// To change margins:
ImageButton imgButton = (ImageButton) findViewById(R.id.changePlace);
imgButton.setX(candyX);
imgButton.setY(candyY);
}
}
Android: Note: I used a linear layout because I dislike the relative. You can change it without repercussions I suppose.
<LinearLayout 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:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView android:id="@+id/collectedTV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageButton android:id="@+id/changePlace"
android:onClick="toRandomPosition"
android:contentDescription="It's a button, ha za"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
Key parts:
android:onClick="toRandomPosition"
hooks up with the method, public void toRandomPosition(View view)
setX
and setY
require floating point numbers to set the position. Unfortunately, it seems that the random class does not have nextFloat(float n) in its class. I recommend just casting the int as a float for now.
Seeing that I am doing this now, here is a possible (I have not checked it) solution to the coordinates going beyond the bounds of the screen:
while ( candyX >= screenWidth || candyY >= screenHeight) {
candyX = (float) random.nextInt(screenWidth - 50);
candyY = (float) random.nextInt(screenHeight - 50);
}
I checked if the position was equal because a button at the corner of the screen is a pain to find and may be skewed off the display.
Upvotes: 1