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

本文为极度寒冰原创,转载请注明出处 #############################################
这个灵感是来源于现在的各种摇一摇,我们也借助这种新式的玩法,来进行左右晃动来控制网页的前进后退。
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.javaindex 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.javanew file mode 100644index 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);+}+}+}


更多相关文章

  1. 代码中设置drawableleft
  2. android 3.0 隐藏 系统标题栏
  3. Android开发中activity切换动画的实现
  4. Android(安卓)学习 笔记_05. 文件下载
  5. Android中直播视频技术探究之—摄像头Camera视频源数据采集解析
  6. 技术博客汇总
  7. android 2.3 wifi (一)
  8. AndRoid Notification的清空和修改
  9. Android中的Chronometer

随机推荐

  1. Android 之 WallpaperManager用法
  2. EditText 键盘收回
  3. Android之国际化(在程序内部强制转换语言
  4. Ubuntu 64位编译 android 4.0源码
  5. Android 应用启动时去掉应用图标
  6. Android JNI打印信息
  7. Android 系统功能设置菜单 LinearLayout
  8. Android Studio 开启调试 时 提示:could n
  9. 自定义竖直Seekbar
  10. 沉浸式状态栏的实现