summaryrefslogtreecommitdiffstats
path: root/Android/07-Graphics/GraphicsLab
diff options
context:
space:
mode:
authorJérémy Zurcher <jeremy@asynk.ch>2014-03-16 18:16:39 +0100
committerJérémy Zurcher <jeremy@asynk.ch>2016-11-10 17:40:55 +0100
commit73a946cebcb55619758fd9c0dddb31ff63c8498b (patch)
tree054118c0d423ca3a5bcfc78bdc0286618d036f27 /Android/07-Graphics/GraphicsLab
parentd8c875ed2a82ce24c96101845a5f5fafb27ed5cc (diff)
downloadcoursera-android.zip
coursera-android.tar.gz
Android : 07-Graphics: implementandroid
Diffstat (limited to 'Android/07-Graphics/GraphicsLab')
-rw-r--r--Android/07-Graphics/GraphicsLab/src/course/labs/GraphicsLab/BubbleActivity.java117
1 files changed, 75 insertions, 42 deletions
diff --git a/Android/07-Graphics/GraphicsLab/src/course/labs/GraphicsLab/BubbleActivity.java b/Android/07-Graphics/GraphicsLab/src/course/labs/GraphicsLab/BubbleActivity.java
index fed77d7..e93eba3 100644
--- a/Android/07-Graphics/GraphicsLab/src/course/labs/GraphicsLab/BubbleActivity.java
+++ b/Android/07-Graphics/GraphicsLab/src/course/labs/GraphicsLab/BubbleActivity.java
@@ -14,6 +14,7 @@ import android.graphics.Canvas;
import android.graphics.Paint;
import android.media.AudioManager;
import android.media.SoundPool;
+import android.media.SoundPool.OnLoadCompleteListener;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
@@ -83,12 +84,20 @@ public class BubbleActivity extends Activity {
mStreamVolume = (float) mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC) / mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
- // TODO - make a new SoundPool, allowing up to 10 streams
- mSoundPool = null;
+ mSoundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
- // TODO - set a SoundPool OnLoadCompletedListener that calls setupGestureDetector()
- // TODO - load the sound from res/raw/bubble_pop.wav
- mSoundID = 0;
+ mSoundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
+ @Override
+ public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
+ if (0 == status) {
+ setupGestureDetector();
+ }
+ }
+ });
+
+ mSoundID = mSoundPool.load(this, R.raw.bubble_pop, 1);
+ mAudioManager.setSpeakerphoneOn(true);
+ mAudioManager.loadSoundEffects();
}
@Override
@@ -125,23 +134,44 @@ public class BubbleActivity extends Activity {
// it to mFrame. You can get all views from mFrame with ViewGroup.getChildAt()
@Override
public boolean onSingleTapConfirmed(MotionEvent event) {
- // TODO - Implement onSingleTapConfirmed actions.
- // You can get all Views in mFrame using the
- // ViewGroup.getChildCount() method
- return false;
+ int pointerIndex = event.getActionIndex();
+ int pointerID = event.getPointerId(pointerIndex);
+
+ float x = event.getX(pointerID);
+ float y = event.getY(pointerID);
+
+ int numberChilds = mFrame.getChildCount();
+ for (int i = 0; i < numberChilds; i++) {
+ final BubbleView bubble = (BubbleView) mFrame.getChildAt(i);
+
+ if (bubble.intersects(x, y)) {
+ bubble.stop(true);
+ return true;
+ }
+ }
+
+ BubbleView child = new BubbleView(getApplicationContext(), x, y);
+ mFrame.addView(child);
+ child.start();
+ return true;
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event) {
- // TODO - delegate the touch to the gestureDetector
- return false;
+ return mGestureDetector.onTouchEvent(event);
}
@Override
protected void onPause() {
- // TODO - Release all SoundPool resources
+ if (mSoundPool != null) {
+ mSoundPool.unload(mSoundID);
+ mSoundPool.release();
+ mSoundPool = null;
+ }
+ mAudioManager.setSpeakerphoneOn(false);
+ mAudioManager.unloadSoundEffects();
super.onPause();
}
@@ -187,8 +217,7 @@ public class BubbleActivity extends Activity {
private void setRotation(Random r) {
if (speedMode == RANDOM) {
- // TODO - set rotation in range [1..3]
- mDRotate = 0;
+ mDRotate = (r.nextInt(3) + 1);
} else {
mDRotate = 0;
}
@@ -209,9 +238,8 @@ public class BubbleActivity extends Activity {
mDy = 0;
break;
default:
- // TODO - Set movement direction and speed
- // Limit movement speed in the x and y
- // direction to [-3..3].
+ mDx = r.nextInt(7) - 3;
+ mDy = r.nextInt(7) - 3;
}
}
@@ -219,11 +247,9 @@ public class BubbleActivity extends Activity {
if (speedMode != RANDOM) {
mScaledBitmapWidth = BITMAP_SIZE * 3;
} else {
- //TODO - set scaled bitmap size in range [1..3] * BITMAP_SIZE
- mScaledBitmapWidth = 0;
+ mScaledBitmapWidth = (r.nextInt(3) + 1) * BITMAP_SIZE;
}
- // TODO - create the scaled bitmap using size set above
- mScaledBitmap = null;
+ mScaledBitmap = Bitmap.createScaledBitmap(mBitmap, mScaledBitmapWidth, mScaledBitmapWidth, false);
}
// Start moving the BubbleView & updating the display
@@ -238,17 +264,22 @@ public class BubbleActivity extends Activity {
mMoverFuture = executor.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
- // TODO - implement movement logic.
- // Each time this method is run the BubbleView should
- // move one step. If the BubbleView exits the display,
- // stop the BubbleView's Worker Thread.
- // Otherwise, request that the BubbleView be redrawn.
+ boolean outOfView = moveWhileOnScreen();
+ if (outOfView) {
+ stop(false);
+ } else {
+ postInvalidate();
+ }
}
}, 0, REFRESH_RATE, TimeUnit.MILLISECONDS);
}
private synchronized boolean intersects(float x, float y) {
- // TODO - Return true if the BubbleView intersects position (x,y)
+ if (mXPos <= x && x <= mXPos + mScaledBitmapWidth) {
+ if (mYPos <= y && y <= mYPos + mScaledBitmapWidth) {
+ return true;
+ }
+ }
return false;
}
@@ -261,11 +292,10 @@ public class BubbleActivity extends Activity {
mFrame.post(new Runnable() {
@Override
public void run() {
- // TODO - Remove the BubbleView from mFrame
+ mFrame.removeView(BubbleView.this);
if (popped) {
log("Pop!");
- // TODO - If the bubble was popped by user,
- // play the popping sound
+ mSoundPool.play(mSoundID, mStreamVolume, mStreamVolume, 1, 0, 1f);
}
log("Bubble removed from view!");
}
@@ -276,31 +306,34 @@ public class BubbleActivity extends Activity {
// Change the Bubble's speed and direction
private synchronized void deflect(float velocityX, float velocityY) {
log("velocity X:" + velocityX + " velocity Y:" + velocityY);
- //TODO - set mDx and mDy to be the new velocities divided by the REFRESH_RATE
- mDx = 0;
- mDy = 0;
+ mDx = velocityX / (REFRESH_RATE * 10);
+ mDy = velocityY / (REFRESH_RATE * 10);
}
// Draw the Bubble at its current location
@Override
protected synchronized void onDraw(Canvas canvas) {
- // TODO - save the canvas
- // TODO - increase the rotation of the original image by mDRotate
- // TODO Rotate the canvas by current rotation
- // TODO - draw the bitmap at it's new location
- // TODO - restore the canvas
+ canvas.save();
+ mRotate = mRotate + mDRotate;
+ canvas.rotate(mRotate, mXPos + mScaledBitmapWidth / 2, mYPos + mScaledBitmapWidth / 2);
+ canvas.drawBitmap(mScaledBitmap, this.mXPos, this.mYPos, null);
+ canvas.restore();
}
private synchronized boolean moveWhileOnScreen() {
- // TODO - Move the BubbleView
- // Returns true if the BubbleView has exited the screen
- return false;
+ this.mXPos = mXPos + mDx;
+ this.mYPos = mYPos + mDy;
+ return isOutOfView();
}
private boolean isOutOfView() {
- // TODO - Return true if the BubbleView has exited the screen
+ if (mXPos + mDisplayWidth < 0 || mYPos + mDisplayHeight < 0)
+ return true;
+ if (mXPos > mDisplayWidth || mYPos > mDisplayHeight)
+ return true;
+
return false;
}
}