【问题标题】:controlling vibration intensity in android phones? is it possible?控制安卓手机的振动强度?可能吗?
【发布时间】:2018-04-28 02:57:01
【问题描述】:

我正在开发一款游戏。其中,我想为不同的事件设置不同的振动强度。我只是想知道它是否真的可以控制振动强度和持续时间。任何建议或参考链接都可能非常有帮助。提前致谢。

【问题讨论】:

    标签: java android


    【解决方案1】:

    我认为这取决于您所说的强度。您可以控制振动的模式和长度,但我认为您无法使其振动“更强”。

    http://developer.android.com/reference/android/os/Vibrator.html

    【讨论】:

    • 非常感谢乔希。我希望他们能尽快为我们提供控制强度的方法。
    • 硬件不这样做。
    • 我认为您不会很快看到添加该功能。手机振动的工作方式比您希望的要“简单”得多。 electronics.howstuffworks.com/question368.htm
    • 我有运行 Android 5.0.1 的三星 Galaxy S4,它有振动强度设置。也许这是特定于设备的?如果是这样,则必须有一个 API 允许此功能。有人有什么想法吗?
    【解决方案2】:

    我做了一个简单的技巧来以某种方式降低振动强度。我的想法是将振动间隔与静音间隔交错。如果你有 1 毫秒的振动,然后是 1 秒的静默,以此类推,这似乎是一种持续的振动,但比正常情况要弱。您可以尝试增加静音间隔以使振动更弱。下面是代码示例:

    int strong_vibration = 30; //vibrate with a full power for 30 secs
    int interval = 1000;
    int dot = 1; //one millisecond of vibration
    int short_gap = 1; //one millisecond of break - could be more to weaken the vibration
    long[] pattern = {
            0,  // Start immediately
            strong_vibration, 
            interval,
            // 15 vibrations and 15 gaps = 30millis
            dot, short_gap, dot, short_gap, dot, short_gap, dot, short_gap, dot, short_gap, dot, short_gap, dot, short_gap, dot, short_gap, dot, short_gap, dot, short_gap, dot, short_gap, dot, short_gap, dot, short_gap, dot, short_gap, dot, short_gap, //yeah I know it doesn't look good, but it's just an example. you can write some code to generate such pattern. 
        };
    

    【讨论】:

    • 您是否知道这对设备是否有任何不利影响?
    【解决方案3】:

    PWM 可用于产生各种脉冲宽度的振动模式,从而降低振动电机的平均电压(从而降低振动输出)。

    我发布了一个简单的概念验证方法here。此方法将生成具有指定强度和持续时间的图案。该方法的转换不是很线性,所以我发布了一个赏金,希望能得到一些替代建议。当我有更好的算法时会更新。

    【讨论】:

      【解决方案4】:

      这可以帮助你,但它只适用于 API 级别 26 或更高。

      public void vibrate(View view) {
          Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
      
          if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
      
              long[] wave_time = {0, 100, 0, 100, 0, 100, 0, 100, 0, 100};
              int[] wave_ampl = {0, 50, 0, 100, 0, 150, 0, 200, 0, 255};
      
              VibrationEffect vibrationEffect = null;
              vibrationEffect = VibrationEffect.createWaveform(wave_time, wave_ampl, -1);
              vibrator.vibrate(vibrationEffect);
          }
      
      }
      

      这里wave_time数组代表两种时间:

      1. 应该空闲的时间(第 0 个索引、第 2 个索引等)
      2. 它应该振动的时间(第一个索引、第三个索引等)

      wave_ampl 数组代表振动的强度 w.r.t wave_time 数组。

      解释:

      电话等待 0 毫秒(wave_time 的第 0 个索引)并开始振动 100 毫秒(wave_time 的第一个索引),强度为 50wave_ampl 的第一个索引)。


      类似地,手机振动 100 毫秒(wave_time 的第三个索引),强度为 100wave_ampl 的第三个索引)。


      在android中最大强度为255

      Reference

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多