Fragestellung: Im Forum taucht immer mal wieder die Frage auf, wie man eine Zahl, die sich schnell ändert, ohne Flackern darstellen kann.
Hardware: Ich verwende einen Mega2560 und ein Display mit SSD1331. Das ist allerdings unerheblich.
Ursachenforschung: Bei der Verwendung von Adafruit_GFX funktioniert die Darstellung ohne Flackern, wenn man den eingebauten Font ('Classic' built-in font) mit Nutzung der Hintergrundfarbe ( setTextColor(WHITE, BLACK); ) verwendet. Bei großem Text gefällt die "Klötzchendarstellung" aber nicht jedem.
Die weiteren mitgelieferten Fonts (Custom font) können durchaus gefallen, unterstützen aber nicht die Hintergrundfarbe. Dadurch muß erst der Hintergrund durch ein Rechteck oder die alte Ziffer in Hintergrundfarbe gelöscht werden, bevor die neue Ziffer geschrieben werden kann.
Dies wird vom menschlichen Auge als Flackern wahrgenommen.
Idee 0: Wie beim eingebauten Font kann man bei allen Fonts die Hintergrundfarbe berücksichtigen. Ein Warntext in der Bibliothek läßt ahnen, daß Ungemach droht. Tatsächlich hat LadyAda die Fontdefinition auf die Vordergrundpixel komprimiert. Innerhalb eines Nutzrechtecks (w * h) sind Vordergrund- und Hintergrundpixel definiert. Dieses Nutzrechteck wird dann mittels Offsets (xo, yo) vom Ursprung auf der Basislinie ausgehend an die darzustellende Position verschoben. Alle Pixel außerhalb des Nutzrechtecks bleiben unberührt.
Leider gilt dies auch für die Fonts mit "Mono" im Namen, erst recht für die proportionalen.
Auch wenn diese Idee nicht zum Ziel führt, so ist die Erweiterung zur Darstellung der Hintergrundpixel doch Grundlage für die weiteren Aktivitäten.
yobg = absolut größter Wert aller yo der Ziffern, aber mit Vorzeichen
hbg = größter Wert aller h der Ziffern (nicht im Bild)
Idee 1: Aus dem Lieblingsfont nimmt man nur die Ziffern und erweitert die Fontdefinition um alle Hintergrundpixel. Das sollte zusammen mit Idee 0 funktionieren, habe ich aber nicht probiert.
Idee 2: Der Font bleibt unverändert, alle Pixel außerhalb des Nutzrechtecks werden berechnet und auf die Hintergrundfarbe gesetzt. Diese Idee habe ich weiterverfolgt.