android browser 的几个小feature (二) 左右晃动控制网页前进后退

#############################################

本文为极度寒冰原创,转载请注明出处
#############################################

这个灵感是来源于现在的各种摇一摇,我们也借助这种新式的玩法,来进行左右晃动来控制网页的前进后退。
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;
+/**
+ * ó?óú?ì2aê??úò???
+ */
+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);
+		}
+	}
+}


android browser 的几个小feature (二) 左右晃动控制网页前进后退

上一篇:Android保存用户名和密码


下一篇:android中导入数据