我写了一个Android应用程序。现在,我想让设备在某个动作发生时震动。我该怎么做呢?
当前回答
Kotlin更新更类型安全
在项目的一些常见类(如Utils.kt)中使用它作为顶级函数
// Vibrates the device for 100 milliseconds.
fun vibrateDevice(context: Context) {
val vibrator = getSystemService(context, Vibrator::class.java)
vibrator?.let {
if (Build.VERSION.SDK_INT >= 26) {
it.vibrate(VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE))
} else {
@Suppress("DEPRECATION")
it.vibrate(100)
}
}
}
然后在代码中的任何地方调用它,如下所示:
vibrateDevice(requireContext())
解释
使用Vibrator::class.java比使用String常量更加类型安全。
我们使用let{}检查振动器的可空性,因为如果振动对设备不可用,振动器将为空。
在else子句中抑制弃用是可以的,因为警告来自较新的SDK。
我们不需要在运行时要求使用振动的许可。但是我们需要在AndroidManifest.xml中声明它,如下所示:
<uses-permission android:name="android.permission.VIBRATE"/>
其他回答
<uses-permission android:name="android.permission.VIBRATE"/>
应该在<manifest>标签内和<application>标签外添加。
未经允许震动
如果你想简单地震动设备一次,以提供对用户操作的反馈。你可以使用视图的performHapticFeedback()函数。这并不需要在清单中声明VIBRATE许可。
在一些常见类(如Utils)中,使用以下函数作为顶级函数。项目Kt:
/**
* Vibrates the device. Used for providing feedback when the user performs an action.
*/
fun vibrate(view: View) {
view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
}
然后在你的片段或活动的任何地方使用它,如下所示:
vibrate(requireView())
就这么简单!
授予振动权限
在你开始实现任何振动代码之前,你必须给你的应用程序振动的权限:
<uses-permission android:name="android.permission.VIBRATE"/>
确保在AndroidManifest.xml文件中包含这一行。
导入振动库
大多数ide会为你这样做,但如果你的不这样做,下面是import语句:
import android.os.Vibrator;
确保在你想要振动发生的活动中。
如何振动一个给定的时间
在大多数情况下,你会想要在短时间内,预定的时间内震动设备。您可以通过使用振动(长毫秒)方法来实现这一点。这里有一个简单的例子:
// Get instance of Vibrator from current Context
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
// Vibrate for 400 milliseconds
v.vibrate(400);
就是这样,很简单!
如何无限振动
你可能希望设备无限期地继续振动。为此,我们使用vibrate(long[] pattern, int repeat)方法:
// Get instance of Vibrator from current Context
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
// Start without a delay
// Vibrate for 100 milliseconds
// Sleep for 1000 milliseconds
long[] pattern = {0, 100, 1000};
// The '0' here means to repeat indefinitely
// '0' is actually the index at which the pattern keeps repeating from (the start)
// To repeat the pattern from any other point, you could increase the index, e.g. '1'
v.vibrate(pattern, 0);
当你准备停止振动时,只需调用cancel()方法:
v.cancel();
如何使用振动模式
如果你想要一个更定制的振动,你可以尝试创建你自己的振动模式:
// Get instance of Vibrator from current Context
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
// Start without a delay
// Each element then alternates between vibrate, sleep, vibrate, sleep...
long[] pattern = {0, 100, 1000, 300, 200, 100, 500, 200, 100};
// The '-1' here means to vibrate once, as '-1' is out of bounds in the pattern array
v.vibrate(pattern, -1);
更复杂的振动
有多个sdk提供了更全面的触觉反馈。我使用的一个特效是Immersion的Haptic Development Platform for Android。
故障排除
如果你的设备不会震动,首先要确保它可以震动:
// Get instance of Vibrator from current Context
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
// Output yes if can vibrate, no otherwise
if (v.hasVibrator()) {
Log.v("Can Vibrate", "YES");
} else {
Log.v("Can Vibrate", "NO");
}
其次,请确保您已经允许您的应用程序振动!回到第一点。
我努力理解如何做到这一点在我的第一个实现-确保你有以下:
1)您的设备支持振动(我的三星平板电脑不工作,所以我一直在重新检查代码-原始代码在我的CM Touchpad上完美地工作
2)你已经在AndroidManifest.xml文件中声明了应用程序级别以上的代码来允许运行。
3)在MainActivity.java中导入以下两个文件和其他导入文件: 进口android.content.Context; 进口android.os.Vibrator;
4)调用你的振动(在这个线程中已经广泛讨论了)-我在一个单独的函数中做了它,并在其他点的代码中调用它-取决于你想要使用什么来调用振动,你可能需要一个图像(Android:长时间单击按钮->执行动作)或按钮监听器,或XML中定义的可点击对象(clickable image - Android):
public void vibrate(int duration)
{
Vibrator vibs = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
vibs.vibrate(duration);
}
Kotlin更新更类型安全
在项目的一些常见类(如Utils.kt)中使用它作为顶级函数
// Vibrates the device for 100 milliseconds.
fun vibrateDevice(context: Context) {
val vibrator = getSystemService(context, Vibrator::class.java)
vibrator?.let {
if (Build.VERSION.SDK_INT >= 26) {
it.vibrate(VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE))
} else {
@Suppress("DEPRECATION")
it.vibrate(100)
}
}
}
然后在代码中的任何地方调用它,如下所示:
vibrateDevice(requireContext())
解释
使用Vibrator::class.java比使用String常量更加类型安全。
我们使用let{}检查振动器的可空性,因为如果振动对设备不可用,振动器将为空。
在else子句中抑制弃用是可以的,因为警告来自较新的SDK。
我们不需要在运行时要求使用振动的许可。但是我们需要在AndroidManifest.xml中声明它,如下所示:
<uses-permission android:name="android.permission.VIBRATE"/>
推荐文章
- 如何分割逗号分隔的字符串?
- Java字符串—查看字符串是否只包含数字而不包含字母
- 如何隐藏动作栏之前的活动被创建,然后再显示它?
- Mockito.any()传递带有泛型的接口
- 在IntelliJ 10.5中运行测试时,出现“NoSuchMethodError: org.hamcrest. matcher . descripbemismatch”
- 是否有一种方法以编程方式滚动滚动视图到特定的编辑文本?
- 使用String.split()和多个分隔符
- Java数组有最大大小吗?
- 在Android中将字符串转换为Uri
- 从JSON生成Java类?
- 为什么java.util.Set没有get(int index)?
- Swing和AWT的区别是什么?
- 如何在NestedScrollView内使用RecyclerView ?
- 为什么Java流是一次性的?
- 移动到另一个EditText时,软键盘下一步点击Android