zoukankan      html  css  js  c++  java
  • 安卓开发--摇一摇

    以前做的一个小应用里面有摇一摇功能,有必要写下来做个笔记。

    摇一摇功能主要用到加速度传感器Sensor.TYPE_ACCELEROMETER

    摇一摇功能主要是监听手机加速度变化,当超过设定的某一值时,即触发事件。

    一、简单的一个示例

    下给出一段简单的实现代码:

    功能:原先textview1显示为“初始文本”, 当摇晃之后,textview1变为”摇一摇成功!!!“并伴随震动(点击按钮可回到”初始文本“)。

    [java] view plain copy
    1. public class SensorTestActivity extends Activity implements SensorEventListener  
    2. {  
    3.     TextView tv = null;  
    4.     Button button = null;  
    5.     SensorManager sensorManager = null;  
    6.     Vibrator vibrator = null;  
    7.   
    8.     @Override  
    9.     public void onCreate(Bundle savedInstanceState)  
    10.     {  
    11.         super.onCreate(savedInstanceState);  
    12.         setContentView(R.layout.main);  
    13.   
    14.         button = (Button) findViewById(R.id.button1);  
    15.         tv = (TextView) findViewById(R.id.textview1);  
    16.         button.setOnClickListener(new View.OnClickListener()  
    17.         {  
    18.   
    19.             @Override  
    20.             public void onClick(View v)  
    21.             {  
    22.                 tv.setText("初始文本");  
    23.             }  
    24.         });  
    25.   
    26.         sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);  
    27.         vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);  
    28.   
    29.     }  
    30.   
    31.     @Override  
    32.     protected void onPause()  
    33.     {  
    34.         super.onPause();  
    35.         sensorManager.unregisterListener(this);  
    36.     }  
    37.   
    38.     @Override  
    39.     protected void onResume()  
    40.     {  
    41.         super.onResume();  
    42.         sensorManager.registerListener(this,  
    43.                 sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),  
    44.                 SensorManager.SENSOR_DELAY_NORMAL);  
    45.     }  
    46.   
    47.     @Override  
    48.     public void onAccuracyChanged(Sensor sensor, int accuracy)  
    49.     {  
    50.         //当传感器精度改变时回调该方法,Do nothing.  
    51.     }  
    52.   
    53.     @Override  
    54.     public void onSensorChanged(SensorEvent event)  
    55.     {  
    56.   
    57.         int sensorType = event.sensor.getType();  
    58.         //values[0]:X轴,values[1]:Y轴,values[2]:Z轴  
    59.         float[] values = event.values;  
    60.         if (sensorType == Sensor.TYPE_ACCELEROMETER)  
    61.         {  
    62.             if ((Math.abs(values[0]) > 17 || Math.abs(values[1]) > 17 || Math  
    63.                     .abs(values[2]) > 17))  
    64.             {  
    65.                 Log.d("sensor x ", "============ values[0] = " + values[0]);  
    66.                 Log.d("sensor y ", "============ values[1] = " + values[1]);  
    67.                 Log.d("sensor z ", "============ values[2] = " + values[2]);  
    68.                 tv.setText("摇一摇成功!!!");  
    69.                 //摇动手机后,再伴随震动提示~~  
    70.                 vibrator.vibrate(500);  
    71.             }  
    72.   
    73.         }  
    74.     }  
    75.   
    76. }  


    二、更加灵活一点的写法

    可以将监听部分与注册部分分开,这样的好处就是实现监听的代码复用。

    以下贴几段以前的几段代码。

    1. 监听部分

    [java] view plain copy
    1. public class ShakeListenerUtils implements SensorEventListener  
    2. {  
    3.     private Activity context;  
    4.   
    5.     public ShakeListenerUtils(Activity context)  
    6.     {  
    7.         super();  
    8.         this.context = context;  
    9.     }  
    10.   
    11.     @Override  
    12.     public void onSensorChanged(SensorEvent event)  
    13.     {  
    14.         int sensorType = event.sensor.getType();  
    15.         //values[0]:X轴,values[1]:Y轴,values[2]:Z轴    
    16.         float[] values = event.values;  
    17.   
    18.         if (sensorType == Sensor.TYPE_ACCELEROMETER)  
    19.         {  
    20.   
    21.             /*正常情况下,任意轴数值最大就在9.8~10之间,只有在突然摇动手机  
    22.               的时候,瞬时加速度才会突然增大或减少。   监听任一轴的加速度大于17即可 
    23.             */  
    24.             if ((Math.abs(values[0]) > 17 || Math.abs(values[1]) > 17 || Math  
    25.                     .abs(values[2]) > 17))  
    26.             {  
    27.                 context.overridePendingTransition(R.anim.zoom_out_enter,  
    28.                         R.anim.zoom_out_exit);  
    29.                 //检测到晃动后启动OpenDoor效果  
    30.                 Intent intent = new Intent(context, OpenDoorActivity.class);  
    31.                 context.startActivity(intent);  
    32.                 context.finish();  
    33.             }  
    34.         }  
    35.     }  
    36.   
    37.     @Override  
    38.     public void onAccuracyChanged(Sensor sensor, int accuracy)  
    39.     {  
    40.         //当传感器精度改变时回调该方法,Do nothing.   
    41.     }  
    42.   
    43. }  


    2. 注册部分

    [java] view plain copy
      1. public class ShakeILikeActivity extends Activity  
      2. {  
      3.   
      4.     private ShakeListenerUtils shakeUtils;  
      5.     private SensorManager mSensorManager; //定义sensor管理器, 注册监听器用  
      6.   
      7.     @Override  
      8.     protected void onCreate(Bundle savedInstanceState)  
      9.     {  
      10.         super.onCreate(savedInstanceState);  
      11.         setContentView(R.layout.activity_shake_i_like);  
      12.   
      13.         shakeUtils = new ShakeListenerUtils(this);  
      14.     }  
      15.   
      16.     @Override  
      17.     protected void onResume()  
      18.     {  
      19.         super.onResume();  
      20.   
      21.         //获取传感器管理服务   
      22.         mSensorManager = (SensorManager) this  
      23.                 .getSystemService(Service.SENSOR_SERVICE);  
      24.         //加速度传感器    
      25.         mSensorManager.registerListener(shakeUtils,  
      26.                 mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),  
      27.                 //还有SENSOR_DELAY_UI、SENSOR_DELAY_FASTEST、SENSOR_DELAY_GAME等,    
      28.                 //根据不同应用,需要的反应速率不同,具体根据实际情况设定    
      29.                 SensorManager.SENSOR_DELAY_NORMAL);  
      30.     }  
      31.   
      32.     @Override  
      33.     protected void onPause()  
      34.     {  
      35.         mSensorManager.unregisterListener(shakeUtils);  
      36.         this.overridePendingTransition(R.anim.fade_in, R.anim.fade_out);//回退时闪一下  
      37.         super.onPause();  
      38.     }  
      39.   
      40. }  
  • 相关阅读:
    【iOS】找工作的面试题集锦
    APP项目优化--启动速度优化篇
    【Swift】Timer定时器到底准不准确?
    leetcode刷题 495~
    leetcode刷题 464~
    leetcode刷题 441~
    leetcode刷题 420~
    leetcode刷题 396~
    leetcode刷题 373~
    leetcode刷题 307~
  • 原文地址:https://www.cnblogs.com/wanghuaijun/p/5460706.html
Copyright © 2011-2022 走看看