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()
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:
TextLayout
? TextLayout.getAdvance()
? (Kann ich fontMetrics
verwenden, um das zu erreichen?) Graphics2D.getFontRenderContext()
? 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:
TextLayout.getAdvance()
? (Ignoriere, wenn es aufgrund der Frage bezüglich TextLayout beantwortet wurde) Graphics2D.getFontRenderContext()
? 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)
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:
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.
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.
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.
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.
Tags und Links java android text graphics2d porting