Überprüfen Sie, ob eine benutzerdefinierte Schriftart Zeichen anzeigen kann

9

Ich habe eine benutzerdefinierte Schriftart, die das Feldzeichen anzeigt. Die Schriftart, die ich verwende, unterstützt anscheinend nicht alle Sprachen. Ich möchte überprüfen, ob der String, den ich gerade anzeigen möchte, mit meiner benutzerdefinierten Schriftart angezeigt werden kann. Wenn es nicht möglich ist, dann möchte ich die Standard-Android-Schriftart verwenden (von der ich weiß, dass sie die Zeichen anzeigen kann). Ich kann keine Methode finden, um zu überprüfen, ob mein Typeface tatsächlich einen bestimmten String anzeigen kann. Ich bin sicher, ich habe eine Methode gesehen, die das irgendwo macht. Wer weiß?

    
timothyjc 05.08.2012, 09:49
quelle

6 Antworten

6

Aktualisierung: Wenn Sie für die API-Stufe 23 oder höher codieren, verwenden Sie Paint. hasGlyph () wie in der Antwort von Orson Baines erwähnt. Ansonsten sehe meine ursprüngliche Antwort unten.

Wie Sie in Ihrer eigenen Antwort erwähnt haben, gibt es keine eingebauten Methoden, um dies zu überprüfen. Wenn Sie jedoch eine Kontrolle darüber haben, welche Zeichenfolge / Zeichen Sie überprüfen möchten, ist dies tatsächlich mit einem etwas kreativeren Ansatz möglich.

Sie könnten ein Zeichen, von dem Sie wissen, dass es fehlt, in die zu überprüfende Schriftart zeichnen und dann ein Zeichen zeichnen, von dem Sie wissen möchten, ob es existiert, und es dann vergleichen und sehen, ob es gleich aussieht.

>

Hier ist ein Codebeispiel, das veranschaulicht, wie ich diese Überprüfung implementiert habe:

%Vor%

Es gibt einige wichtige Einschränkungen, die Sie bei dieser Methode beachten sollten:

  • Das zu prüfende Zeichen (Argument für isCharacterMissing ) darf kein Leerzeichen sein (kann mit Zeichen.isWhitespace () ). In einigen Schriftarten werden fehlende Zeichen als Leerzeichen dargestellt. Wenn Sie also ein vorhandenes Leerzeichen vergleichen, wird es in Fonts wie diesen fälschlicherweise als fehlendes Zeichen angezeigt.
  • Das missingCharacter -Member muss ein Zeichen sein, von dem bekannt ist, dass es in der zu überprüfenden Schriftart fehlt. Der Codepunkt U + 0978 , den ich verwende, ist ein reservierter Codepunkt in der Mitte des Devanagari-Unicode-Blocks, so dass es derzeit in allen Unicode-kompatiblen Zeichensätzen fehlen sollte. Wenn in Zukunft jedoch neue Zeichen zu Unicode hinzugefügt werden, könnte dieser Codepunkt einem echten Zeichen zugewiesen werden. Dieser Ansatz ist also nicht zukunftssicher, aber wenn Sie die Schriftart selbst angeben, können Sie sicherstellen, dass Sie immer dann ein fehlendes Zeichen verwenden, wenn Sie die Schriftart Ihrer Anwendung ändern.
  • Da diese Überprüfung durch das Zeichnen von Bitmaps und deren Vergleich durchgeführt wird, ist sie nicht sehr effizient. Daher sollte sie nur dazu verwendet werden, ein paar Zeichen und nicht alle Zeichenfolgen in Ihrer Anwendung zu überprüfen.

Aktualisierung:

Die Lösung, U + 0978 zu betrachten, funktionierte nicht so lange, wie von anderen darauf hingewiesen wurde. Dieses Zeichen wurde in der Unicode 7.0 Version in Juni 2014 . Eine weitere Option ist die Verwendung eines Glyphs, das in Unicode vorhanden ist, aber sehr unwahrscheinlich in einer normalen Schriftart verwendet wird.

U + 124AB im Frühe Dynastische Keilschrift Block ist wahrscheinlich etwas, das in vielen Schriftarten überhaupt nicht existiert.

    
nibarius 27.03.2014 05:49
quelle
5

Ab Android Version 23 können Sie es wie folgt testen:

%Vor%     
Orson Baines 03.05.2016 04:46
quelle
2

@nibarius Antwort funktioniert gut, wenn auch mit einem anderen Charakter: "\ u2936".

Diese Lösung ist jedoch schwer in Speicher, CPU und Zeit. Ich brauchte eine Lösung für eine sehr kleine Anzahl von Zeichen, also habe ich implementiert eine "schnelle und schmutzige" Lösung, indem nur die Grenzen überprüft werden. Es funktioniert ungefähr 50 mal schneller, also ist es für meinen Fall besser geeignet:

%Vor%

Ich sollte warnen, dass diese Methode weniger genau ist als @nibarius, und es gibt einige falsche Negative und falsche Positive, aber wenn Sie nur ein paar Zeichen testen müssen, um auf andere Charaktere zurückgreifen zu können - diese Lösung ist großartig.

    
auval 07.05.2015 23:55
quelle
1

Überprüfen Sie den Quellcode von Googles Mozc Projekt. Die EmojiRenderableChecker-Klasse scheint ziemlich gut zu funktionieren!

Es ist wie eine Kompat-Version für Paint.hasGlyph (Hinzugefügt in Marshmallow).

    
bapho 12.12.2016 12:22
quelle
1

Wenn Sie möchten, dass Ihre App weiterhin mit APIs unter 23 kompatibel ist und die hasGlyph-Funktion in Ihrem Code weiterhin verwendet, können Sie @TargetApi (23) folgendermaßen verwenden:

%Vor%

Und dann in Ihrem Code:

%Vor%

Das einzige Problem besteht darin, dass in APIs unter 23 möglicherweise leere Symbole angezeigt werden. Aber zumindest in API23 + wird deine App perfekt sein.

    
BarLr 08.12.2017 09:47
quelle
0

Um zu prüfen, ob das Musiksymbol in in einer Zeichenfolge angezeigt wird (wenn es auf einigen Geräten nicht angezeigt wird), können Sie versuchen, Messen die String-Breite; if width == 0 , dann fehlt das Symbol.

%Vor%     
Style-7 05.12.2017 17:34
quelle

Tags und Links