Schreibe Android APP



  • Hallo,

    ich möchte gerade Vier gewinnt programmieren.
    Für das Spielfeld benutze ich ein TableLayout. Darunter liegt ein Bild das genauso groß ist wie das Tablelayout. Um 2 Views übereinander zu handeln benutz ich ein FrameLayout. Das TableLayout ist transparant. Erst wenn ein STein geworfen wird wird die Zelle per Bild zum Stein. So ganz glücklich bin ich damit noch nicht.

    Kennt denn jemand ein Android Forum genauso wie das hier. Ich hab noch keins gefunden.. Ich suche weltweit.





  • ich programmier hier 4 gewinnt. Die Bildschirmbreite wird komplett von 7 Bildern besetzt. Wie mache ich das jetzt. Es kann ja sein, dass ein anderes Smartphone breiter oder kürzer ist als meins. Leider haben die Bilder die ich verwende eine feste Breite nämlich 50 Pixel. Wie sollte ich das flexibel gestalten. Die bilder die ich verwende haben eine feste größe und passen genau ins tablelayout.



  • Peter_Mueller schrieb:

    ich programmier hier 4 gewinnt. Die Bildschirmbreite wird komplett von 7 Bildern besetzt. Wie mache ich das jetzt. Es kann ja sein, dass ein anderes Smartphone breiter oder kürzer ist als meins. Leider haben die Bilder die ich verwende eine feste Breite nämlich 50 Pixel. Wie sollte ich das flexibel gestalten. Die bilder die ich verwende haben eine feste größe und passen genau ins tablelayout.

    die android-api hat möglichkeiten bilder zu stauchen/strecken, sowie auch die bildschirmgrösse zu ermitteln.

    Bitmap.createScaledBitmap(...);
    http://stackoverflow.com/questions/4837715/how-to-resize-a-bitmap-in-android



  • ich benutz jetzt den code hier um die Bildschirmbreite zu bekommen.

    Display display = getWindowManager().getDefaultDisplay();
            Point size = new Point();
            display.getSize(size);
            int width = size.x;
            int height = size.y;
    

    Da gibt er mir 720 aus für die Breite. Eigentlich müsste aber die Hälfte nämlich 360 Pixel rauskommen da ich nur 8 Bilder mit jeweils 45 Pixel nebeneinander legen kann....



  • probier mal das:

    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    

    ... und dann dm.widthPixels und dm.heightPixels benutzen.



  • Es werden wieder 720 Pixel ausgegeben. Das ist wohl auch richtig. Wenn ich in die Eigenschaften des Bilds klicke steht da 45x50 und ich bekomme gerade mal 8 bilder in der Breite hin. Es kann also nur die Maße des Bilds falsch sein...



  • Peter_Mueller schrieb:

    Es werden wieder 720 Pixel ausgegeben. Das ist wohl auch richtig. Wenn ich in die Eigenschaften des Bilds klicke steht da 45x50 und ich bekomme gerade mal 8 bilder in der Breite hin. Es kann also nur die Maße des Bilds falsch sein...

    android nutzt an einigen sellen dp (density independent pixels). da gibt es auch umrechnungsfunktionen. google mal danach.



  • Ich benutze das onTouchEvent(MotionEvent e) .
    Ich hab gemerkt das wird obwohl man nur einmal den Bildschirm berührt, mindestens 2 mal ausgelöst. Jetzt überleg ich mir ob ich das nicht irgendwie blockiere für einige hundert millisekunden sodass es nur 1mal ausgeführt wird. Würdet ihr das auch so machen. Vielleicht einen Timer verwenden ? Ist das onTouch Event überhaupt das richtige Ereignis oder doch eher onClick ?



  • du musst einfach das Action.Down Event abfragen



  • Wenn auf die View geklickt wird, dann soll sich die Background Farbe ändern. Leider macht sie das erst wenn der komplette Handler fertig ist, also das pausieren in der onClickListener Methode hilft mir gar nix. Wie kann man das machen ?????

    // Create an anonymous implementation of OnClickListener
        private View.OnClickListener playerListener = new View.OnClickListener() {
            public void onClick(View v) {
    
                ImageView vi = (ImageView) v;
                //hier setze ich die neue Farbe der View
                vi.setBackgroundColor(Color.argb(255,163,237,250));
                player1SelectedNr = vi.getId();
                //hier pausiere ich für 1 Sekunde
                SystemClock.sleep(1000);
    
                table.setVisibility(View.INVISIBLE);
            }
        };
    


  • keiner da der nee Ahnung davon hat ?? Ich bekomms net hin 😞
    Ich weiss noch von C Sharp da war das schon so blöd..
    Der OnClick Handler scheint in einem anderen Thread zu laufen und kann wohl deswegen nicht gleich auf die UI zugreifen..





  • nee geht auch nicht. Ich dreh bald durch. Ich hocke das ganze Wochenende schon rum und alle meine Ansätze funktionieren nicht. Erst wenn ich das Tablelayout wieder aufmache , dann wurde die Gui refreshed. Ihr seht was ich vorhabe oder. Jemand klickt eine Zelle im TableLayout. Die Zelle bleibt 3 Sekunden blau und das Tablelayout schließt sich nach 3 sekunden. Wie läuft das eigentlich wird da für jedes abonnierte Event ein eigener Thread aufgemacht ??? Ehrlich gesagt glaub ich fast dass onClick Handler im GUI Thread ausgeführt wird.

    private View.OnClickListener playerListener = new View.OnClickListener() {
            public void onClick(View v) {
    
                 vi = (ImageView) v;
    
                vi.setBackgroundColor(Color.argb(255, 163, 237, 250));
                vi.invalidate(); // hilft nicht 
    
                player1SelectedNr = vi.getId();
                SystemClock.sleep(3000); // hier die Verzögerung
    
                table.setVisibility(View.INVISIBLE); // hier schließ ich das Tablelayout
            }
        };
    


  • Vermutlich muss onClick() ausgeführt werden, bevor gezeichnet wird. Versuch mal einen asynchronen Timer zu setzen.

    private View.OnClickListener playerListener = new View.OnClickListener() {
            public void onClick(View v) {
    
                 vi = (ImageView) v;
    
                vi.setBackgroundColor(Color.argb(255, 163, 237, 250));
    
                // Hier Timer setzen, der in 3 Sek. ausgeführt wird und die TableView unsichtbar macht
            }
        };
    

    https://developer.android.com/reference/java/util/Timer.html



  • wie sieht der Timer code aus ?? Kannst du den mal posten ?

    Vermutlich muss onClick() ausgeführt werden, bevor gezeichnet wird.

    Naja onClick wird ja zuerst ausgeführt. Versteh ich jetzt nicht ganz..

    Ich bezweifel ob der Timer was hilft. Da kann ich auch eine 3 sekunden for loop machen.



  • Versuch das schon selber...

    Weißt du überhaupt, was ein Timer ist? Der wird asynchron in einem Scheduler eingereiht und zu gegebener Zeit asynchron ausgeführt (kannst du selber einstellen, wann er ausgeführt wird). D. h., deine onClick()-Funktion ist bis dahin komplett ausgeführt und die Hintergrundfarbe gesetzt. Wenn der Timer abgelaufen ist, wird dann z. B. table.setVisibility(View.INVISIBLE) ausgeführt.

    https://examples.javacodegeeks.com/android/core/activity/android-timertask-example/



  • jetzt stürzt mir die ganze App ab. Ich hab den Timer jetzt eingebaut..

    private View.OnClickListener playerListener = new View.OnClickListener() {
            public void onClick(View v) {
    
                timerTask = new TimerTask() {
    
                    public void run() {
                        handler.post(new Runnable() {
                                         public void run() {
                                            table.setVisibility(View.INVISIBLE);
                                         }
    
                                     });
                    }
                };
    
                vi = (ImageView) v;
                vi.setBackgroundColor(Color.argb(255, 163, 237, 250));
                timer = new Timer();
                timer.schedule(timerTask, 3000, 0); 
                player1SelectedNr = vi.getId();
            }
        };
    


  • Wenig aussagekräftig ohne Fehlermeldung, was?



  • Kann das bitte mal einer ausprobieren. Wenn man auf einen Button klickt , öffnet sich die ImageView. Klickt man auf die ImageView wird der Hintergrund 3 Sekunden blau und dann schließt sich die ImageView wieder. Danke.


Log in to reply