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

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

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

 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服务,具体调用方法如下代码所示:

 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里增加振动权限:

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

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

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

 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
      } 

    } 

  }

效果图:
 

(0)

相关推荐

  • HTML5使用DeviceOrientation实现摇一摇功能

    HTML5有一个重要特性:DeviceOrientation,它将底层的方向和运动传感器进行了高级封装,它使我们能够很容易的实现重力感应.指南针等有趣的功能.本文将结合实例给大家介绍使用HTML5的重力运动和方向传感器实现手机摇一摇效果. DeviceOrientation包括两个事件: 1.deviceOrientation:封装了方向传感器数据的事件,可以获取手机静止状态下的方向数据,例如手机所处角度.方位.朝向等. 2.deviceMotion:封装了运动传感器数据的事件,可以获取手机运动

  • 使用PHP实现微信摇一摇周边红包

    最近接了个项目,其中有需求是要实现摇一摇红包功能,在网上搜了好久,都没有找到源码,没办法,只有自动写了,下面小编把我的劳动成果分享给大家供大家参考,本文写的不好,还请各位大侠提出宝贵意见,共同学习进步. 微信官方说明如下 摇一摇红包说明 功能说明 摇一摇周边红包接口是为线下商户提供的发红包功能.用户可以在商家门店等线下场所通过摇一摇周边领取商家发放的红包,在线上转发分享无效. 开发者可通过接口开发摇一摇红包功能,特点包括:  1.可选择使用模板加载页或自定义Html5页面调起微信原生红包页面(详

  • php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)

    微信入口绑定,微信事件处理,微信API全部操作包含在这些文件中. 内容有:微信摇一摇接口/微信多客服接口/微信支付接口/微信红包接口/微信卡券接口/微信小店接口/JSAPI <?php class WxApi { const appId = ""; const appSecret = ""; const mchid = ""; //商户号 const privatekey = ""; //私钥 public $param

  • javascript html5摇一摇功能的实现

    通过网上的资料,加上自己的整理,写了一份html摇一摇功能的简介,用做技术备份. 知识要点 1.DeviceMotionEvent     这是html5支持的重力感应事件,关于文档请看:http://w3c.github.io/deviceorientation/spec-source-orientation.html 事件介绍: deviceorientation 提供设备的物理方向信息,表示为一系列本地坐标系的旋角. devicemotion 提供设备的加速信息,表示为定义在设备上的坐标系

  • 分享网页检测摇一摇实例代码

    废话不多说了,直接给大家贴代码了,具体代码如下所示: var Shaker = function(f){ // 摇一摇: 检测到3次摇动算一次摇一摇, 摇动后调用处理函数, 不再检测摇动 // f 摇动后的回调 this.callback = f; this.status = 0; // 0: 侦听未开始 1: 侦听开始 this.speed = 15; this.lastX = this.lastY = this.lastZ = 0; this.num = 0; // 检测触发次数 this.

  • Android实现摇一摇功能

    实现"摇一摇"功能,其实很简单,就是检测手机的重力感应,具体实现代码如下: 1.在 AndroidManifest.xml 中添加操作权限 2.实现代码 package com.xs.test; import android.app.Activity; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; impo

  • iOS实现微信朋友圈与摇一摇功能

    本Demo为练手小项目,主要是熟悉目前主流APP的架构模式.此项目中采用MVC设计模式,纯代码和少许XIB方式实现.主要实现了朋友圈功能和摇一摇功能. 预览效果: 主要重点 1.整体架构 利用UITabBarController和UINavigationController配合实现.其中要注意定义基类,方便整体上的管理,例如对UINavigationController头部的颜色,字体和渲染颜色等设置.以及对UITabBarController的底部的渲染等. [self.navigationB

  • Android利用传感器实现微信摇一摇功能

    本文实例为大家分享了Android微信摇一摇功能的实现方法,供大家参考,具体内容如下 import java.util.ArrayList; import java.util.List; import java.util.Random; import android.app.Activity; import android.app.Service; import android.content.res.Resources; import android.hardware.Sensor; impo

  • Android 微信摇一摇功能实现详细介绍

    Android 微信摇一摇功能实现,最近学习传感器,就想实现摇一摇的功能,上网查了些资料,就整理下.如有错误,还请指正. 开发环境 Android Studio 2.2.1 JDK1.7 API 24 Gradle 2.2.1 相关知识点 加速度传感器 补间动画 手机震动 (Vibrator) 较短 声音/音效 的播放 (SoundPool) 案例: 我们接下来分析一下这个案例, 当用户晃动手机时, 会触发加速传感器, 此时加速传感器会调用相应接口供我们使用, 此时我们可以做一些相应的动画效果,

  • IOS 实现摇一摇的操作

    要实现摇一摇的功能,类似于微信的摇一摇 方法1:通过分析加速计数据来判断是否进行了摇一摇操作(比较复杂) 方法2:iOS自带的Shake监控API(非常简单) 本文介绍方法2: 判断摇一摇的步骤: 1)检测到开始摇动 - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{ //检测到后可做一些处理 } 2)摇一摇被取消或中断 - (void)motionCancelled:(UIEventSubtype)mot

随机推荐