Welcher LayoutManager für die Animationen eines 2048 Spiels?

8

Zu Trainingszwecken repliziere ich derzeit das 2048 Spiel. Ich habe die Logik und die Interaktion fertig, aber drucke (und aktualisiere sie einfach) in einem einzigen TextView , was natürlich lächerlich aussieht.

Wenn ich darüber nachdenke, wie man eine Benutzeroberfläche für das Spiel erstellt, bin ich unsicher, welche LayoutManager zu wählen ist. Was ich im 4 x 4 Raster des Spiels tun muss, ist Zusammenführen und Hinzufügen von Zellen innerhalb von Zeilen und Spalten mit Animation . Es scheint mir so:

  • GridLayout funktioniert nicht, da es sich um den vollständigen Datensatz (16 Kacheln in vier Zeilen / Spalten) handelt, wenn ich in der Lage sein muss, mit einzelnen Zeilen und Spalten umzugehen. Ich bin mir jedoch nicht sicher. Ich habe vorher mit GridLayout gearbeitet, aber nie die Anzahl der Elemente manipuliert (hinzufügen, entfernen) und nie eine Animation mit dieser Manipulation benutzt. Gibt es eine Möglichkeit, einzelne Zeilen und Spalten zu manipulieren?

  • LinearLayout funktioniert nicht, da ich Probleme bekomme, wenn ich Spalten manipulieren möchte, aber vier horizontale LinearLayout s oder Zeilen, aber vier vertikale LinearLayout s.

  • RelativeLayout oder ConstraintLayout wäre möglich - vielleicht. Hier scheint das Problem zu sein, dass ich meine 16 Ansichten, TextView s wahrscheinlich im Auge behalten muss und programmatisch komplette Layouts konstruiere, damit ich der Animation sagen kann, was zu tun ist. Sicherlich lebensfähig, aber herausfordernd.

  • CustomLayout ist eine Wahl, aber auf welcher Oberklasse sollte ich sie aufbauen und warum?

Vermisse ich die einfache Lösung? Wenn nicht, was wäre das "natürlichste" LayoutManager für meine Datenstruktur (die momentan ein Array von 16 ganzen Zahlen ist, könnte aber leicht in ein 4 x 4 Array von ganzen Zahlen geändert werden).

    
kalabalik 22.09.2017, 08:15
quelle

2 Antworten

7

Update: Enthaltene Demo einer Kachel und zwei Kacheln, die kombiniert werden.

Ich schlage vor, dass Sie mit ConstraintLayout gehen. Es ermöglicht Ihnen, Ihre Ansichten effizient zu positionieren und Sie mit einigen einfachen Animationen zu versorgen. Ich habe eine kurze Probe zur Veranschaulichung dieses Ansatzes gemacht.

Hier ist ein Video der Ergebnisse:

Das XML-Layout verwendet ConstraintLayout als Ansichtsgruppe. Die zwei Felder sind einfach Textansichten, könnten aber leicht Bildansichten oder andere Arten von Ansichten sein.

Die beiden Felder bewegen sich vertikal zwischen den horizontalen Richtlinien bei 24dp ( gdln0 ) und 520dp ( gdln100 ) für textView1 und 148dp ( gdln25 ) und 520dp (% co_de) %) für gdln100 . Diese Bewegungen werden mit textView2 und ConstraintSet durch einen Klick-Handler animiert, der an die Schaltfläche "animate" angehängt ist. Hier ist die XML gefolgt von dem Code:

activity_main.xml

%Vor%

MainActivity.java

%Vor%     
Cheticamp 26.09.2017, 19:43
quelle
3

Ich denke, ich würde die ganze Sache einfach zeichnen, ohne TextView oder ähnliches zu benutzen.

Lassen Sie mich Ihnen erklären warum.

Angenommen, Sie haben eine Menge von 16 TextView , das ist das Maximum, das Sie in Ihrem Raster haben können, sollten Sie verwalten, welches sichtbar ist und welches nicht, verstecken Sie es oder nicht, verschieben Sie es innerhalb eines Layouts oder nicht. Dies würde viele Ressourcen beanspruchen und wenn Sie ein Layout wie das von Ihnen beschriebene verwenden, wäre auch ein "freier" Übergang nicht möglich.

Angenommen, Sie haben zwei Kacheln, und Sie möchten, dass eine auf der anderen gleitet und sie zusammenführt. Das einzige verwendbare Layout, das ich mir vorstellen kann, ist RelativeLayout , weil es das mit den am leichtesten manipulierbaren Constraints ist.

Sie müssen sich jedoch mit jedem TextView auseinandersetzen, indem Sie den allmählichen Übergang und die Überlappung verwalten, während Android für ALLE Möglichkeiten sorgt, die ein TextView kann.

Nun musst du all diese Bewegungen / Überlappungen sowieso machen, also warum machst du das nicht, indem du jede Kachel zeichnest? Sie müssen etwas mehr Code schreiben, um eine hypothetische Tile -Klasse in eine Zeichenfläche (Beachten Sie, dass Sie Ihre Datenstruktur etwas ändern könnten).


Nachdem Sie Ihren Zeichen-Mechanismus haben, müssen Sie dieselben Dinge machen wie mit TextViews , aber auf eine andere, freiere Art zu denken, mit weniger Einschränkungen und durch Verwenden weniger Android-Ressourcen.

Ich weiß, dass du um etwas Layout gebeten hast und ich schlage vor, die Fliesen selbst zu zeichnen, das ist vielleicht nicht das was du brauchst und wenn ich dich mit diesem langen Gespräch belästige, entschuldige ich mich, aber wenn du es tust Ich bat um Rat auf eine "breitere" Art. Ich denke, das ist eine gute Idee, die man im Kopf behalten sollte.
Und es wäre eine gute Gelegenheit, um 2D-Zeichnen auf Android zu lernen!

Glückliche Kodierung!

    
magicleon 22.09.2017 14:50
quelle