热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

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

这篇文章主要介绍了安卓系统中实现摇一摇画面振动效果的方法,调用AndroidSDK中的SensorEventListener接口,需要的朋友可以参考下

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

See {@link android.hardware.SensorManager SensorManager} * for details on possible sensor types. *

See also {@link android.hardware.SensorEvent SensorEvent}. * *

NOTE: 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. *

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

   

    解释一下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 
      } 
   
    } 
   
  } 


    效果图:
 2015731105552641.png (720×1280)


推荐阅读
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 国内BI工具迎战国际巨头Tableau,稳步崛起
    尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • 本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ... [详细]
  • MySQL中枚举类型的所有可能值获取方法
    本文介绍了一种在MySQL数据库中查询枚举(ENUM)类型字段所有可能取值的方法,帮助开发者更好地理解和利用这一数据类型。 ... [详细]
  • 本文详细探讨了在Android 8.0设备上使用ChinaCock的TCCBarcodeScanner进行扫码时出现的应用闪退问题,并提供了解决方案。通过调整配置文件,可以有效避免这一问题。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文介绍如何通过SQL查询从JDE(JD Edwards)系统中提取所有字典数据,涵盖关键表的关联和字段选择。具体包括F0004和F0005系列表的数据提取方法。 ... [详细]
  • 本文详细介绍了如何通过命令行启动MySQL服务,包括打开命令提示符窗口、进入MySQL的bin目录、输入正确的连接命令以及注意事项。文中还提供了更多相关命令的资源链接。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
author-avatar
人帅刀快爱美女_915
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有