实现“摇一摇”功能,其实很简单,就是检测手机的重力感应,具体实现代码如下:

一、在 AndroidManifest.xml 中添加操作权限

<uses-permission android:name="android.permission.VIBRATE"/>

二、实现代码

[java] view plain copy
  1. packagecom.xs.test;
  2. importandroid.app.Activity;
  3. importandroid.hardware.Sensor;
  4. importandroid.hardware.SensorEvent;
  5. importandroid.hardware.SensorEventListener;
  6. importandroid.hardware.SensorManager;
  7. importandroid.os.Bundle;
  8. importandroid.os.Handler;
  9. importandroid.os.Message;
  10. importandroid.os.Vibrator;
  11. importandroid.util.Log;
  12. importandroid.widget.Toast;
  13. /**
  14. *安卓晃动手机监听--“摇一摇”
  15. *
  16. *@author单红宇
  17. *
  18. */
  19. publicclassTestSensorActivityextendsActivity{
  20. privateSensorManagersensorManager;
  21. privateVibratorvibrator;
  22. privatestaticfinalStringTAG="TestSensorActivity";
  23. privatestaticfinalintSENSOR_SHAKE=10;
  24. /**Calledwhentheactivityisfirstcreated.*/
  25. @Override
  26. publicvoidonCreate(BundlesavedInstanceState){
  27. super.onCreate(savedInstanceState);
  28. setContentView(R.layout.main);
  29. sensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);
  30. vibrator=(Vibrator)getSystemService(VIBRATOR_SERVICE);
  31. }
  32. @Override
  33. protectedvoidonResume(){
  34. super.onResume();
  35. if(sensorManager!=null){//注册监听器
  36. sensorManager.registerListener(sensorEventListener,sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL);
  37. //第一个参数是Listener,第二个参数是所得传感器类型,第三个参数值获取传感器信息的频率
  38. }
  39. }
  40. @Override
  41. protectedvoidonPause(){
  42. super.onPause();
  43. if(sensorManager!=null){//取消监听器
  44. sensorManager.unregisterListener(sensorEventListener);
  45. }
  46. }
  47. /**
  48. *重力感应监听
  49. */
  50. privateSensorEventListenersensorEventListener=newSensorEventListener(){
  51. @Override
  52. publicvoidonSensorChanged(SensorEventevent){
  53. //传感器信息改变时执行该方法
  54. float[]values=event.values;
  55. floatx=values[0];//x轴方向的重力加速度,向右为正
  56. floaty=values[1];//y轴方向的重力加速度,向前为正
  57. floatz=values[2];//z轴方向的重力加速度,向上为正
  58. Log.i(TAG,"x轴方向的重力加速度"+x+";y轴方向的重力加速度"+y+";z轴方向的重力加速度"+z);
  59. //一般在这三个方向的重力加速度达到40就达到了摇晃手机的状态。
  60. intmedumValue=19;//三星i9250怎么晃都不会超过20,没办法,只设置19了
  61. if(Math.abs(x)>medumValue||Math.abs(y)>medumValue||Math.abs(z)>medumValue){
  62. vibrator.vibrate(200);
  63. Messagemsg=newMessage();
  64. msg.what=SENSOR_SHAKE;
  65. handler.sendMessage(msg);
  66. }
  67. }
  68. @Override
  69. publicvoidonAccuracyChanged(Sensorsensor,intaccuracy){
  70. }
  71. };
  72. /**
  73. *动作执行
  74. */
  75. Handlerhandler=newHandler(){
  76. @Override
  77. publicvoidhandleMessage(Messagemsg){
  78. super.handleMessage(msg);
  79. switch(msg.what){
  80. caseSENSOR_SHAKE:
  81. Toast.makeText(TestSensorActivity.this,"检测到摇晃,执行操作!",Toast.LENGTH_SHORT).show();
  82. Log.i(TAG,"检测到摇晃,执行操作!");
  83. break;
  84. }
  85. }
  86. };
  87. }
  88. 这种摇一摇比较普通,没有经过算法的加强,重力加速度就是10。
  89. 算法优化如下
  90. package com.example.url;


    import java.io.IOException;
    import java.net.URL;


    import com.hahashijie.imageload.ImageLoader;


    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.drawable.Drawable;
    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorEventListener;
    import android.hardware.SensorManager;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.os.Vibrator;
    import android.util.Log;
    import android.widget.ImageView;


    @SuppressLint("HandlerLeak")
    public class MainActivity extends Activity {


    private ImageView image;
    private SensorManager sensorManager;
    private Sensor sensor;
    private Vibrator vibrator;
    private static final int UPTATE_INTERVAL_TIME = 50;
    private static final int SPEED_SHRESHOLD = 30;//这个值调节灵敏度
    private long lastUpdateTime;
    private float lastX;
    private float lastY;
    private float lastZ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
    image = (ImageView) findViewById(R.id.image);


    }


    @Override
    protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    if (sensorManager != null) {
    sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    }
    if (sensor != null) {
    sensorManager.registerListener(sensorEventListener,
    sensor,
    SensorManager.SENSOR_DELAY_GAME);//这里选择感应频率
    }
    }


    /**
    * 重力感应监听
    */
    private SensorEventListener sensorEventListener = new SensorEventListener() {


    @Override
    public void onSensorChanged(SensorEvent event) {
    long currentUpdateTime = System.currentTimeMillis();
    long timeInterval = currentUpdateTime - lastUpdateTime;
    if (timeInterval < UPTATE_INTERVAL_TIME) {
    return;
    }
    lastUpdateTime = currentUpdateTime;
    // 传感器信息改变时执行该方法
    float[] values = event.values;
    float x = values[0]; // x轴方向的重力加速度,向右为正
    float y = values[1]; // y轴方向的重力加速度,向前为正
    float z = values[2]; // z轴方向的重力加速度,向上为正
    float deltaX = x - lastX;
    float deltaY = y - lastY;
    float deltaZ = z - lastZ;


    lastX = x;
    lastY = y;
    lastZ = z;
    double speed = (Math.sqrt(deltaX * deltaX + deltaY * deltaY
    + deltaZ * deltaZ) / timeInterval) * 100;
    if (speed >= SPEED_SHRESHOLD) {
    vibrator.vibrate(300);
    image.setImageResource(R.drawable.running01);
    }
    }


    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
    };

    }

更多相关文章

  1. Android(安卓)强制设置横屏或竖屏 设置全屏
  2. Android(安卓)BitTube 学习
  3. android加速度感应
  4. Android视频方向为什么出现问题以及Android视频应用开发中的处理
  5. Android学习07-----事件处理(1)单击事件_改变屏幕方向和密码明文
  6. Android(安卓)判断imageview角度并旋转
  7. Android(安卓)APP旋转屏幕
  8. ConstraintLayout 实现水平方向 权重 效果
  9. Android实现监听屏幕旋转

随机推荐

  1. 使用新版Android(安卓)Studio检测内存泄
  2. Android-GridView的使用
  3. Android中使用WakeLock保证后台操作的顺
  4. android sdk introduction
  5. 第100章、WebView应用之Javascript调用An
  6. Android禁止截屏
  7. android文本限制输入行数,多余部分显示省
  8. android studio添加忽略文件
  9. Android ImageView图片自适应大小
  10. Android的线程Handler实现