Zeichenflächen unter Android
Gefahren für Menschen
⚠ Warnung Die Programme auf dieser Seite können Bildschirmflimmern hervorrufen, das bei einigen Personen, die dafür empfänglich sind, Störungen, wie beispielsweise epileptischen Anfälle, hervorrufen kann. Starten Sie diese Programme nicht, wenn sich solche Personen in der Nähe befinden könnten!
- de.wikipedia.org/wiki/Lichtflimmern
- „Lichtflimmerfrequenzen wirken sich, bewußt oder unbewußt wahrgenommen, negativ auf Augen, Gehirn, Hirnströme, Hormone, Nervosität, neurologische Abläufe, Verarbeitungs- und Steuerungszentren, Koordination, Stoffwechsel, Glukoseverbrauch, kapillaren Blutfluß oder Schlafqualität aus und können Migräne, Kopfschmerz oder epilepsieartige Anfälle auslösen.[6] Bei 1 von 4000 Menschen bestehen Risiken durch Epilepsie-Anfälle im Frequenzbereich von 3 Hz bis 70 Hz, Gesundheitsrisiken ab 165 Hz auch in Bezug auf sichtbares und unsichtbares Flimmern.[7] Die Zeitschrift ÖKO-TEST skizziert das Lichtflimmern in der Ausgabe November 2011 als „Disco fürs Hirn“.[8] Der Baubiologe Joachim Gertenbach konstatiert eine Beeinträchtigung des Nervensystems in Auswirkung als Kopfschmerzen, Migräne oder Unwohlsein und sieht die Wohngesundheit durch LED-Flimmern eingeschränkt.[9] Noch kritischer in Bezug auf eine Flimmer-Grenzfrequenz ist die Wirkungsweise bei Bewegung der Lichtquelle und dem Beobachter zueinander.“
- 6.↑ a b Baubiologe Wolfgang Maes: Hinters Licht geführt: Energiesparlampen, Ergänzter Sonderdruck aus WOHNUNG+GESUNDHEIT, Heft 133, 2009
- 7.↑ IEEE Standards Association (IEEE-SA): A Review of the Literature on Light Flicker, (PDF; 682 kB)
- 8.↑ http://www.oekotest.de/cgi/index.cgi?artnr=98893&bernr=01&seite=03
- 9.↑ Verband Baubiologie: Wohngesundheit durch LED-Flimmern eingeschränkt
Gefahren für Geräte
⚠ Warnung Die Programme auf dieser Seite verstecken teilweise die Anzeigeelemente zum Beenden des Programms. Bei Tests mit dem Emulator konnte das System erst nach dem Ausschalten und Wiedereinschalten mit dem Ausschalter wieder bedient werden. Auf realen Geräten sollten die Programme nur gestartet werden, wenn das Risiko in Kauf genommen wird, daß das Gerät dann nie mehr bedient werden kann. Eventuell ist es etwas weniger riskant, in dem folgenden Programm das »_STICKY« zu entfernen. Das Entfernen des gesamten Aufrufs von »setSystemUiVisibility« sollte das eben beschriebene Risiko vollkommen beseitigen.
Eine flimmernde Farbfläche mit »invalidate«
Das folgende Programm zeigt, wie der Bildschirm eines Gerätes mit einer Farbe gefüllt werden kann. Es füllt den Bildschirm mit einer bestimmten Farbe und kurz danach wieder mit einer anderen Farbe. Dadurch entsteht ein farbiges Flimmern.
Die Klasse »com.example.Rectangle« definiert eine Sichtfläche (»android.view.View«), die in ihrer onDraw-Methode durch Verwendung von »drawRGB« mit einer zufälligen Farbe gefüllt wird. In der onDraw-Methode wird anschließend durch »super.invalidate()« erreicht, daß diese Methode bald erneut aufgerufen wird. Dies liegt daran, daß »super.invalidate()« festlegt, daß die Sichtfläche neu gezeichnet werden muß, und die onDraw-Methode einer Sichtfläche für die Zeichnung der Sichtfläche zuständig ist.
Bei den Farbkomponenten „Rot“, „Grün“ und „Blau“ bedeutet der Wert »0« minimale Intensität und der Wert »255« maximale Intensität (im Aufruf von »drawRGB«).
In der Methode »onCreate« wird durch den Aufruf von »setSystemUiVisibility« verlangt, daß das Hauptfenster der Aktivität den gesamten Bildschirm ausfüllt. In einem Programm, das von deren Personen als dem Programmierer benutzt wird, sollte dies mit Vorsicht verwendet werden, da es viele Anwender stören könnte. Außerdem besteht das Risiko, daß es dann nicht einfach oder unmöglich ist, die Anwendung wieder zu verlassen. Deswegen sollte dieser Aufruf vor dem Start der Anwendung auf einem realen Gerät entfernt werden. Schließlich wird dann ein Exemplar der zuvor deklarierten Klasse »Rectangle« angelegt und als „Inhalt“ dieser Aktivität festgelegt (wodurch es zur Anzeige gebracht wird).
- Main.java
package com.example;
/** Eine rechteckiges Sichtkomponente. */
class Rectangle extends android.view.View
{/** Ein Zufallszahlengenerator. */
private final java.util.Random generator = new java.util.Random();/** Initialisiert ein rechteckiges Sichtobjekt.
@param context Der Kontext für dieses View */
public Rectangle( final android.content.Context context )
{ super( context ); }/** Legt fest, was diese Komponente beim Empfang der Nachricht {@code onDraw} tut.
@param canvas Eine Zeichenfläche, in die gezeichnet werden kann, um das
Aussehen dieser Komponente festzulegen. */
protected void onDraw( final android.graphics.Canvas canvas )
{ { /* Die gesamte Zeichenfläche wird auf eine zufällige Farbe gesetzt,
indem zufaellige Werte aus dem Bereich von 0 bis 255 für jede
der drei Farbkomponenten (Rot, Grün und Blau) festgelegt werden. */
canvas.drawRGB
( generator.nextInt( 256 ), generator.nextInt( 256 ), generator.nextInt( 256 )); }
{ /* Durch den Aufruf von "invalidate()" wird erreicht, daß diese
Methode ("onDraw(android.graphics.Canvas") bald wieder aufgerufen
wird. */
super.invalidate(); }}}public class Main extends android.app.Activity
{/** Diese Methode erstellt den Objektgraphen der Aktivität.
@param bundel ein Bündel, dessen Bedeutung durch Android festgelegt ist */
@java.lang.Override public void onCreate( final android.os.Bundle bundle )
{ super.onCreate( bundle );{ /* Es soll kein Titel angezeigt werden. */
Main.this.requestWindowFeature( android.view.Window.FEATURE_NO_TITLE ); }{ /* Einstellen des Hauptfensters dieser Anwendung auf Vollbilddarstellung.
Ein Erklärung der einzelnen Namen findet sich auf:
http://developer.android.com/training/system-ui/immersive.html
http://developer.android.com/reference/android/view/View.html */
Main.this.getWindow().getDecorView().setSystemUiVisibility
( 0
| android.view.View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| android.view.View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| android.view.View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| android.view.View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| android.view.View.SYSTEM_UI_FLAG_FULLSCREEN /* hides status bar */
| android.view.View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY ); }{ /* Hier wird unser Spezialobjekt als Inhalt dieser Aktivität festgelegt,
wodurch es sichtbar gemacht wird. */
setContentView( new Rectangle( this ) ); }}}
Übungsaufgaben
Die folgenden Übungsaufgaben wurden näherungsweise mit ungefähr steigendem Schwierigkeitsgrad angeordnet.
/ Gelbes Warnblinken
Das Programm soll eine gelbes Warnblinklicht realisieren, wie es etwa bei einer Notsituation in einem Kraftfahrzeug nützlich sein kann. Das ganze soll vom weiten möglichst so aussehen, wie eine reale gelbe Warnblickleuchte. Die Schwarz- und die Gelbphase sollen beide zwischen 400 und 800 Millisekunden dauern.
Zusatzaufgaben
/ Taschenlampe
Das Programm soll ständig eine möglichst große und möglichst helle weiße Fläche anzeigen.
/ Partyleuchte
Das Programm soll ständig eine mögiichst große und rote oder gelbe Fläche mit hoher Farbsättigung und hoher Intensität zeigen.
/ Glühlampe
Programmieren Sie Ihr Android-Gerät so, daß es eine große weiße Fläche für Beleuchtungszwecke anzeigt, deren Farbtemperator so ist wie die Farbtemperatur einer typischen klassischen Glühlampe. (Zusatzaufgabe: Erlauben Sie die Wahl zwischen: typischem Glühlampenlicht, typischem Neonlicht, typischem Tageslicht [mit und ohne Bewölkung] und LED-Licht.)
/ Stroboskop
Programmieren Sie ein Stroboskop, das meist eine schwarze Fläche zeigt, die aber manchmal kurz weiß aufblitzt.
- Variante A: Das weiße Aufblitzen soll regelmäßig mit einer bestimmten Frequenz ƒ erfolgen. Dabei soll ƒ nicht nicht außerhalb des Bereichs zwischen 2 und 100 Hz liegen.
- Variante B: Das weiße Aufblitzen soll unregelmäßig so erfolgen, daß der zeitliche Abstand zwischen zwei Blitzen vom Zufall abhängt. Es soll aber nie länger als 10 Sekunden schwarz bleiben.
- Variante C: Das weiße Aufblitzen soll regelmäßig mit einer bestimmten Frequenz ƒ erfolgen, die aber langsam variiert. Dabei soll ƒ nicht nicht außerhalb des Bereichs zwischen 2 und 100 Hz liegen.
/ Variable Partyleuchte
Ändern Sie das Beispielprogramm folgendermaßen ab:
- Die Sichtfläche soll zunächst ein mittleres Grau anzeigen.
- Bei jeder erneuten Darstellung mit »onDraw« soll sich nur einer der drei Anteil der Farbe (Rot, Grün oder Blau), der per Zufall ausgewählt wird, um einen per Zufall ausgewählten Schritt (»+1« oder »-1«) ändern.
- Es soll jedoch dafür gesorgt werden, daß ein Farbanteil (Rot, Grün oder Blau) nie außerhalb des Bereiches zwischen 0 und 255 liegt.
Zusatzanforderungen für Fortgeschrittene:
- Es soll dafür gesorgt werden, daß nur Pastellfarben (oder alternativ: nur Farben mit sehr hoher Farbsättigung) angezeigt werden. Die Farben sollen sich wieder bei jeder erneuten Darstellung in zufälliger Weise nur ein wenige verändern.
/ Weitere Zeichenmethoden
In einem android.graphics.Canvas-Objekt finden sich neben »drawRGB« noch weitere Zeichenmethoden. Probieren Sie jede dieser Zeichenmethoden aus, deren Dokumentation für Sie verständlich ist.
/ Blaues Warnblinken
Das Programm soll eine blaues (oder rotes) Warnblinklicht realisieren, wie es etwa von Einsatzfahrzeugen von Polizei oder Feuerwehr verwendet wird. Hierbei soll das Licht nicht nur ein und ausgeschaltet werden, sondern im Helligkeitsverlauf so variieren, wie bei einem realen Warnblicklicht eines Einsatzfahrzeuges. Im besten Fall soll das ganze im dunklen aus einiger Entfernen auf einem hinreichend großen Bildschirm genau so aussehen wie ein Warnblicklicht eines Einsatzfahrzeuges.
/ Fernsehsimulator
Das Fenster eines Raumes soll nachts von außen so aussehen, als ob in dem Raum ein Fernseher laufen würde, um Einbrecher abzuschrecken. Steuern Sie den Bildschirm eines Androidgerätes so an, daß man es in einen dunklen Raum legen kann, um diesen Effekt zu erreichen.
/ Farbuhr
Programmieren Sie eine farbige Fläche, die um Mitternacht ein tiefes Schwarz und zwölf Studen später ein helles Weiß anzeigt. Dazwischen soll die Bildschirmfarbe langsam in verschiedenen Farben changierend wechseln (nie sprunghaft, sondern immer nur langsam), so daß zu jeder Uhrzeit (von 0 bis 24 Uhr) eine andere Farbe gehört und man dann an der Farbe die ungefähre Tageszeit erkennen kann.
/ Notsignal
Es soll nur mit schwarz und weiß ein SOS-Signal angezeigt werden, so daß das Gerät nachts auf einer einsamen Insel verwendet werden kann, um visuelle SOS-Signale an vorbeifliegende Flugzeuge zu geben.
/ Weitere Animationen
Verwenden Sie die android.graphics.Canvas-Zeichenmethoden, um Animationen zu erstellen, wie beispielsweise einen sich bewegenden Kreis, der von den Rändern des Bildschirms reflektiert wird.
/ Verschiedene Arten von Uhren
Kombinieren Sie das in früheren Lektionen entwickelte Zählerprogrammen mit einer Animationstechnik (entweder dem in dieser Lektion vorgestellten »super.invalidate()« oder dem bereits früher vorgestellten »postDelayed«), um verschiedene Arten über Tastflächen bedienbarer Uhren zu programmieren, wie etwa:
- eine normale Uhr
- eine Stoppuhr
- eine Eieruhr
- eine Schachuhr
- u. s. w.