这个灵感是来源于现在的各种摇一摇,我们也借助这种新式的玩法,来进行左右晃动来控制网页的前进后退。
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 00aac08..fff0c50 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -97,6 +97,7 @@ import com.android.browser.provider.BrowserProvider2.Thumbnails;
import com.android.browser.provider.SnapshotProvider.Snapshots;
import com.android.browser.mynavigation.AddMyNavigationPage;
import com.android.browser.mynavigation.MyNavigationUtil;
+import com.android.browser.ShakeDetector.OnShakeListener;
import java.io.ByteArrayOutputStream;
import java.io.File;
@@ -113,6 +114,13 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
+import android.os.Bundle;
+import android.app.Activity;
+import android.util.Log;
+import android.view.Menu;
+import android.widget.TextView;
+
+
/**
* Controller for browser
*/
@@ -239,7 +247,8 @@ public class Controller
private CrashRecoveryHandler mCrashRecoveryHandler;
private boolean mBlockEvents;
-
+ private ShakeDetector mDetector;
+ private OnShakeListener mListener = null;
private String mVoiceResult;
private boolean mUpdateMyNavThumbnail;
private String mUpdateMyNavThumbnailUrl;
@@ -276,7 +285,7 @@ public class Controller
mSystemAllowGeolocationOrigins =
new SystemAllowGeolocationOrigins(mActivity.getApplicationContext());
mSystemAllowGeolocationOrigins.start();
-
+ mDetector = new ShakeDetector(mActivity.getApplicationContext());
openIconDatabase();
}
@@ -705,6 +714,9 @@ public class Controller
sThumbnailBitmap.recycle();
sThumbnailBitmap = null;
}
+
+ mDetector.unregisterOnShakeListener(mListener);
+ mDetector.stop();
}
@Override
@@ -755,6 +767,21 @@ public class Controller
mUi.onVoiceResult(mVoiceResult);
mVoiceResult = null;
}
+ mDetector.start();
+ mListener = new OnShakeListener() {
+ @Override
+ public void onShake(int direction) {
+ // TODO Auto-generated method stub
+ if(direction == -1) {
+ Log.e("chao","Direction = go Forward");
+ getCurrentTab().goForward();
+ }else {
+ Log.e("chao","Direction = go back");
+ getCurrentTab().goBack();
+ }
+ }
+ };
+ mDetector.registerOnShakeListener(mListener);
}
private void releaseWakeLock() {
diff --git a/src/com/android/browser/ShakeDetector.java b/src/com/android/browser/ShakeDetector.java
new file mode 100644
index 0000000..fbafa2e
--- /dev/null
+++ b/src/com/android/browser/ShakeDetector.java
@@ -0,0 +1,101 @@
+package com.android.browser;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import android.content.Context;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+import android.util.FloatMath;
+import android.util.Log;
+/**
+ * ÓÃÓÚŒì²âÊÖ»úÒ¡»Î
+ */
+public class ShakeDetector implements SensorEventListener {
+ static final int UPDATE_INTERVAL = 10;//original is 100,which will gather less data
+ long mLastUpdateTime;
+ float mLastX, mLastY, mLastZ;
+ final float alpha = 0.8f;
+ float gravity[] = new float[3];
+ Context mContext;
+ SensorManager mSensorManager;
+ ArrayList<OnShakeListener> mListeners;
+ ArrayList list = new ArrayList();
+ public int shakeThreshold = 5000;
+ public ShakeDetector(Context context) {
+ mContext = context;
+ mSensorManager = (SensorManager) context
+ .getSystemService(Context.SENSOR_SERVICE);
+ mListeners = new ArrayList<OnShakeListener>();
+ }
+ public interface OnShakeListener {
+ void onShake(int direction);
+ }
+ public void registerOnShakeListener(OnShakeListener listener) {
+ if (mListeners.contains(listener))
+ return;
+ mListeners.add(listener);
+ }
+ public void unregisterOnShakeListener(OnShakeListener listener) {
+ mListeners.remove(listener);
+ }
+ public void start() {
+ if (mSensorManager == null) {
+ throw new UnsupportedOperationException();
+ }
+ Sensor sensor = mSensorManager
+ .getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
+ if (sensor == null) {
+ throw new UnsupportedOperationException();
+ }
+ boolean success = mSensorManager.registerListener(this, sensor,
+ SensorManager.SENSOR_DELAY_GAME);
+ if (!success) {
+ throw new UnsupportedOperationException();
+ }
+ }
+ public void stop() {
+ if (mSensorManager != null)
+ mSensorManager.unregisterListener(this);
+ }
+ @Override
+ public void onAccuracyChanged(Sensor sensor, int accuracy) {
+ // TODO Auto-generated method stub
+ }
+ @Override
+ public void onSensorChanged(SensorEvent event) {
+ long currentTime = System.currentTimeMillis();
+ long diffTime = currentTime - mLastUpdateTime;
+ if (diffTime < UPDATE_INTERVAL)
+ return;
+ mLastUpdateTime = currentTime;
+ float x = event.values[0];
+ float y = event.values[1];
+ float z = event.values[2];
+ gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
+ gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
+ gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];
+ float deltaX = x - gravity[0];
+ float deltaY = y - gravity[1];
+ float deltaZ = z - gravity[2];
+ float delta = FloatMath.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ
+ * deltaZ) / diffTime * 10000;
+ if(Math.abs(deltaX) > 8 /*|| Math.abs(deltaY) > 8 || Math.abs(deltaZ) > 8*/) {//deltaZ is 7.8 when hold steady
+ Log.d("chao","deltaX = " + deltaX + ", deltaY = " + deltaY + ", deltaZ = " + deltaZ);
+ list.add(deltaX);
+ if(deltaX > 8) {
+ this.notifyListeners(-1);
+ }else if (deltaX < -8){
+ this.notifyListeners(1);
+ }
+ }
+ }
+ private void notifyListeners(int direction) {
+ for (OnShakeListener listener : mListeners) {
+ listener.onShake(direction);
+ }
+ }
+}