Portierung von Java-Klasse und Methoden auf Android. (TextLayout, Schriftart, Graphics2D, & mehr)

8

Ich habe in Android herumgespielt und versucht, eine Java-App zu portieren. Im Folgenden finden Sie einige Fragen zu Problemen, auf die ich gestoßen bin.

Es ist eine ziemlich große Frage (mehrere Fragen eher). Ich frage sie jedoch nicht blind, denn ich habe recherchiert, was ich über sie denken könnte, und versucht, mein Verständnis dafür nutzbar zu machen. Ich habe mir Zeit genommen, die Fragen in der Hoffnung zu stellen, dass sie halbwegs klar sind, was ich erreichen möchte.

Ich werde die Hälfte meines Rufs als Kopfgeld anbieten, da ich auf gründliche Antworten und Hilfe hoffe, hoffentlich wird es genug sein, um ein paar Leute dazu zu bringen, zu helfen.

Vielen Dank für Ihre Zeit und Hilfe! (Ich freue mich darauf, Antworten zu lesen).

TextLayout & amp; & amp; Schriftart & amp; & amp; Graphics2D

In Frage kommen folgende Klassen und Methoden:

  • TextLayout
  • TextLayout.getAdvance()
  • TextLayout.getAscent()
  • TextLayout.draw()
  • Graphics2D.getFontRenderContext()

Ich bin nicht ganz sicher, was in Android% TextLayout entspricht. Ich hatte gelesen, dass einige ein TextView machen und das benutzen, aber ich bin mir nicht sicher, ob das so sein wird /

arbeite für Folgendes. Ich werde eine Quelle dafür liefern, was ich tun möchte und vielleicht kann mir jemand helfen.

Java Quelle:

%Vor%

Android-Replikationsversuch:

%Vor%

Ich bleibe bei der Festlegung, wie ein TextLayout erstellt wird und was für die Methode getAdvance() zu tun ist. Mir ist aufgefallen, dass in Paint.FontMetrics()

steht

einige mögliche Alternativen, aber ich weiß nicht, ob irgendwelche Vergleiche.

Ich bin mir auch nicht sicher, wie ich mit dem folgenden Java-Code umgehen soll:

%Vor%

Überprüfung / Zusammenfassung der Fragen oben:

  • Was ist eine Android-Alternative für TextLayout ?
  • Was entspricht TextLayout.getAdvance() ? (Kann ich fontMetrics verwenden, um das zu erreichen?)
  • Gibt es Android-Entsprechungen für Graphics2D.getFontRenderContext() ?
  • Können Sie eine Beispielquelle für Android bereitstellen?

Dies ist derzeit eines meiner größten Probleme bei der Portierung von Java auf Android. Ich wäre dankbar für jede Hilfe, Ratschläge, Beispiele usw.

Schriftart

Unten sind die Methoden, die ich replizieren möchte, mit font , textlayout und graphics2d . Die erste Quelle sind die Java-Methoden und

darunter ist mein Versuch, es zu replizieren.

In Frage kommen folgende Klassen und Methoden:

  • Font.deriveFont(float size) Erzeugt neue Font-Objekte, indem das aktuelle Font-Objekt repliziert und ein neuer Stil darauf angewendet wird
  • TextLayout.getAdvance() Der Vorschub ist die Entfernung vom Ursprung bis zum Vorlauf des ganz rechts stehenden (untersten) Zeichens in Zeilenrichtung
  • Graphics2D.setRenderingHint(RenderingHints, RenderingHints)
  • Graphics2D.getFontRenderContext() Kapselt Anwendungshinweise wie Anti-Aliasing und Bruchmetriken

Java Quelle:

%Vor%

Android Versuch:

%Vor%

Letzte Fragen zu den oben genannten Methoden:

  • Welche Alternative habe ich für TextLayout.getAdvance() ? (Ignoriere, wenn es aufgrund der Frage bezüglich TextLayout beantwortet wurde)
  • Welche Alternative habe ich für Graphics2D.getFontRenderContext() ?
  • Repliziert meine Android-Quelle die Java-Quelle? Wenn nicht, was muss geändert werden?
  • Gibt es bessere Möglichkeiten, dies zu tun? Wenn ja, wie?

Elipse2D.Double (doppelte x, doppelte y, doppelte w, doppelte h)

Gibt es eine Möglichkeit, eine Unterklasse von Oval zu erstellen, um etwas zu erzeugen, das Java Ellipse2D.Double entspricht? Wenn ja, wie würde man darüber gehen?

ComponentAdapter & amp; & amp; ComponentEvent

Ich habe diese in Java, weil meine Komponente in der Größe geändert werden kann, in Android, was sind die Äquivalente von diesen für Ansichten? (falls vorhanden)

    
StartingGroovy 25.07.2011, 21:02
quelle

4 Antworten

2

Die TextLayout , Font und Graphics2D Frage kann einfach in Android erreicht werden, indem ein TextView , einige Layoutattribute in der Layout-XML-Datei verwendet werden und möglicherweise mit etwas Code erweitert werden. Um dies anhand eines Beispiels zu veranschaulichen, könnte TextView im Layout-XML wie folgt deklariert werden:

%Vor%

Die meisten Attribute sind selbsterklärend, aber das layout_width wurde nicht gesetzt, da wir das TextView mit einem Font erweitern, der sich auf die Breite auswirkt.

%Vor%

Die Methode setTypeface() ist mit einem zusätzlichen Style-Parameter überladen, der auch fett und / oder kursiv wirken kann.

Die spezifische Position, in der dieser Text auf dem Bildschirm gezeichnet wird, hängt von dem Layout oder den Kombinationen von Layouts ab, die Sie z. RelativeLayout , AbsoluteLayout , etc - es gibt viele Ressourcen, die Ihnen beibringen können, wie Sie diese sinnvoll einsetzen können.

Wenn dies zu begrenzt ist, können Sie direkt auf Canvas zeichnen. Hier können Sie ein Paint- oder TextPaint-Objekt angeben, in dem Sie Anti-Aliasing und mehrere andere Paint-Effekte festlegen können.

Anstelle von Ellipse2D.Double könnten Sie Canvas.drawOval(RectF oval, Paint paint) verwenden, wobei das Objekt RectF den Begrenzungsrahmen für das Oval angibt.

Damit Sichten (Komponenten) automatisch in der Größe angepasst werden können, sollten Sie möglichst flexible Layout-Attribute wie wrap_content , match_parent oder fill_parent anstelle von spezifischen Dip-Größen verwenden. Grafiken sollten in 9-Patch-Formate konvertiert werden, damit sie sich dehnen können, um Größenänderungen zu berücksichtigen.

Wenn Sie wirklich die Länge des Textes berechnen oder die Textgröße an einen bestimmten physikalischen Platz anpassen müssen, können Sie sich auf diese Antwort auf SO.

    
John J Smith 28.07.2011, 19:31
quelle
2

Es gibt keine exakte Entsprechung zu TextLayout, aber Sie können FontMetrics (siehe die Paint) -Klasse verwenden, um den Fortschritt und Aufstieg zu erhalten. Um Text zu zeichnen, verwenden Sie einfach einen Canvas. Es gibt kein Äquivalent von FontRenderContext (auf Android wird es nicht benötigt).

Die Rendering-Hinweise von Graphics2D sind einfach Eigenschaften der Paint-Klasse. Font.deriveFont () hat keine Entsprechung, setzen Sie einfach die entsprechenden Eigenschaften auf Paint.

Ovale werden mit einem Canvas gezeichnet, es gibt keine Oval-Klasse. Sie können jedoch eine Path-Instanz verwenden, um dasselbe zu tun.

    
Romain Guy 28.07.2011 18:48
quelle
1

Ich denke, Sie suchen vielleicht nach android.text.layout

    
Merlin 28.07.2011 19:46
quelle
1

Dies ist ein Kommentar zu John J Smiths Antwort, aber es ist zu lang für das Kommentarfeld.

Über Java oder XML für Layouts: Android ist in dieser Hinsicht sehr flexibel, und für die Erstellung von Ansichten haben sie ziemlich viel Parität. Allerdings würde ich Ihnen empfehlen , dass Sie zumindest für die grundlegenden Layouts XML verwenden, da das gleiche Verhalten im Code fehleranfällig ist und sehr schnell sehr ausführlich wird. Sie können später immer Referenzen auf diese Ansichtselemente abrufen und sie im Code anpassen. Wenn Sie verschiedene Formfaktoren berücksichtigen, ist es eine nette Eigenschaft von Android, dass Sie einzigartige Layouts entsprechend der Geräteauflösung und Pixeldichte festlegen können. Die Auswahl dieser Layouts und der entsprechenden Ressourcen (wie Bilder) erfolgt automatisch durch System. Ein weiterer Vorteil ist die Spring-ähnliche (aber bessere) Layout-Bearbeitung, die viel schneller ist, um kleine Änderungen vorzunehmen, als eine kompilierte Anwendung auf ein Gerät oder einen Emulator zu laden.

    
user668660 31.07.2011 21:19
quelle