安卓摇一摇事件的实现
来源:互联网 发布:xtw100编程器 最新软件 编辑:程序博客网 时间:2024/05/02 08:47
安卓摇一摇这个功能在应用中很常见,比如说摇一摇搜索或摇一摇换壁纸等等等等。在安卓上是很容易实现的,原理就是监听手机自带的传感器,检测到手机加速等信号(摇一摇的信号)就进行处理。
下面两段代码分别是信号检测并处理的代码和一个接口类代码。
信号检测并处理:AccelerometerListener.java
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.widget.Toast; public class AccelerometerManager { private static Context aContext=null; /** Accuracy configuration */ private static float threshold = 15.0f; private static int interval = 100; private static Sensor sensor; private static SensorManager sensorManager; // you could use an OrientationListener array instead // if you plans to use more than one listener private static AccelerometerListener listener; /** indicates whether or not Accelerometer Sensor is supported */ private static Boolean supported; /** indicates whether or not Accelerometer Sensor is running */ private static boolean running = false; /** * Returns true if the manager is listening to orientation changes */ public static boolean isListening() { return running; } /** * Unregisters listeners */ public static void stopListening() { running = false; try { if (sensorManager != null && sensorEventListener != null) { sensorManager.unregisterListener(sensorEventListener); } } catch (Exception e) {} } /** * Returns true if at least one Accelerometer sensor is available */ public static boolean isSupported(Context context) { aContext = context; if (supported == null) { if (aContext != null) { sensorManager = (SensorManager) aContext. getSystemService(Context.SENSOR_SERVICE); // Get all sensors in device List<Sensor> sensors = sensorManager.getSensorList( Sensor.TYPE_ACCELEROMETER); supported = new Boolean(sensors.size() > 0); } else { supported = Boolean.FALSE; } } return supported; } /** * Configure the listener for shaking * @param threshold * minimum acceleration variation for considering shaking * @param interval * minimum interval between to shake events */ public static void configure(int threshold, int interval) { AccelerometerManager.threshold = threshold; AccelerometerManager.interval = interval; } /** * Registers a listener and start listening * @param accelerometerListener * callback for accelerometer events */ public static void startListening( AccelerometerListener accelerometerListener ) { sensorManager = (SensorManager) aContext. getSystemService(Context.SENSOR_SERVICE); // Take all sensors in device List<Sensor> sensors = sensorManager.getSensorList( Sensor.TYPE_ACCELEROMETER); if (sensors.size() > 0) { sensor = sensors.get(0); // Register Accelerometer Listener running = sensorManager.registerListener( sensorEventListener, sensor, SensorManager.SENSOR_DELAY_GAME); listener = accelerometerListener; } } /** * Configures threshold and interval * And registers a listener and start listening * @param accelerometerListener * callback for accelerometer events * @param threshold * minimum acceleration variation for considering shaking * @param interval * minimum interval between to shake events */ public static void startListening( AccelerometerListener accelerometerListener, int threshold, int interval) { configure(threshold, interval); startListening(accelerometerListener); } /** * The listener that listen to events from the accelerometer listener */ private static SensorEventListener sensorEventListener = new SensorEventListener() { private long now = 0; private long timeDiff = 0; private long lastUpdate = 0; private long lastShake = 0; private float x = 0; private float y = 0; private float z = 0; private float lastX = 0; private float lastY = 0; private float lastZ = 0; private float force = 0; public void onAccuracyChanged(Sensor sensor, int accuracy) {} public void onSensorChanged(SensorEvent event) { // use the event timestamp as reference // so the manager precision won't depends // on the AccelerometerListener implementation // processing time now = event.timestamp; x = event.values[0]; y = event.values[1]; z = event.values[2]; // if not interesting in shake events // just remove the whole if then else block if (lastUpdate == 0) { lastUpdate = now; lastShake = now; lastX = x; lastY = y; lastZ = z; Toast.makeText(aContext,"No Motion detected", Toast.LENGTH_SHORT).show(); } else { timeDiff = now - lastUpdate; if (timeDiff > 0) { /*force = Math.abs(x + y + z - lastX - lastY - lastZ) / timeDiff;*/ force = Math.abs(x + y + z - lastX - lastY - lastZ); if (Float.compare(force, threshold) >0 ) { Toast.makeText(Accelerometer.getContext(), (now-lastShake)+" >= "+interval, 1000).show(); if (now - lastShake >= interval) { // trigger shake event listener.onShake(force); } else { Toast.makeText(aContext,"No Motion detected", Toast.LENGTH_SHORT).show(); } lastShake = now; } lastX = x; lastY = y; lastZ = z; lastUpdate = now; } else { Toast.makeText(aContext,"No Motion detected", Toast.LENGTH_SHORT).show(); } } // trigger change event listener.onAccelerationChanged(x, y, z); } }; }
接口类:AccelerometerListener.java
public interface AccelerometerListener {public void onAccelerationChanged(float x, float y, float z); public void onShake(float force);}
接下来就是你的Activity代码了,在你代码中只要extends AccelerometerListener,然后完成onAccelerationChanged和onShake两个函数即可,在onShake函数中完成你想要的得到摇一摇信号后要处理的操作。示例代码如下:
import android.app.Activity; import android.app.AlertDialog; import android.content.Intent; import android.hardware.SensorListener; import android.view.MotionEvent; import android.view.View; import android.widget.Toast;public class ShowAndShare extends Activity implements AccelerometerListener{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_show); findviewbyid(); init(); } public void init() { } public void findviewbyid() { } @Override public void onAccelerationChanged(float x, float y, float z) { // TODO Auto-generated method stub } @Override public void onShake(float force) { // TODO Auto-generated method stub Toast.makeText(getBaseContext(), "Motion detected", Toast.LENGTH_SHORT).show(); //在这里做你想做的事情 } @Override public void onResume() { super.onResume(); Toast.makeText(getBaseContext(), "onResume Accelerometer Started", Toast.LENGTH_SHORT).show(); //Check device supported Accelerometer senssor or not if (AccelerometerManager.isSupported(this)) { //Start Accelerometer Listening AccelerometerManager.startListening(this); } } @Override public void onStop() { super.onStop(); //Check device supported Accelerometer senssor or not if (AccelerometerManager.isListening()) { //Start Accelerometer Listening AccelerometerManager.stopListening(); Toast.makeText(getBaseContext(), "onStop Accelerometer Stoped", Toast.LENGTH_SHORT).show(); } } @Override public void onDestroy() { super.onDestroy(); //Check device supported Accelerometer senssor or not if (AccelerometerManager.isListening()) { //Start Accelerometer Listening AccelerometerManager.stopListening(); Toast.makeText(getBaseContext(), "onDestroy Accelerometer Stoped", Toast.LENGTH_SHORT).show(); } }}
0 0
- 安卓摇一摇事件的实现
- C++事件的实现
- 事件的实现过程
- 事件接收器的实现
- C#事件的实现
- 事件委托的实现
- 事件和包含事件的接口实现
- input事件--->按键事件的基本实现
- 用户控件的事件实现
- DataGrid 双击事件的实现
- JList 双击事件的实现
- java_事件监听器的实现
- Qt自定义事件的实现
- Qt自定义事件的实现
- Qt自定义事件的实现 .
- Qt自定义事件的实现
- Qt自定义事件的实现
- zkclient的事件驱动实现
- Hduoj5122【数学】
- 部分动画
- android五大布局
- 配置安装eclipse和php、python等插件
- Eclipse 导入已有工程出现一堆编译错误
- 安卓摇一摇事件的实现
- codevs1098 均分纸牌(贪心)
- 【C#】C#访问和操作MYSQL数据库
- 第十四周项目 3 多科成绩单(3)增加同学名字
- C++学习之路上的错误
- 51单片机中断处理函数能否影响全局变量
- 见微知著,以小“控”大的三极管(三)
- hibernate回滚
- java 追加文件