Image View wird nicht angezeigt

  • Antworten:7
Aufda Hut
  • Forum-Beiträge: 8

31.05.2017, 17:56:43 via Website

Hallo, ich bin neu in der Android Programmierung und übe gerade.
Ich will ein spiel machen, und dafür soll ein punkt an einem zufälligen ort auf dem Bildschirm erscheinen.
Als Raum dafür habe ich ein frame layout eingerichet.
hier ist meine xml:

<?xml version="1.0" encoding="utf-8"?>

android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/background_light">

android:id="@+id/frameLayoutGameArena"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/frameLayoutColorAndPoits"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true">

</FrameLayout>

und hier meine dazugehörige Funktion:

public void showDot(){
    int gameArenaWidth = gameArena.getWidth();
    Log.i("GameActivity","gameArenaWidth = "+ gameArenaWidth);
    int gameArenaHeight = gameArena.getHeight();
    Log.i("GameActivity","gameArenaHeight = "+ gameArenaHeight);


    int dotSize =(int)Math.round(screenScale*50);

    int xAxis = (int)(Math.random()*gameArenaWidth-dotSize);
    int yAxis =  (int)(Math.random()*gameArenaHeight-dotSize);

    ImageView imageViewBlackDot = new ImageView(this);
    imageViewBlackDot.setImageResource(R.drawable.black_dot_50x50);

    FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(dotSize,dotSize);

    params.leftMargin = xAxis;
    params.topMargin = yAxis;

    params.gravity = Gravity.TOP + Gravity.LEFT;

    gameArena.addView(imageViewBlackDot, params);
}

Doch wenn ich die App teste taucht kein Punkt auf und die Logfiles geben :

GameActivity: gameArenaWidth = 0
GameActivity: gameArenaHeight = 0

Mal ganz blöd gefragt:
Was mach ich falsch ?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

31.05.2017, 23:10:54 via Website

Naja dein FrameLayout scheint keine Breite/Höhe zu haben.

Zudem würde ich dir empfehlen, das ganze auf einem Canvas zu Zeichnen das geht um einiges einfacher und ist für ein Spiel komfortabler.

LG Pascal //It's not a bug, it's a feature. :) ;)

swa00

Antworten
Aufda Hut
  • Forum-Beiträge: 8

01.06.2017, 08:40:49 via Website

Kennst du irgendwelche guten Tutorials zu Canvas?

Antworten
Aufda Hut
  • Forum-Beiträge: 8

02.06.2017, 09:17:37 via Website

Das mit den Canvas ist mir für den Anfang noch zu kompliziert. Ich will doch weiter versuchen es mit der Methode , die ich oben gepostet habe hinzubekommen.
ich habe jetzt ech vieles versucht. Ich habe dem Framelayout auch in meiner methode eine min Breite und höhe übergeben, er gibt mir in den Logfiles aber trotzdem 0 aus.

screenScale = getResources().getDisplayMetrics().density;

    gameArenaFrameLayout = (FrameLayout)findViewById(R.id.frameLayoutGameArena);

    gameArenaFrameLayout.setMinimumWidth(400);
    gameArenaFrameLayout.setMinimumHeight(420);

    gameArena = (ViewGroup)findViewById(R.id.frameLayoutGameArena);

Bitte helft mir (angel) :D

Antworten
swa00
  • Forum-Beiträge: 3.704

02.06.2017, 09:32:47 via Website

Hallo Hut,

auch wenn Dir der Vorschlag zu "viel" ist , du verballerst Resourcen ohne Ende.
Also komm bitte nachher nicht, dass es langsam ist oder auf dem "Anderen" Device nicht läuft :-)

Ich kann auch nicht mehr nachvollziehen , was du eigentlich machst.

ich sehe nirgendwo , dass du deinen "Punkt" in gameArenaFrameLayout setzt, geschweige denn
worauf sich dein MATCH_PARENT bezieht , noch worin er genestet ist - also was überhaupt der ParentContainer
ist.

Mit so Teilinformationen können wir dir nicht helfen , denn das was du uns hier postest , ist
nur ein Teil von dem , was die Ursache sein könnte.

Und dann bitte keine Instanzen hier posten , die NICHTS mit deinem Problem zu tun haben.

z.b
- screenScale = getResources().getDisplayMetrics().density;
- gameArena = (ViewGroup)findViewById(R.id.frameLayoutGameArena);

Das verwirrt uns alle und raubt die Zeit - Wir suchen nämlich wie bekloppt,
wo du das wo und wie anwendest.

P.S. Die Technik , die Du für dein Vorhaben benutzt , ist nicht dafür gedacht .
Canvas ist explizit dafür gemacht worden . Du kannst wunderbar dir dazu eine eigene View-Klasse
ableiten (Vererben)
Auch wenn du mit deinem Kopf durch die wand willst , wir schütteln ihn nur :-)

— geändert am 02.06.2017, 09:43:19

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Aufda Hut
  • Forum-Beiträge: 8

02.06.2017, 09:58:37 via Website

Ok gut, überzeugt :)
Gibt es denn eine Möglichkeit, dass ich das/den/die (Keine
Ahnung welcher Artikel richtig ist :D) Canvas auf mein framelayout beschränke ?
die lösungen die ich bis jetzt gefunden habe beziehen sich immer auf den gesamten Bildschirm.

Vielen Dank für deine schnellen Antworten und deine Geduld :)

Antworten
swa00
  • Forum-Beiträge: 3.704

02.06.2017, 10:07:16 via Website

Mach Dir doch mal ein neues Projekt, indem du einen ganz einfachen View in deinem Layout deklarierst
und darin malst du dir erst mal ein knall rotes Rechteck mit Canvas .

Ein einfaches Bespiel ist das von oben.

Damit steht dein ganzes Gerüst schon und dann kannst du anfangen,
deinen Punkt in OnDraw() an deine Koordinaten zu rendern.

P.S ich habe es mir nochmal angeschaut , das kannst du fast schon 1:1 übernehmen

P.S1 Es spricht nichts dagegen , dann nachher das View in der Grösse anzupassen .

MyView.getLayoutParams().width = (int) (xxx);
MyView.getLayoutParams().height = (int) (xxx);
MyView.setX((int) (xxxxx);
MyView.setY((int) (xxxxx);

— geändert am 02.06.2017, 10:27:24

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten