服务器之家

服务器之家 > 正文

安卓系统中实现摇一摇画面振动效果的方法

时间:2019-12-31 14:32     来源/作者:低调小一

前言
    在微信刚流行的时候,在摇一摇还能用来那啥的时候,我也曾深更半夜的拿着手机晃一晃。当时想的最多的就是,我靠,为神马摇一下需要用这么大的力度,当时我想可能腾讯觉得那是个人性的设计,后来才发觉尼马重力加速度设得太高了吧。扯多了,最近项目里需要解决一个振动的问题,因此在学习振动实现的过程中,写了个demo实现了摇一摇振动的效果,这里记录一下。

原理
    摇一摇功能的基本原理就是:利用手机的加速度传感器,当加速度到达某个值时,触发某个事件,例如手机振动、UI改变等。这里要实现该功能,首先需要了解一下Android传感器的使用。
Android传感器Sensor使用
    Android中有多种传感器,目前Android SDK支持的传感器包括:加速度传感器、光线传感器、陀螺仪传感器、重力传感器、方向传感器、磁场传感器、压力传感器等。但是并不是所有手机都具有这些传感器的,因为传感器需要money,因此廉价的手机会选择常用的传感器来添加,而且一些高端机型则基本上具有大多数传感器。
Sensor使用步骤
    Android传感器的使用步骤大致可分为三步:
1. 获取传感器管理服对象 SensorManager。
2. 创建传感器事件监听类,该类必须实现android.hardware.SensorEventListener接口。
3. 使用SensorManager.registerListener方法注册指定的传感器。
传感器事件接口
    SensorEventListener接口,该接口的onSensorChanged()和onAccuracyChanged()方法用于处理相应的传感器事件。

   

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public interface SensorEventListener {
  
   /**
    * Called when sensor values have changed.
    * <p>See {@link android.hardware.SensorManager SensorManager}
    * for details on possible sensor types.
    * <p>See also {@link android.hardware.SensorEvent SensorEvent}.
    *
    * <p><b>NOTE:</b> The application doesn't own the
    * {@link android.hardware.SensorEvent event}
    * object passed as a parameter and therefore cannot hold on to it.
    * The object may be part of an internal pool and may be reused by
    * the framework.
    *
    * @param event the {@link android.hardware.SensorEvent SensorEvent}.
    */
   public void onSensorChanged(SensorEvent event);
  
   /**
    * Called when the accuracy of a sensor has changed.
    * <p>See {@link android.hardware.SensorManager SensorManager}
    * for details.
    *
    * @param accuracy The new accuracy of this sensor
    */
   public void onAccuracyChanged(Sensor sensor, int accuracy);  
 }


Android振动实现
    Android振动效果实现主要是依靠Vibrator服务,具体调用方法如下代码所示:

   

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import android.app.Activity;
 import android.app.Service;
 import android.os.Vibrator;
  
 public class VibratorHelper {
   public static void Vibrate(final Activity activity, long milliseconds) {
     Vibrator vibrator = (Vibrator) activity
         .getSystemService(Service.VIBRATOR_SERVICE);
     vibrator.vibrate(milliseconds);
   }
  
   public static void Vibrate(final Activity activity, long[] pattern,
       boolean isRepeat) {
     Vibrator vibrator = (Vibrator) activity
         .getSystemService(Service.VIBRATOR_SERVICE);
     vibrator.vibrate(pattern, isRepeat ? 1 : -1);
   }
 }

    同时,还需要在AndroidManifest.xml里增加振动权限:

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

    解释一下Vibrate方法的参数:
1. long milliseconds:振动的时长,单位是毫秒。
2. long[] pattern:自定义振动模式。数组中数字的含义依次是[静止时长, 振动时长, 静止时长, 振动时长, ......]。振动时长的单位是毫秒。
3. repeat:是否重复振动,1为重复,-1为只振动一次。

摇一摇振动Demo实现
    好了,了解了摇一摇需要借助加速度传感器,振动需要借助Vibrator服务,那就直接来写代码了。MainActivity类实现如下:

  

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import android.app.Activity;
 import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.DialogInterface.OnClickListener;
 import android.hardware.Sensor;
 import android.hardware.SensorEvent;
 import android.hardware.SensorEventListener;
 import android.hardware.SensorManager;
 import android.os.Bundle;
 import android.util.Log;
 import android.widget.Toast;
  
 public class MainActivity extends Activity {
   private SensorManager sensorManager;
   private SensorEventListener shakeListener;
   private AlertDialog.Builder dialogBuilder;
  
   private boolean isRefresh = false;
  
   @Override
   protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
  
     sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
     shakeListener = new ShakeSensorListener();
  
     dialogBuilder = new AlertDialog.Builder(this);
     dialogBuilder.setPositiveButton("确定", new OnClickListener() {
  
       @Override
       public void onClick(DialogInterface dialog, int which) {
         isRefresh = false;
         dialog.cancel();
       }
     }).setMessage("摇到了一个漂亮妹子!").create();
   }
  
   @Override
   protected void onResume() {
     sensorManager.registerListener(shakeListener,
         sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
         SensorManager.SENSOR_DELAY_FASTEST);
     super.onResume();
   }
  
   @Override
   protected void onPause() {
     // acitivity后台时取消监听
     sensorManager.unregisterListener(shakeListener);
  
     super.onPause();
   }
  
   private class ShakeSensorListener implements SensorEventListener {
     private static final int ACCELERATE_VALUE = 20;
  
     @Override
     public void onSensorChanged(SensorEvent event) {
  
 //     Log.e("zhengyi.wzy", "type is :" + event.sensor.getType());
  
       // 判断是否处于刷新状态(例如微信中的查找附近人)
       if (isRefresh) {
         return;
       }
  
       float[] values = event.values;
  
       /**
        * 一般在这三个方向的重力加速度达到20就达到了摇晃手机的状态 x : x轴方向的重力加速度,向右为正 y :
        * y轴方向的重力加速度,向前为正 z : z轴方向的重力加速度,向上为正
        */
       float x = Math.abs(values[0]);
       float y = Math.abs(values[1]);
       float z = Math.abs(values[2]);
  
       Log.e("zhengyi.wzy", "x is :" + x + " y is :" + y + " z is :" + z);
        
       if (x >= ACCELERATE_VALUE || y >= ACCELERATE_VALUE
           || z >= ACCELERATE_VALUE) {
         Toast.makeText(
             MainActivity.this,
             "accelerate speed :"
                 + (x >= ACCELERATE_VALUE ? x
                     : y >= ACCELERATE_VALUE ? y : z),
             Toast.LENGTH_SHORT).show();
  
         VibratorHelper.Vibrate(MainActivity.this, 300);
         isRefresh = true;
         dialogBuilder.show();
       }
  
     }
  
     @Override
     public void onAccuracyChanged(Sensor sensor, int accuracy) {
       // TODO Auto-generated method stub
     }
  
   }
  
 }


    效果图:
 安卓系统中实现摇一摇画面振动效果的方法

相关文章

热门资讯

玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情 2019-06-22
配置IIS网站web服务器的安全策略配置解决方案
配置IIS网站web服务器的安全策略配置解决方案 2019-05-23
Nginx服务器究竟是怎么执行PHP项目
Nginx服务器究竟是怎么执行PHP项目 2019-05-24
返回顶部