android browser 的几个小feature (二) 左右晃动控制网页前进后退
16lz
2021-01-23
#############################################
本文为极度寒冰原创,转载请注明出处 #############################################这个灵感是来源于现在的各种摇一摇,我们也借助这种新式的玩法,来进行左右晃动来控制网页的前进后退。
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);+}+}+}
更多相关文章
- 代码中设置drawableleft
- android 3.0 隐藏 系统标题栏
- Android开发中activity切换动画的实现
- Android(安卓)学习 笔记_05. 文件下载
- Android中直播视频技术探究之—摄像头Camera视频源数据采集解析
- 技术博客汇总
- android 2.3 wifi (一)
- AndRoid Notification的清空和修改
- Android中的Chronometer