android 实现摇一摇功能

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

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

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

二、实现代码

[java] view
plain
copy

  1. package com.xs.test;
  2. import android.app.Activity;
  3. import android.hardware.Sensor;
  4. import android.hardware.SensorEvent;
  5. import android.hardware.SensorEventListener;
  6. import android.hardware.SensorManager;
  7. import android.os.Bundle;
  8. import android.os.Handler;
  9. import android.os.Message;
  10. import android.os.Vibrator;
  11. import android.util.Log;
  12. import android.widget.Toast;
  13. /**
  14. * 安卓晃动手机监听--“摇一摇”
  15. *
  16. * @author 单红宇
  17. *
  18. */
  19. public class TestSensorActivity extends Activity {
  20. private SensorManager sensorManager;
  21. private Vibrator vibrator;
  22. private static final String TAG = "TestSensorActivity";
  23. private static final int SENSOR_SHAKE = 10;
  24. /** Called when the activity is first created. */
  25. @Override
  26. public void onCreate(Bundle savedInstanceState) {
  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. protected void onResume() {
  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. protected void onPause() {
  42. super.onPause();
  43. if (sensorManager != null) {// 取消监听器
  44. sensorManager.unregisterListener(sensorEventListener);
  45. }
  46. }
  47. /**
  48. * 重力感应监听
  49. */
  50. private SensorEventListener sensorEventListener = new SensorEventListener() {
  51. @Override
  52. public void onSensorChanged(SensorEvent event) {
  53. // 传感器信息改变时执行该方法
  54. float[] values = event.values;
  55. float x = values[0]; // x轴方向的重力加速度,向右为正
  56. float y = values[1]; // y轴方向的重力加速度,向前为正
  57. float z = values[2]; // z轴方向的重力加速度,向上为正
  58. Log.i(TAG, "x轴方向的重力加速度" + x +  ";y轴方向的重力加速度" + y +  ";z轴方向的重力加速度" + z);
  59. // 一般在这三个方向的重力加速度达到40就达到了摇晃手机的状态。
  60. int medumValue = 19;// 三星 i9250怎么晃都不会超过20,没办法,只设置19了
  61. if (Math.abs(x) > medumValue || Math.abs(y) > medumValue || Math.abs(z) > medumValue) {
  62. vibrator.vibrate(200);
  63. Message msg = new Message();
  64. msg.what = SENSOR_SHAKE;
  65. handler.sendMessage(msg);
  66. }
  67. }
  68. @Override
  69. public void onAccuracyChanged(Sensor sensor, int accuracy) {
  70. }
  71. };
  72. /**
  73. * 动作执行
  74. */
  75. Handler handler = new Handler() {
  76. @Override
  77. public void handleMessage(Message msg) {
  78. super.handleMessage(msg);
  79. switch (msg.what) {
  80. case SENSOR_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) {

    }

    };

    }

时间: 2024-10-11 10:34:25

android 实现摇一摇功能的相关文章

Android加速度传感器的使用:摇一摇功能的实现

一.原理介绍: Android手机中摇一摇的功能已经很常见了,最近接触到了这个功能,原理很简单:使用加速度传感器,在晃动手机时,监听加速度在各个方向的变化,当加速度值超过设定的灵敏度时,则触发摇一摇功能. 二.使用到的类: SensorManager SensorEventListener 三.功能实现: 1.摇一摇功能:我将摇一摇功能封装成了一个类ShakeUtils,在使用时按照注释中的说明使用即可,ShakeUtils.java如下(差的包请CTRL+SHIFT+O导入): /** * 摇

Android 使用加速度传感器实现摇一摇功能及优化

如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456 目前很多应用已经实现了摇一摇功能,这里通过讲解该功能的原理及实现回顾一下加速度传感器的使用: 1.首先获得传感器管理器的实例 sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); 2.通过传感器管理器获得加速传感器 accelerateSensor = getSensorManager(cont

Android 微信摇一摇功能实现

开发之前 今天学习了一下传感器, 脑子里就蹦出了微信的摇一摇, 于是鼓了鼓勇气抽空写了出来, 本人菜鸟一枚, 希望大神们多多指点 开发环境 Android Studio 2.2.1 JDK1.7 API 24 Gradle 2.2.1 相关知识点 加速度传感器 补间动画 手机震动 (Vibrator) 较短 声音/音效 的播放 (SoundPool) 开始开发 案例预览 案例分析 我们接下来分析一下这个案例, 当用户晃动手机时, 会触发加速传感器, 此时加速传感器会调用相应接口供我们使用, 此时

Android摇一摇功能的实现

Android利用传感器实现类似摇一摇功能 1.基本原理 摇一摇功能基本原理是利用手机加速度传感器,当加速度到达某个值时,触发某个事件,如UI改变,手机震动,播放声音,获取数据等事件. 2.传感器原理和使用 传感器原理和使用,可以参见上一篇博客,Android中传感器Sensor的使用 3.声音事件 获取对象MediaPlay类  mediaPlayer=MediaPlayer.create(getApplicationContext(), R.raw.music); 事件触发:mediaPla

android传感器;摇一摇抽签功能

package com.kane.sensortest; import java.util.Random; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.ap

Android实现摇一摇功能

做过一个小项目,其中实现了摇一摇功能和刮一刮功能还有播放背景音乐等 摇一摇功能主要用到加速度传感器:Sensor.TYPE_ACCELEROMETER 摇一摇功能主要是监听手机加速度变化,当超过设定的某一值时,即触发事件. /** * FileName: MainActivity.java * @desc 该类是用于显示摇一摇界面 * @author HTP * @Date 20140311 * @version 1.00 */ public class MainActivity extends

Android仿iPhone晃动撤销输入功能(微信摇一摇功能)

重力传感器微信摇一摇SensorMannager自定义alertdialogSensorEventListener 很多程序中我们可能会输入长文本内容,比如短信,写便笺等,如果想一次性撤销所有的键入内容,很多手机需要一直按住退格键逐字逐句的删除,稍稍麻烦,不过 在iPhone上,有个人性化的功能,当我们想要去撤销刚刚输入的所有内容的时候,可以轻轻晃动手机,会弹出提示框,点击确定就可以清空内容,如下图: 在 android中,一般手机貌似没有定制这个功能,不过我们可以自己去实现这样的功能,放置在我

Android 摇一摇之双甩功能

最近做一个摇一摇的功能 网上相关代码很多 但是这次的需求有点奇葩 要求是摇两次才生效 看起来好像很简单 但真正要做遇到的问题还是很多 时间限制 机型灵敏性 摇动的方式 弄了一周多 做出的效果算一般吧 原理介绍 其实就是加速度传感器的使用 开发传感器应用的步骤如下 1 调用Context的getSystemService(Context.SENSOR_SERVICE)方法获取 SensorManager对象 SensorManager代表系统的传感器管理服务2 调用SensorManager的ge

Android实战简易教程-第三十一枪(基于加速度传感器的摇一摇功能实例)

下面我们来看一下微信摇一摇功能的模拟实现,我们是基于手机加速度传感器实现该功能,实现方法比较简单. MainActivity.java: MainActivity.java: package com.location.activity; import android.app.Activity; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; i