Berührungssensoren unter Android [] (Berührungssensoren unter Android), Lektion, Seite 722746
https://www.purl.org/stefan_ram/pub/beruehrungssensoren_android (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
Android-Entwicklung

Berührungssensoren unter Android 

Das folgende Programm zeigt Berührungsereignisse in einem Textfeld »Main#textView« an. Dazu wird das Textfeld in »Main#onCreate(android.os.Bundle)« angelegt. Für das Textfeld wird eine dicktengleiche Schrift eingestellt, um zu erreichen, daß die Positionen von Zeichen sich bei Veränderung des Textes nicht verändert, wodurch die spätere Ausgabe von Texten in dem Textfeld optisch ruhiger wird. Das Objekt »Main.this« abonniert Berührungsereignisse des Textfeldes, dadurch wird dann »Main#onTouch(android.view.View,android.view.MotionEvent)« bei jedem Berührungsereignis aufgerufen und zeigt dan Informationen dazu im Textfeld an. Das Textfeld wird als einziger Inhalt der Aktivität festgelegt und füllt deswegen das gesamte Fenster der Aktivität aus. Die Ausgabe des Namens des aktuellen Verlaufs zeigt, daß die Ereignisprozedur auf dem UI-Verlauf (»main«) läuft.

Main.java

package com.example;

/** Methoden für Android-Programme. */
class
Android
{

/** Fügt einen innenliegenden Rahmen zu einer Sichtfläche hinzu
@param activity Die Aktivität, zu der die Sichtfläche gehört.
@param view Die einzurahmende Sichtfläche.
@param color Die für den Rahmen zu verwendende Farbe. In Frage kommen hier
beispielsweise android.graphics.Color.BLACK, .BLUE, .CYAN, .DKGRAY, .GRAY,
.GREEN, .LTGRAY, .MAGENTA, .RED, .TRANSPARENT, .WHITE oder .YELLOW
@param width Eine Linienstärke zwischen 0 und 1 */

public static void
enframe
( final android.app.Activity activity,
final android.view.View view,
final int color,
final double width )
{ final android.graphics.drawable.ShapeDrawable rectShapeDrawable
= new android.graphics.drawable.ShapeDrawable
( new android.graphics.drawable.shapes.RectShape() );
{ final android.graphics.Paint paint = rectShapeDrawable.getPaint();
paint.setColor( color );
paint.setStyle( android.graphics.Paint.Style.STROKE );
final android.graphics.Point size = new android.graphics.Point();
activity.getWindowManager().getDefaultDisplay().getSize( size );
paint.setStrokeWidth( ( int )( width / 20 * java.lang.Math.sqrt
( ( double )size.x *( double )size.y ))); }
view.setBackground( rectShapeDrawable ); }}

/** Diese Klasse definiert eine Aktivität, die unter Android
ausgeführt werden kann. */

public class
Main extends android.app.Activity
implements android.view.View.OnTouchListener
{

/** Ein Textfeld. */
private android.widget.TextView
textView;

/** Die Schriftart für das Textfeld. */
private final static android.graphics.Typeface
typeface =
android.graphics.Typeface.create( "serif-monospace", android.graphics.Typeface.BOLD );

/** Diese Methode legt fest, was das Objekt bei Erhalt der Nachricht
{@code onCreate(android.os.Bundle)} tun soll. Hier wird ein Textfeld
angezeigt, und ein Abonnement von Nachrichten über Berührungen gestartet.

@param bundle enthält zuletzt mit onSaveInstanceState(android.os.Bundle)
gespeicherte Daten */

@java.lang.Override /* android.app.Activity */ public void
onCreate /* class Main */
( final android.os.Bundle bundle )
{ super.onCreate( bundle );
textView = new android.widget.TextView( this );
textView.setTypeface( Main.typeface );
textView.setOnTouchListener( Main.this );
Android.enframe( this, textView, android.graphics.Color.CYAN, 0.5 );
setContentView( textView ); }

/** Diese Methode legt fest, was das Objekt bei Erhalt der Nachricht
{@code onTouch(android.view.View,android.view.MotionEvent)} tun soll.
Hier wird ein kurzer Bericht über die Nachricht in das Textfeld
geschrieben.
@param view Die Sichtfläche, welcher das Berührungsereignis zugeteilt wurde
@param event Das aufgetretene Berührungsereignis
@return Ergibt {@code true}, um auszudrücken, daß das Ereignis verbraucht wurde. */

@java.lang.Override public boolean
onTouch /* class Main */
( final android.view.View v, final android.view.MotionEvent event )
{ final java.lang.String text;
switch( event.getAction() )
{ case android.view.MotionEvent.ACTION_DOWN: text = "DOWN "; break;
case android.view.MotionEvent.ACTION_MOVE: text = "MOVE "; break;
case android.view.MotionEvent.ACTION_CANCEL: text = "CANCEL "; break;
case android.view.MotionEvent.ACTION_UP: text = "UP "; break;
default: text = "??? "; break; }
textView.setText
( java.lang.String.format
( "\n\n %s %s: y = %05.2f; x = %05.2f.\n",
java.lang.Thread.currentThread().getName(),
text, event.getY(), event.getX() ));
return true; }}

Ein einfaches Zeichenprogramm

Es folgt ein Beispiel mit gerade dem Nötigsten, was ein einfaches Zeichenprogramm braucht. Auf langsamen Geräten muß man den Finger langsam bewegen, um eine durchgehende Linie zu erhalten.

Das Programm verwendet jetzt an Stelle des Textfeldes aus dem vorigen Beispiel eine Zeichenfläche vom Typ »Canvas«. Diese erhält aufgrund der Vorbereitung in »Main#onCreate(android.os.Bundle)« Berührungsereignisse. In der Methode »Canvas#onTouch(android.view.View,android.view.MotionEvent)« setzt sie dann entsprechende Pixel in einer Zeichenfläche, welche wir hier auch als eine „Super-Bitmap“ bezeichnen. Dieses ist eine von unserem Programm angelegte Zeichenfläche, die über mehrere Aufrufe der on-Methoden hinweg existiert und die Zeichnung enthält. Nach dem Setzen eines Pixels wird dann mit »super.invalidate()« erreicht, daß bald die Ausgabemethode »Canvas#onDraw(android.graphics.Canvas)« aufgerufen wird, welche dann unsere Super-Bitmap in die sichtbare Bitmap schreibt.

Die Größe der Super-Bitmap kann noch nicht im Konstruktor festgelegt werden, weil die Größe des Fensters zu diesem Zeitpunkt noch nicht von Android festgelegt wurde.

Dieses Programm kann als Grundgerüst dienen, um vom Leser zu einem Zeichenprogramm mit weiteren gewünschten Funktionen ausgebaut zu werden.

Main.java

package com.example;

/** Eine berührungsempfindliche Zeichenfläche. */
class
Canvas extends android.view.View
implements android.view.View.OnTouchListener
{

/** Eine Zeichenfläche für die Bitmap mit der Zeichnung. */
final android.graphics.Canvas
superCanvas = new android.graphics.Canvas();

/** Diese "Super-Bitmap" enthält die Zeichnung. */
android.graphics.Bitmap
superBitmap;

/** Die Farbe "Weiß". */
final android.graphics.Paint
white;

/** Die Farbe "Schwarz". */
final android.graphics.Paint
black;

/** Der Konstruktor dieser Klasse initialisiert die
benötigten Farben. */

public
Canvas /* class Canvas */
( final android.content.Context context )
{ super( context );

this.setOnTouchListener( this );

white = new android.graphics.Paint();
white.setStyle( android.graphics.Paint.Style.FILL );
white.setColor( android.graphics.Color.WHITE );

black = new android.graphics.Paint();
black.setStyle( android.graphics.Paint.Style.FILL );
black.setColor( android.graphics.Color.BLACK ); }

/** Wurde die Methode {@code onDraw} noch nicht aufgerufen? */
boolean
first = true;

/** Legt fest, was diese Komponente beim Empfang der Nachricht {@code onDraw} tut.
Hier wird unsere "Super-Bitmap" in die übergebene Zeichenfläche geschrieben.
Falls diese Methode zum ersten Mal aufgerufen wird, wird die Super-Bitmap mit der
Größe der Zeichenfläche angelegt, mit der superCanvas verbunden und auf die Farbe
"Weiß" gesetzt.
@param canvas Eine Zeichenfläche, in die gezeichnet werden kann, um das
Aussehen dieser Komponente festzulegen. */

protected void
onDraw /* class Canvas */
( final android.graphics.Canvas canvas )
{

if( first )
{ superBitmap = android.graphics.Bitmap.createBitmap
( canvas.getWidth(), canvas.getHeight(),
android.graphics.Bitmap.Config.ARGB_8888 );
superCanvas.setBitmap( superBitmap );
superCanvas.drawRGB( 255, 255, 255 );
first = false; }

canvas.drawBitmap( superBitmap, 0, 0, white ); }

/** Diese Methode legt fest, was das Objekt bei Erhalt der Nachricht
{@code onTouch(android.view.View,android.view.MotionEvent)} tun soll.
Hier wird an der Stelle der Berührung ein Punkt in die Super-Bitmap
geschrieben und die Ausgabefläche invalidiert, um Neuzeichnen zu erreichen.
@param view Die Sichtfläche, welcher das Berührungsereignis zugeteilt wurde
@param event Das aufgetretene Berührungsereignis
@return Ergibt {@code true}, um auszudrücken, daß das Ereignis verbraucht wurde. */

@java.lang.Override /* android.view.View.OnTouchListener */ public boolean
onTouch /* class Canvas */
( final android.view.View view, final android.view.MotionEvent event )
{ superCanvas.drawPoint( event.getX(), event.getY(), black );
super.invalidate(); return true; }}

/** Diese Klasse definiert eine Aktivität, die unter Android
ausgeführt werden kann. */

public class
Main extends android.app.Activity
{

/** Diese Methode legt fest, was das Objekt bei Erhalt der Nachricht
{@code onCreate(android.os.Bundle)} tun soll. Hier wird eine berührungsempfindliche
Zeichenfläche
@param bundle enthält zuletzt mit onSaveInstanceState(android.os.Bundle)
gespeicherte Daten */

@java.lang.Override public void
onCreate /* class Main */
( final android.os.Bundle bundle )
{ super.onCreate( bundle );
final Canvas canvas = new Canvas( this );
setContentView( canvas ); }}

Übungsaufgaben

/   Farbe definieren

Erstellen Sie ein Programm, das eine einfarbige Fläche anzeigt. Zwei Parameter der Farbe dieser Fläche (wie beispielsweise der Farbton und die Farbsättigung) sollen dann durch die Koordinaten der letzten Berührung einer Stelle der Anzeige festgelegt werden.

/   Reaktionszeit messen

Erstellen Sie ein, das zunächst ein einfarbige Fläche anzeigt. Nach einer zufälligen Zeit zwischen 3 und 30 Sekunden soll sich die Farbe ändern. Bis zu diesem Zeitpunkt darf der Benutzer den Bildschirm noch nicht berührt haben. Nach der Änderung der Farbe soll der Benutzer den Bildschirm dann möglichst schnell berühren. Zeigen Sie dann an, wieviel Zeit der Benutzer gebraucht hat, um den Bildschirm zu berühren.

/   Zeichenprogramm verbessern

Lassen Sie das Zeichenprogramm die einzelnen Punkte einer Fingerbewegung durch eine Linie miteinander verbinden.

Zusatzanforderung: Punkte, zwischen denen der Finger den Bildschirm nicht berührt hat, sollen nicht  miteinander verbunden werden.

Zusatzanforderung: Bei einer langsameren Bewegung soll der Strich dicker werden.

/   Zeichenprogramm verbessern (1)

Fügen Sie zusätzliche Flächen zu dem Programm hinzu, die jeweils ein Farbe enthalten. Man soll die Zeichenfarbe für die Hauptzeichenfläche dann durch Berühren dieser Fläche festlegen können.

Super-Bitmaps *

Der Begriff „Super-Bitmap“ wurde hier von der Graphikbibliothek des Amiga  übernommen. Allerdings ist eine „Super-Bitmap“ auf dieser Webseite hier nicht genau dasselbe wie auf dem Amiga. Zum Thema “superbitmap ” schreibt Eugene P. Mortimore  in Amiga Programmers Handbook, Volume I, Second Edition 1987:

Zitat
A superbitmap is a single, often large, raster bitmap where obscured as well as off-screen portions of a layer bitmap are permanently stored to aid on-screen refreshing; it is a backup bitmap area for a layer bitmap. It is called a superbitmap for two reasons: first, it is often larger than the on-screen bitmap for a layer, and second, it alone can satisfy the entire refreshing needs of the superbitmap layer without help firom other bitmaps in other sections of RAM.

Notiz *

adb shellinput [touchscreen|touchpad|touchnavigation] tap <x> <y>

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram722746 stefan_ram:722746 Berührungssensoren unter Android Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd722746, slrprddef722746, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/beruehrungssensoren_android