Hallo Leute,
ich bin gerade mit Hilfe eines Buches zur Android-Programmierung in Java eingestiegen und habe jetzt bei einer Android-App die ich am programmieren bin ein kleines Problem. Kurz zur Erklärung: es soll eine Art Snake-Spiel werden. Dazu habe ich eine GameActivity erstellt die dafür sorgt, dass alles was auf den Bildschirm gehört auch da landet. Im Layout der Activity ist ein FrameLayout eingebettet das als Spielbereich dient, dort sollen also alle Spielelemente reinkommen. Wenn jetzt ein neues Spiel gestartet wird, wird also die GameActivity gestartet und es soll direkt der erste Körperbaustein der Schlange in der Mitte des Spielbereichs erscheinen. Dazu soll die GameActivity eine ImageView in der Mitte des Bildschirms erstellen und mit dem Bild des Bausteins füllen. Bevor ich zum eigentlichen Problem komme, zeige ich euch am besten meinen Code
Der Code der GameActivity:
public class GameActivity extends Activity {
private Handler handler = new Handler();
private ViewGroup spielbereich;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.game); // game ist das Layout, das das FrameLayout,
// welches den Spielbereich darstellt, enthält
spielbereich = (ViewGroup) findViewById(R.id.spielbereich); // hier weise ich der
// der ViewGroup
// den spielbereich aus
// dem FrameLayout zu
SpielStarten(); // spiel wird gestartet, erster Baustein wird
// erstellt
}
public void SpielStarten() {
int x = spielbereich.getWidth() / 2; // Mittlere x-Koordinate das Spielbereichs
// ausfindig machen
int y = spielbereich.getHeight() / 2; // Mittlere y-Koordinate das Spielbereichs
// ausfindig machen
int hoehe = 10; // Höhe des Bildes das als Körperbaustein
// geladen werden soll
int breite = 10; // Breite des Bildes das als Körperbaustein
// geladen werden soll
float massstab = getResources().getDisplayMetrics().density; // Anpassen der
int maße_hoehe = (int) Math.round(massstab * hoehe); // Maßen an
int maße_breite = (int) Math.round(massstab * breite); // Pixeldichte
ImageView vKoerperteil = new ImageView(this); // erstellen der ImageView
vKoerperteil.setImageResource(R.drawable.koerper); // Bild an View zuweisen
FrameLayout.LayoutParams params = new // Parameter erstellen und zuweisen
FrameLayout.LayoutParams(maße_hoehe, maße_breite);
params.leftMargin = x; // Mitte des Bildschirm von zuvor
params.topMargin = y; // als Position zuweisen
params.gravity = Gravity.TOP + Gravity.LEFT;
spielbereich.addView(vKoerperteil, params); // View zu Spielbereich hinzufügen
}
}
Alles anzeigen
Das Problem das ich habe ist, dass die View nicht wie gewünscht in der Mitte des Spielbereichs angezeigt wird, sondern bei den Koordinaten (0,0), sprich der Körperbaustein lande oben links in der Ecke.
Das liegt daran, dass in Zeile 21 und 24 die .getWidth() bzw. .getHeight() Methoden 0 zurückliefern (habe ich im Debugging festgestellt). Warum ist das so? Ich habe schon gelesen, dass das Layout evtl. noch nicht vollständig auf den Bildschirm gezeichnet wurde und das so lange die Methoden 0 zurückliefern. Wird das auch hier der Grund sein? Und wie kann ich das beheben, sodass meine ImageViews endlich in der Mitte des Spielbereichs auftauchen?
Ich hoffe ihr könnt einem Anfänger helfen!
MfG Minilulatsch