0% found this document useful (0 votes)
8 views88 pages

FU Lecture 15

The document provides an overview of the GestureDetector class in Android, detailing how to implement gesture detection such as double taps and flings. It includes code examples demonstrating the creation of a GestureDetector instance and the use of SimpleOnGestureListener to handle specific gestures. Additionally, it explains how to filter gestures based on movement parameters like velocity and direction.

Uploaded by

Chị Anh
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
8 views88 pages

FU Lecture 15

The document provides an overview of the GestureDetector class in Android, detailing how to implement gesture detection such as double taps and flings. It includes code examples demonstrating the creation of a GestureDetector instance and the use of SimpleOnGestureListener to handle specific gestures. Additionally, it explains how to filter gestures based on movement parameters like velocity and direction.

Uploaded by

Chị Anh
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
You are on page 1/ 88

GestureDetector

Maps, Geocoding, and


Location-Based Services
Agenda
 GestureDetector
 Generating SHA1 Fingerprint
 Signing up for API Key (as developer)
 Permissions
 MapFragment and GoogleMap object
 Layers
 MyLocation
GestureDetector

Android can detect various gestures and events


by the user

The GestureDetector.OnGestureListener
callback will notify users when a particular
motion event has occurred
GestureDetector
To use this class:

1. Create an instance of the GestureDetector for your View


2. In the Activity.onTouchEvent(MotionEvent) method
ensure you call
GestureDetector.onTouchEvent(MotionEvent)
The methods defined in your callback will be executed
when the events occur.
GestureDetector
public class SimpleGestureDetectorExample extends Activity {
GestureDetector detector;

class MyGestureDetector extends SimpleOnGestureListener {


@Override
public boolean onDoubleTap(MotionEvent e) {
Toast.makeText(getApplicationContext(), "You double tapped", Toast.LENGTH_SHORT).show();
return true;
}
}

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
detector = new GestureDetector(this, new MyGestureDetector());
}

@Override public boolean onTouchEvent(MotionEvent event) {


if (detector.onTouchEvent(event))
return true;
else
return false;
}
}
GestureDetector 1. Create an instance of
GestureDetector for your View
public class SimpleGestureDetectorExample extends Activity {
GestureDetector detector;

class MyGestureDetector extends SimpleOnGestureListener {


@Override
public boolean onDoubleTap(MotionEvent e) {
Toast.makeText(getApplicationContext(), "You double tapped",
Toast.LENGTH_SHORT).show();
return true;
}
}

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
detector = new GestureDetector(this, new MyGestureDetector());
}

@Override public boolean onTouchEvent(MotionEvent event) {


if (detector.onTouchEvent(event))
return true;
else
return false;
}
GestureDetector
public class SimpleGestureDetectorExample extends Activity {
GestureDetector detector;

class MyGestureDetector extends SimpleOnGestureListener {


@Override
public boolean onDoubleTap(MotionEvent e) {
Toast.makeText(getApplicationContext(), "You double tapped", Toast.LENGTH_SHORT).show();
return true;
}
}
2. In the Activity.onTouchEvent(MotionEvent)
method, ensure you call
@Override public void onCreate(Bundle savedInstanceState) {
GestureDetector.onTouchEvent(MotionEvent)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
detector = new GestureDetector(this, new MyGestureDetector());
}

@Override public boolean onTouchEvent(MotionEvent event) {


if (detector.onTouchEvent(event))
return true;
else
return false;
}
}
GestureDetector We extend SimpleOnGestureListener, which is a
convenience class when you don't want to
implement all of the gesture methods
public class SimpleGestureDetectorExample extends Activity {
GestureDetector detector;

class MyGestureDetector extends SimpleOnGestureListener {


@Override
public boolean onDoubleTap(MotionEvent e) {
Toast.makeText(getApplicationContext(), "You double tapped", Toast.LENGTH_SHORT).show();
return true;
}
}

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
detector = new GestureDetector(this, new MyGestureDetector());
}

@Override public boolean onTouchEvent(MotionEvent event) {


if (detector.onTouchEvent(event))
return true;
else
return false;
}
}
GestureDetector The one we do choose to implement in this
example, is onDoubleTap(), although
there are many more events that we can impleme
public class SimpleGestureDetectorExamplent
extends Activity {
GestureDetector detector;

class MyGestureDetector extends SimpleOnGestureListener {


@Override
public boolean onDoubleTap(MotionEvent e) {
Toast.makeText(getApplicationContext(), "You double tapped", Toast.LENGTH_SHORT).show();
return true;
}
}

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
detector = new GestureDetector(this, new MyGestureDetector());
}

@Override public boolean onTouchEvent(MotionEvent event) {


if (detector.onTouchEvent(event))
return true;
else
return false;
}
}
GestureDetector
When
public class SimpleGestureDetectorExample our detector
extends Activity { detects a double tap, we make
GestureDetector detector; a Toast

class MyGestureDetector extends SimpleOnGestureListener {


@Override
public boolean onDoubleTap(MotionEvent e) {
Toast.makeText(getApplicationContext(), "You double tapped",
Toast.LENGTH_SHORT).show();
return true;
}
}

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
detector = new GestureDetector(this, new MyGestureDetector());
}

@Override public boolean onTouchEvent(MotionEvent event) {


if (detector.onTouchEvent(event))
return true;
else
return false;
}
GestureDetector
public class SimpleGestureDetectorExample extends Activity {
GestureDetector detector;

class MyGestureDetector extends SimpleOnGestureListener {


@Override
public boolean onDoubleTap(MotionEvent e) {
Toast.makeText(getApplicationContext(), "You double tapped", Toast.LENGTH_SHORT).show();
Return true if you don't want any
return true;
further processing for this event
}
to occur
}

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
detector = new GestureDetector(this, new MyGestureDetector());
}

@Override public boolean onTouchEvent(MotionEvent event) {


if (detector.onTouchEvent(event))
return true;
else
return false;
}
}
GestureDetector
public class SimpleGestureDetectorExample extends Activity {
GestureDetector detector;

class MyGestureDetector extends SimpleOnGestureListener {


@Override
public boolean onDoubleTap(MotionEvent e) {
Toast.makeText(getApplicationContext(), "You double tapped", Toast.LENGTH_SHORT).show();
return true;
} Create an instance of
} MyGestureDetector, that we will
use later
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
detector = new GestureDetector(this, new MyGestureDetector());
}

@Override public boolean onTouchEvent(MotionEvent event) {


if (detector.onTouchEvent(event))
return true;
else
return false;
}
}
GestureDetector
public class SimpleGestureDetectorExample extends Activity {
GestureDetector detector;

class MyGestureDetector extends SimpleOnGestureListener {


@Override
public boolean onDoubleTap(MotionEvent e) {
Toast.makeText(getApplicationContext(), "You double tapped", Toast.LENGTH_SHORT).show();
return true;
}
}
This is a callback method for the
@Override public void onCreate(Bundle savedInstanceState) { Activity class, we override
super.onCreate(savedInstanceState); onTouchEvent, which may
setContentView(R.layout.main); contain a gesture
detector = new GestureDetector(this, new MyGestureDetector());
}

@Override public boolean onTouchEvent(MotionEvent event) {


if (detector.onTouchEvent(event))
return true;
else
return false;
}
}
GestureDetector
public class SimpleGestureDetectorExample extends Activity {
GestureDetector detector;

class MyGestureDetector extends SimpleOnGestureListener {


@Override
public boolean onDoubleTap(MotionEvent e) {
Toast.makeText(getApplicationContext(), "You double tapped", Toast.LENGTH_SHORT).show();
return true;
}
}

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
detector = new GestureDetector(this, new MyGestureDetector());
}
Our instance of
MyGestureDetector
@Override public boolean onTouchEvent(MotionEvent event) { will
if (detector.onTouchEvent(event)) determine if this touch event
return true; contains a gesture ...
else
return false;
}
}
GestureDetector
public class SimpleGestureDetectorExample extends Activity {
GestureDetector detector;

class MyGestureDetector extends SimpleOnGestureListener {


@Override
public boolean onDoubleTap(MotionEvent e) {
Toast.makeText(getApplicationContext(), "You double tapped", Toast.LENGTH_SHORT).show();
return true;
}
}

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
detector = new GestureDetector(this, new MyGestureDetector());
}

If it does, it checks whether you


@Override public boolean onTouchEvent(MotionEvent event) {
implemented the callback
if (detector.onTouchEvent(event))
method for the given gesture
return true;
else
return false;
}
}
GestureDetector
public class SimpleGestureDetectorExample extends Activity {
GestureDetector detector;

class MyGestureDetector extends SimpleOnGestureListener {


@Override
public boolean onDoubleTap(MotionEvent e) { So if the touch event is a double
tap, this
Toast.makeText(getApplicationContext(), "You double tapped", code will be executed
Toast.LENGTH_SHORT).show();
return true;
}
}

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
detector = new GestureDetector(this, new MyGestureDetector());
}

@Override public boolean onTouchEvent(MotionEvent event) {


if (detector.onTouchEvent(event))
return true;
else
return false;
}
}
GestureDetector

Another example, implementing the onFling()


method of SimpleGestureDetector
GestureDetector
class MyGestureDetector extends SimpleOnGestureListener {

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

if (Math.abs(e1.getY() - e2.getY()) > 250)


return false;

if (e1.getX() - e2.getX() > 120 && Math.abs(velocityX) > 200) {


Toast.makeText(getApplicationContext(), "You swiped right to left",
Toast.LENGTH_SHORT).show();
}
else if (e2.getX() - e1.getX() > 120 && Math.abs(velocityX) > 200) {
Toast.makeText(getApplicationContext(), "You swiped left to right",
Toast.LENGTH_SHORT).show();
}

return false;
}
}
GestureDetector
Override onFling
class MyGestureDetector extends SimpleOnGestureListener {

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {

if (Math.abs(e1.getY() - e2.getY()) > 250)


return false;

if (e1.getX() - e2.getX() > 120 && Math.abs(velocityX) > 200) {


Toast.makeText(getApplicationContext(), "You swiped right to left",
Toast.LENGTH_SHORT).show();
}
else if (e2.getX() - e1.getX() > 120 && Math.abs(velocityX) > 200) {
Toast.makeText(getApplicationContext(), "You swiped left to right",
Toast.LENGTH_SHORT).show();
}

return false;
}
GestureDetector First 2 args are MotionEvent objects,
which are used to report some kind of
movement, so they store information
about an event involving movement
class MyGestureDetector extends SimpleOnGestureListener {

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

if (Math.abs(e1.getY() - e2.getY()) > 250)


return false;

if (e1.getX() - e2.getX() > 120 && Math.abs(velocityX) > 200) {


Toast.makeText(getApplicationContext(), "You swiped right to left",
Toast.LENGTH_SHORT).show();
}
else if (e2.getX() - e1.getX() > 120 && Math.abs(velocityX) > 200) {
Toast.makeText(getApplicationContext(), "You swiped left to right",
Toast.LENGTH_SHORT).show();
}

return false;
}
}
GestureDetector e1 stores information about the
beginning of the movement, e2 stores
the same for the end of the movement
class MyGestureDetector extends SimpleOnGestureListener {

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

if (Math.abs(e1.getY() - e2.getY()) > 250)


return false;

if (e1.getX() - e2.getX() > 120 && Math.abs(velocityX) > 200) {


Toast.makeText(getApplicationContext(), "You swiped right to left",
Toast.LENGTH_SHORT).show();
}
else if (e2.getX() - e1.getX() > 120 && Math.abs(velocityX) > 200) {
Toast.makeText(getApplicationContext(), "You swiped left to right",
Toast.LENGTH_SHORT).show();
}

return false;
}
}
GestureDetector velocityX is the speed in the X
direction, velocityY is the speed in
the Y direction
class MyGestureDetector extends SimpleOnGestureListener {

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

if (Math.abs(e1.getY() - e2.getY()) > 250)


return false;

if (e1.getX() - e2.getX() > 120 && Math.abs(velocityX) > 200) {


Toast.makeText(getApplicationContext(), "You swiped right to left",
Toast.LENGTH_SHORT).show();
}
else if (e2.getX() - e1.getX() > 120 && Math.abs(velocityX) > 200) {
Toast.makeText(getApplicationContext(), "You swiped left to right",
Toast.LENGTH_SHORT).show();
}

return false;
}
}
GestureDetector
class MyGestureDetector extends SimpleOnGestureListener {

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

We try to filter out swipes that may


if (Math.abs(e1.getY() - e2.getY()) > 250)
be vertical swipes. It's up to you
return false; how you want to filter this out

if (e1.getX() - e2.getX() > 120 && Math.abs(velocityX) > 200) {


Toast.makeText(getApplicationContext(), "You swiped right to left",
Toast.LENGTH_SHORT).show();
}
else if (e2.getX() - e1.getX() > 120 && Math.abs(velocityX) > 200) {
Toast.makeText(getApplicationContext(), "You swiped left to right",
Toast.LENGTH_SHORT).show();
}

return false;
}
}
GestureDetector
class MyGestureDetector extends SimpleOnGestureListener {

@Override
Checking
public boolean for right-to-left swipe.
onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Did the user swipe "long enough"?
"Long enough" is arbitrary
if (Math.abs(e1.getY() - e2.getY()) > 250)
return false;

if (e1.getX() - e2.getX() > 120 && Math.abs(velocityX) > 200) {


Toast.makeText(getApplicationContext(), "You swiped right to left",
Toast.LENGTH_SHORT).show();
}
else if (e2.getX() - e1.getX() > 120 && Math.abs(velocityX) > 200) {
Toast.makeText(getApplicationContext(), "You swiped left to right",
Toast.LENGTH_SHORT).show();
}

return false;
}
}
GestureDetector
class MyGestureDetector extends SimpleOnGestureListener {

@Override
Checking
public boolean onFling(MotionEvent for right-to-left
e1, MotionEvent e2,swipe.
float velocityX, float velocityY) {
Did the user swipe "fast enough"?
"Fast enough" is also arbitrary
if (Math.abs(e1.getY() - e2.getY()) > 250)
return false;

if (e1.getX() - e2.getX() > 120 && Math.abs(velocityX) > 200) {


Toast.makeText(getApplicationContext(), "You swiped right to left",
Toast.LENGTH_SHORT).show();
}
else if (e2.getX() - e1.getX() > 120 && Math.abs(velocityX) > 200) {
Toast.makeText(getApplicationContext(), "You swiped left to right",
Toast.LENGTH_SHORT).show();
}

return false;
}
}
GestureDetector
class MyGestureDetector extends SimpleOnGestureListener {

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

if (Math.abs(e1.getY() - e2.getY()) > 250)


return false;

Check for left-to-right swipe


if (e1.getX() - e2.getX() > 120 && Math.abs(velocityX) > 200) {
Toast.makeText(getApplicationContext(), "You swiped right to left",
Toast.LENGTH_SHORT).show();
}
else if (e2.getX() - e1.getX() > 120 && Math.abs(velocityX) > 200) {
Toast.makeText(getApplicationContext(), "You swiped left to right",
Toast.LENGTH_SHORT).show();
}

return false;
}
}
GestureDetector
• These are gestures anywhere on the Activity
itself

• You may want to check for gestures on a


single View or several Views

• You would need to setup the onTouch events


for the individual Views instead
GestureDetector
public class GestureDetectorOnViewExampleActivity extends Activity {
GestureDetector detector;

class MyGestureDetector extends SimpleOnGestureListener {


@Override public boolean onDoubleTap(MotionEvent e) {
Toast.makeText(getApplicationContext(), "You double tapped", Toast.LENGTH_SHORT).show();
return true;
}
}

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);

final TextView tv = (TextView) findViewById(R.id.textView1);


tv.setOnTouchListener(new OnTouchListener() {

@Override public boolean onTouch(View v, MotionEvent event) {


detector.onTouchEvent(event);
return true;
}
});
GestureDetector
public class GestureDetectorOnViewExampleActivity extends Activity {
GestureDetector detector;

class MyGestureDetector extends SimpleOnGestureListener {


@Override public boolean onDoubleTap(MotionEvent e) {
Toast.makeText(getApplicationContext(), "You double tapped", Toast.LENGTH_SHORT).show();
return true;
}
} We will setup a
double tap event for
@Override public void onCreate(Bundle savedInstanceState)
this TextView {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

final TextView tv = (TextView) findViewById(R.id.textView1);


tv.setOnTouchListener(new OnTouchListener() {

@Override public boolean onTouch(View v, MotionEvent event) {


detector.onTouchEvent(event);
return true;
}
});
GestureDetector
public class GestureDetectorOnViewExampleActivity extends Activity {
GestureDetector detector;

class MyGestureDetector extends SimpleOnGestureListener {


@Override public boolean onDoubleTap(MotionEvent e) {
Toast.makeText(getApplicationContext(), "You double tapped", Toast.LENGTH_SHORT).show();
return true;
}
} To do that, we need
to know when it is
@Override public void onCreate(Bundle savedInstanceState)
touched {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

final TextView tv = (TextView) findViewById(R.id.textView1);


tv.setOnTouchListener(new OnTouchListener() {

@Override public boolean onTouch(View v, MotionEvent event) {


detector.onTouchEvent(event);
return true;
}
});
GestureDetector
public class GestureDetectorOnViewExampleActivity extends Activity {
GestureDetector detector;

class MyGestureDetector extends SimpleOnGestureListener {


@Override public boolean onDoubleTap(MotionEvent e) {
Toast.makeText(getApplicationContext(), "You double tapped", Toast.LENGTH_SHORT).show();
return true;
}
}

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);

final TextView tv = (TextView) findViewById(R.id.textView1);


tv.setOnTouchListener(new OnTouchListener() {

Similar to the previous example,


@Override public boolean onTouch(View v, MotionEvent event)
we call {
onTouchEvent on the
detector.onTouchEvent(event); GestureDetector
return true;
}
});
GestureDetector
public class GestureDetectorOnViewExampleActivity extends Activity {
GestureDetector detector;

class MyGestureDetector extends SimpleOnGestureListener {


@Override public boolean onDoubleTap(MotionEvent e) {
Toast.makeText(getApplicationContext(), "You double tapped", Toast.LENGTH_SHORT).show();
return true;
}
}

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);

final TextView tv = (TextView) findViewById(R.id.textView1);


tv.setOnTouchListener(new OnTouchListener() {

If youevent)
@Override public boolean onTouch(View v, MotionEvent don't {return true here, the double
detector.onTouchEvent(event); tap will not work. We turn true to
return true; indicate that you will handle these
} touch events yourself
});
detector = new GestureDetector(this, new MyGestureDetector());
Custom Gestures

How do you recognize a more complex


Gesture?

GestureDetector won't be able to recognize


those for you.
Custom Gestures

You can build your own custom gestures using


the Gestures Builder app, which is pre-
installed on your emulator
Custom Gestures
Custom Gestures

You may want to add multiple gestures with the


same name in order to get it right

After adding gestures to the Gestures Builder


app, you will need to copy the gestures file
over to your res/raw directory
Custom Gestures
• Open the DDMS Perspective in Eclipse
o Window > Show Perspective > Other > DDMS
• Show the Devices View
o Window > Show View > Devices
• Show the File Explorer View
o Window > Show View > File Explorer
• Select your emulator in the Devices view

• Browse mnt/sdcard/

• Select the gestures file

• Select the pull a file from device icon

• Save the file locally

• Place the file into your res/raw directory


Custom Gestures
Now you need to add a GestureOverlayView item onto your canvas

• Open your Layout XML file

• In the Palette, open the Advanced Tab

• Drag a GestureOverlayView onto the canvas and give it an id

You should have something like the XML file on the following slide
Custom Gestures
<?xml version="1.0" encoding="utf-8"?>
<android.gesture.GestureOverlayView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gestures"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
</RelativeLayout>

</android.gesture.GestureOverlayView>
Custom Gestures

The Java code follows


Custom Gestures
public class GestureExampleActivity extends Activity implements OnGesturePerformedListener{

GestureOverlayView mOverlay;
GestureLibrary gestureLib;

@Override public void onCreate(Bundle savedInstanceState) { }

@Override public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) { }

}
Custom Gestures
public class GestureExampleActivity extends Activity implements OnGesturePerformedListener {

GestureOverlayView mOverlay;
We implement
GestureLibrary gestureLib;
OnGesturePerformedListen
er
@Override public void onCreate(Bundle savedInstanceState) { }

@Override public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) { }

}
Custom Gestures
public class GestureExampleActivity extends Activity implements OnGesturePerformedListener {

GestureOverlayView mOverlay;
GestureLibrary gestureLib;

@Override public void onCreate(Bundle savedInstanceState) { }

@Override public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) { }

}
Which forces us to add the
onGesturePerformed() callback
method, which we show on the
next slides
Custom Gestures
public class GestureExampleActivity extends Activity implements OnGesturePerformedListener {

GestureOverlayView mOverlay;
GestureLibrary gestureLib; Note these fields, which
we will use later
@Override public void onCreate(Bundle savedInstanceState) { }

@Override public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) { }

}
Custom Gestures
GestureOverlayView mOverlay;
GestureLibrary gestureLib;

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mOverlay = (GestureOverlayView) findViewById(R.id.gestures);
mOverlay.addOnGesturePerformedListener(this);
gestureLib = GestureLibraries.fromRawResource(this, R.raw.gestures);

if(!gestureLib.load())
Toast.makeText(this, "Couldn't load Gesture Library", Toast.LENGTH_SHORT).show();
}

@Override public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {


ArrayList<Prediction> predictions = gestureLib.recognize(gesture);
for(Prediction prediction : predictions) {
if(prediction.score > 1.0)
Toast.makeText(getApplicationContext(), prediction.name, Toast.LENGTH_SHORT).show();
}
Custom Gestures
GestureOverlayView mOverlay;
GestureLibrary gestureLib;
The GestureOverlay is a
View, so we get a handle on
@Override public void onCreate(Bundle savedInstanceState) it
{ the usual way
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mOverlay = (GestureOverlayView) findViewById(R.id.gestures);
mOverlay.addOnGesturePerformedListener(this);
gestureLib = GestureLibraries.fromRawResource(this, R.raw.gestures);

if(!gestureLib.load())
Toast.makeText(this, "Couldn't load Gesture Library", Toast.LENGTH_SHORT).show();
}

@Override public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {


ArrayList<Prediction> predictions = gestureLib.recognize(gesture);
for(Prediction prediction : predictions) {
if(prediction.score > 1.0)
Toast.makeText(getApplicationContext(), prediction.name, Toast.LENGTH_SHORT).show();
}
Custom Gestures
GestureOverlayView mOverlay;
GestureLibrary gestureLib;

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mOverlay = (GestureOverlayView) findViewById(R.id.gestures);
mOverlay.addOnGesturePerformedListener(this); Since our Activity implements
onGesturePerformedListener, we
gestureLib = GestureLibraries.fromRawResource(this, R.raw.gestures);
set this Activity as the
OnGesturePerformedListener
if(!gestureLib.load())
Toast.makeText(this, "Couldn't load Gesture Library", Toast.LENGTH_SHORT).show();
}

@Override public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {


ArrayList<Prediction> predictions = gestureLib.recognize(gesture);
for(Prediction prediction : predictions) {
if(prediction.score > 1.0)
Toast.makeText(getApplicationContext(), prediction.name, Toast.LENGTH_SHORT).show();
}
Custom Gestures
GestureOverlayView mOverlay;
GestureLibrary gestureLib;

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mOverlay = (GestureOverlayView) findViewById(R.id.gestures);
mOverlay.addOnGesturePerformedListener(this);
gestureLib = GestureLibraries.fromRawResource(this, R.raw.gestures);

Alternatively, you can create an Anonymous inner class and say


if(!gestureLib.load())
mOverlay.addOnGesturePerformedListener(new OnGesturePerformedListener()
Toast.makeText(this, "Couldn't load Gesture {...});
Library", Toast.LENGTH_SHORT).show();
}

@Override public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {


ArrayList<Prediction> predictions = gestureLib.recognize(gesture);
for(Prediction prediction : predictions) {
if(prediction.score > 1.0)
Toast.makeText(getApplicationContext(), prediction.name, Toast.LENGTH_SHORT).show();
}
Custom Gestures
GestureOverlayView mOverlay;
GestureLibrary gestureLib;

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mOverlay = (GestureOverlayView) findViewById(R.id.gestures);
mOverlay.addOnGesturePerformedListener(this);
gestureLib = GestureLibraries.fromRawResource(this, R.raw.gestures);

if(!gestureLib.load())
GestureLibraries simply
Toast.makeText(this,
allows us to"Couldn't load Gesture Library", Toast.LENGTH_SHORT).show();
open gesture
} files

@Override public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {


ArrayList<Prediction> predictions = gestureLib.recognize(gesture);
for(Prediction prediction : predictions) {
if(prediction.score > 1.0)
Toast.makeText(getApplicationContext(), prediction.name, Toast.LENGTH_SHORT).show();
}
Custom Gestures
GestureOverlayView mOverlay;
GestureLibrary gestureLib;

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mOverlay = (GestureOverlayView) findViewById(R.id.gestures);
mOverlay.addOnGesturePerformedListener(this);
gestureLib = GestureLibraries.fromRawResource(this, R.raw.gestures);

if(!gestureLib.load())
byload
Toast.makeText(this, "Couldn't calling
Gesture Library", Toast.LENGTH_SHORT).show();
fromRawResource()
}

@Override public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {


ArrayList<Prediction> predictions = gestureLib.recognize(gesture);
for(Prediction prediction : predictions) {
if(prediction.score > 1.0)
Toast.makeText(getApplicationContext(), prediction.name, Toast.LENGTH_SHORT).show();
}
Custom Gestures
GestureOverlayView mOverlay;
GestureLibrary gestureLib;

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mOverlay = (GestureOverlayView) findViewById(R.id.gestures);
mOverlay.addOnGesturePerformedListener(this);
gestureLib = GestureLibraries.fromRawResource(this, R.raw.gestures);

if(!gestureLib.load())
and passing the Context
Toast.makeText(this, "Couldn't load Gesture
andLibrary", Toast.LENGTH_SHORT).show();
our gestures file as
} arguments

@Override public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {


ArrayList<Prediction> predictions = gestureLib.recognize(gesture);
for(Prediction prediction : predictions) {
if(prediction.score > 1.0)
Toast.makeText(getApplicationContext(), prediction.name, Toast.LENGTH_SHORT).show();
}
Custom Gestures
GestureOverlayView mOverlay;
GestureLibrary gestureLib;

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mOverlay = (GestureOverlayView) findViewById(R.id.gestures);
mOverlay.addOnGesturePerformedListener(this);
gestureLib = GestureLibraries.fromRawResource(this, R.raw.gestures);

if(!gestureLib.load())
Toast.makeText(this, "Couldn't load Gesture Library", Toast.LENGTH_SHORT).show();
}

@Override
Try to loadpublic void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
the gestures
ArrayList<Prediction> predictions = gestureLib.recognize(gesture);
for(Prediction prediction : predictions) {
if(prediction.score > 1.0)
Toast.makeText(getApplicationContext(), prediction.name, Toast.LENGTH_SHORT).show();
}
Custom Gestures
GestureOverlayView mOverlay;
GestureLibrary gestureLib;

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mOverlay = (GestureOverlayView) findViewById(R.id.gestures);
mOverlay.addOnGesturePerformedListener(this);
gestureLib = GestureLibraries.fromRawResource(this, R.raw.gestures);
Now whenever the user performs
some gesture, we need to determine
if(!gestureLib.load())
if it's one of our predefined gestures
Toast.makeText(this, "Couldn't load Gesture Library", Toast.LENGTH_SHORT).show();
}

@Override public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {


ArrayList<Prediction> predictions = gestureLib.recognize(gesture);
for(Prediction prediction : predictions) {
if(prediction.score > 1.0)
Toast.makeText(getApplicationContext(), prediction.name, Toast.LENGTH_SHORT).show();
}
Custom Gestures
GestureOverlayView mOverlay;
GestureLibrary gestureLib;

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mOverlay = (GestureOverlayView) findViewById(R.id.gestures);
mOverlay.addOnGesturePerformedListener(this);
gestureLib = GestureLibraries.fromRawResource(this, R.raw.gestures);
We are provided with our
GestureOverlayView, which we
if(!gestureLib.load()) defined in our XML Layout file
Toast.makeText(this, "Couldn't load Gesture Library", Toast.LENGTH_SHORT).show();
}

@Override public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {


ArrayList<Prediction> predictions = gestureLib.recognize(gesture);
for(Prediction prediction : predictions) {
if(prediction.score > 1.0)
Toast.makeText(getApplicationContext(), prediction.name, Toast.LENGTH_SHORT).show();
}
Custom Gestures
GestureOverlayView mOverlay;
GestureLibrary gestureLib;

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mOverlay = (GestureOverlayView) findViewById(R.id.gestures);
mOverlay.addOnGesturePerformedListener(this);
As well as theR.raw.gestures);
gestureLib = GestureLibraries.fromRawResource(this, Gesture itself. This
Object contains information about
if(!gestureLib.load()) the shape that was drawn on the
overlay
Toast.makeText(this, "Couldn't load Gesture Library", Toast.LENGTH_SHORT).show();
}

@Override public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {


ArrayList<Prediction> predictions = gestureLib.recognize(gesture);
for(Prediction prediction : predictions) {
if(prediction.score > 1.0)
Toast.makeText(getApplicationContext(), prediction.name, Toast.LENGTH_SHORT).show();
}
Custom Gestures
GestureOverlayView mOverlay;
GestureLibrary gestureLib;

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mOverlay = (GestureOverlayView) findViewById(R.id.gestures);
mOverlay.addOnGesturePerformedListener(this);
gestureLib = GestureLibraries.fromRawResource(this, R.raw.gestures);
Remember we loaded our gestures
if(!gestureLib.load()) into gestureLib. Now we use our
GestureLibrary
Toast.makeText(this, "Couldn't load Gesture gestureLib to try and
Library", Toast.LENGTH_SHORT).show();
recognize the shape that was drawn
}
on the screen

@Override public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {


ArrayList<Prediction> predictions = gestureLib.recognize(gesture);
for(Prediction prediction : predictions) {
if(prediction.score > 1.0)
Toast.makeText(getApplicationContext(), prediction.name, Toast.LENGTH_SHORT).show();
}
Custom Gestures
GestureOverlayView mOverlay;
GestureLibrary gestureLib;

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mOverlay = (GestureOverlayView) findViewById(R.id.gestures);
mOverlay.addOnGesturePerformedListener(this);
gestureLib = GestureLibraries.fromRawResource(this, R.raw.gestures);

Since it is possible to recognize


if(!gestureLib.load())
more than one gesture, we need to
Toast.makeText(this,
store the results in "Couldn't
a List load Gesture Library", Toast.LENGTH_SHORT).show();
}

@Override public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {


ArrayList<Prediction> predictions = gestureLib.recognize(gesture);
for(Prediction prediction : predictions) {
if(prediction.score > 1.0)
Toast.makeText(getApplicationContext(), prediction.name, Toast.LENGTH_SHORT).show();
}
Custom Gestures
GestureOverlayView mOverlay;
GestureLibrary gestureLib;

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mOverlay = (GestureOverlayView) findViewById(R.id.gestures);
mOverlay.addOnGesturePerformedListener(this);
gestureLib = GestureLibraries.fromRawResource(this, R.raw.gestures);
We have a List of Predictions. A Prediction
contains a name, which we gave to our
if(!gestureLib.load())
Gesture when we used the GesturesBuilder
Toast.makeText(this,
app, "Couldn't
and a score, which loadconfidence
is the Gesture Library",
in Toast.LENGTH_SHORT).show();
} the prediction

@Override public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {


ArrayList<Prediction> predictions = gestureLib.recognize(gesture);
for(Prediction prediction : predictions) {
if(prediction.score > 1.0)
Toast.makeText(getApplicationContext(), prediction.name, Toast.LENGTH_SHORT).show();
}
Custom Gestures
GestureOverlayView mOverlay;
GestureLibrary gestureLib;

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mOverlay = (GestureOverlayView) findViewById(R.id.gestures);
mOverlay.addOnGesturePerformedListener(this);
gestureLib = GestureLibraries.fromRawResource(this, R.raw.gestures);

if(!gestureLib.load())
Toast.makeText(this, "Couldn't load Gesture Library", Toast.LENGTH_SHORT).show();
}
This is a shortcut technique
for iterating through the List
@Override public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
ArrayList<Prediction> predictions = gestureLib.recognize(gesture);
for(Prediction prediction : predictions) {
if(prediction.score > 1.0)
Toast.makeText(getApplicationContext(), prediction.name, Toast.LENGTH_SHORT).show();
}
Custom Gestures
GestureOverlayView mOverlay;
GestureLibrary gestureLib;

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mOverlay = (GestureOverlayView) findViewById(R.id.gestures);
mOverlay.addOnGesturePerformedListener(this);
gestureLib = GestureLibraries.fromRawResource(this, R.raw.gestures);

if(!gestureLib.load())
Toast.makeText(this, "Couldn't load Gesture Library", Toast.LENGTH_SHORT).show();
}
Only recognize this as a valid
gesture if we have some kind
@Override public
ofvoid onGesturePerformed(GestureOverlayView
confidence in the prediction overlay, Gesture gesture) {
ArrayList<Prediction> predictions = gestureLib.recognize(gesture);
for(Prediction prediction : predictions) {
if(prediction.score > 1.0)
Toast.makeText(getApplicationContext(), prediction.name, Toast.LENGTH_SHORT).show();
}
Custom Gestures
GestureOverlayView mOverlay;
GestureLibrary gestureLib;

@Override public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mOverlay = (GestureOverlayView) findViewById(R.id.gestures);
mOverlay.addOnGesturePerformedListener(this);
gestureLib = GestureLibraries.fromRawResource(this, R.raw.gestures);

if(!gestureLib.load())
Toast.makeText(this, "Couldn't load Gesture Library", Toast.LENGTH_SHORT).show();
}
To find out which gesture was
made, useoverlay,
@Override public void onGesturePerformed(GestureOverlayView the name field
Gesture in
gesture) {
the Prediction instance
ArrayList<Prediction> predictions = gestureLib.recognize(gesture);
for(Prediction prediction : predictions) {
if(prediction.score > 1.0)
Toast.makeText(getApplicationContext(), prediction.name,
Toast.LENGTH_SHORT).show();
Google Maps API Key
• In order to use the Google Maps API, you first
need to obtain an API key and configure your
app

• GoogleMap API v1 is obsolete!!


• Now, you better use GoogleMap API v2.
o https://
docs.google.com/document/pub?id=19nQzvKP-CVLd7_VrpwnHf
l-AE9fjbJySowONZZtNHzw
Getting the SHA1 Fingerprint
• To register for a Maps API Key, you need to provide an
SHA1 fingerprint of the certificate that you will use to
sign your application
• Navigate to C:\Documents and Settings\
<User>\.android
• Run the following command
keytool -list –v –keystore debug.keystore -alias androiddebugkey -storepass android -keypass
android

• Copy the text that comes after Certificate fingerprint


(SHA1):
• Go Google API Console and sign up for the Android
Maps API
• Save the generated API key, you will use it in your app.
Use (Support) WebFragment
• In the layout file:
• You need define a <fragment>
• Give it an id, so you can access it in source code.
• Class=“com.google.android.gms.maps.MapFragmen
t” or SupportMapFragment depending on the version
of your phone.
Use (Support) WebFragment
• In the java file:
• SupportMapFragment mapFrag = (SupportMapFragment)
getSupportFragmentManager().findFragmentById(R.id.mapView)

• GoogleMap map = mapGrag.getMap();

• CameraUpdate center = CameraUpdateFactory.newLatLng(new LatLng(x,


y), where x and y are double/float.
• map.moveCamera(center)

• CameraUpdate zoom = CameraUpdateFactory.zoomTo(15).


• map.animateCamera(zoom)
Add Marker or OverlayItem
• Create Marker object
• MarkerOptions mo = new
MarkerOptions().position(LatLng).title(“text”).snippet(
“text”).draggable(true);
• Add a marker to the map object.
• Map.addMarker(mo);
Customized Info Window
• Create a new class that implements
InfoWindowAdapter

• Class PopupAdapter implements InfoWindowAdapter{


LayoutInflater inflater;
PopupAdapter(LayoutInflater inflater){
this.inflater = inflater;
}
@Override
public View getInfoContents(Marker marker){
}
Customized Info Window
• @Override
public View getInfoContents(Marker marker){
View popup = inflater.inflate(R.layout.popup, null);
TextView tv = (TextView) popup.findViewById();
tv.setText(Marker.getTitle);
return popup;
}

@Override
Public View getInfoWindow(Marker marker){ return null;}
Customized Info Window
• In java file:

• map.setInfoWindowAdapter(new PopuoAdapter(getLayoutInflater()));
Find My Location
• In java file:
• map.setMyLocationEnabled(true);
• You must call map.setOnMyLocationChangeListener(Listener)
• The listener must override the method:
• Public void onMyLocationChange(Location lastKnownLocation)
Map Listeners
• setOnCameraChangeListener(this)
o implement OnCameraChangeListener
o Override public void onCameraChange(CameraPosition position)

• setMyLocationChangeListener(this):
o implement OnMyLocationChangeListener
o Override public void onMyLocationChange(Location lastKnownLocation)

• If you set marker.draggable(true)


o Implement OnMarkerDragListener
o Override three methods:
 onMarkerDrag(Marker maker)
 onMarkerDragEnd(Marker marker)
 onMarkerDragStart(Marker marker)
Guesture
• The user can change zoom level either by + and - buttons or via “pinch-to
zoom” gestures

• The user can change the center of the map via simple swipe gestures

• The user can change the camera tilt via two-finger vertical swipes, so
instead of a traditional top-down perspective, the user can see things on
an angle

• The user can change the orientation of the map via a two-finger rotating
swipe, to change the typical “north is to the top of the map” to some other
orientation
Control
• You can enable and disable those gestures by:
o setRotateGesturesEnabled()
o setScrollGesturesEnabled() (for panning the map)
o setTiltGesturesEnabled()
o setZoomControlsEnabled() (for the + and - buttons)
o setZoomGesturesEnabled() (for pinch-to-zoom)
o SetCompassEnable()
JSON Values

• "title" : "IT Business Analyst Intern"


• "organization" : "Medtronic"
• "city" : "Brooklyn Park"
JSON Arrays

"details" : [ "bla bla bla" , "drank some soda" , "hit manager in face with pie"]
JSON Objects

{
"title" : "IT Business Analyst Intern" ,
"organization" : "Medtronic" ,
"city" : "Brooklyn Park" ,
"state" : "MN" ,
"start_date" : "05/10" ,
"end_date" : "07/10" ,
"details" : [ "bla bla bla" , "drank some soda" , "hit manager in face with pie"]
}
Parsing JSON
JSONObject json = new JSONObject(raw);

final String moviePlot = "" + json.getString("Plot");

mTextMoviePlot.post(new Runnable() {
@Override
public void run() {
mTextMoviePlot.setText(moviePlot);
}
});
Parsing JSON
JSONObject is a set of
JSONObject json = new JSONObject(raw); name/value mappings,
can represent a JSON
document

final String moviePlot = "" + json.getString("Plot");

mTextMoviePlot.post(new Runnable() {
@Override
public void run() {
mTextMoviePlot.setText(moviePlot);
}
});
Parsing JSON
JSONObject json = new JSONObject(raw);

final String moviePlot = "" + json.getString("Plot");

mTextMoviePlot.post(new Runnable() { Retrieve the plot of the


movie
@Override
public void run() {
mTextMoviePlot.setText(moviePlot);
}
});
Parsing JSON

Parsing JSON is not always this simple however, but it's


usually straightforward once you understand JSON

A JSONObject may consist of more JSONObjects,


JSONArrays, Strings, Booleans, Integers, etc
Parsing JSON

{
"title" : "IT Business Analyst Intern" ,
"organization" : "Medtronic" ,
"city" : "Brooklyn Park" ,
"state" : "MN" ,
"start_date" : "05/10" ,
"end_date" : "07/11" ,
"details" : [ "bla bla bla" , "drank some soda" , "hit manager in face with pie"]
}
Parsing JSON

This is a JSONObject

{
"title" : "IT Business Analyst Intern" ,
"organization" : "Medtronic" ,
"city" : "Brooklyn Park" ,
"state" : "MN" ,
"start_date" : "05/10" ,
"end_date" : "07/11" ,
"details" : [ "bla bla bla" , "drank some soda" , "hit manager in face with
pie"]
}
Parsing JSON

{
"title" : "IT Business Analyst Intern" , You can get title by
calling getString("title")
"organization" : "Medtronic" , on the JSONObject
"city" : "Brooklyn Park" ,
"state" : "MN" ,
"start_date" : "05/10" ,
"end_date" : "07/11" ,
"details" : [ "bla bla bla" , "drank some soda" , "hit manager in face with pie"]
}
Parsing JSON

{
"title" : "IT Business Analyst Intern" ,
"organization" : "Medtronic" , You can get organization by calling
getString("organization") on the
"city" : "Brooklyn Park" , JSONObject
"state" : "MN" ,
"start_date" : "05/10" ,
"end_date" : "07/11" ,
"details" : [ "bla bla bla" , "drank some soda" , "hit manager in face with pie"]
}
Parsing JSON

{
"title" : "IT Business Analyst Intern" ,
"organization" : "Medtronic" ,
"city" : "Brooklyn Park" ,
"state" : "MN" ,
Etcetera, etcetera ...
"start_date" : "05/10" ,
"end_date" : "07/11" ,
"details" : [ "bla bla bla" , "drank some soda" , "hit manager in face with pie"]
}
Parsing JSON

{
"title" : "IT Business Analyst Intern" ,
"organization" : "Medtronic" ,
"city" : "Brooklyn Park" ,
"state" : "MN" ,
"start_date" : "05/10" ,
"end_date" : "07/11" ,
"details" : [ "bla bla bla" , "drank some soda" , "hit manager in face with
pie"]
} This however, is not a String,
but an array. Get this by
calling getJSONArray() on the
JSONObject
Parsing JSON

{
"title" : "IT Business Analyst Intern" ,
"organization" : "Medtronic" ,
"city" : "Brooklyn Park" ,
"state" : "MN" ,
"start_date" : "05/10" ,
"end_date" : "07/11" ,
"details" : [ "bla bla bla" , "drank some soda" , "hit manager in face with
pie"]
} After which you can use the
getters on the JSONArray to
get the desired data
Parsing JSON

How would you represent this data using XML?

{
"title" : "IT Business Analyst Intern" ,
"organization" : "Medtronic" ,
"city" : "Brooklyn Park" ,
"state" : "MN" ,
"start_date" : "05/10" ,
"end_date" : "07/11" ,
"details" : [ "bla bla bla" , "drank some soda" , "hit manager in face with pie"]
}

You might also like