Android 从OnLongClickListener振动

Android 从OnLongClickListener振动,android,android-vibration,Android,Android Vibration,也许有人能给我解释一下,如何正确地从OnLongClickListener振动。在下面的方法中,振动非常短。 如果我设置返回false振动按预期持续5000ms,但OnClickListener被触发 我应该如何在整个时间段内从OnLongClickListener振动,而不是触发OnClickListener final Vibrator x = (Vibrator) getParent() .getSystemService(Context.VIBRATOR_SERV

也许有人能给我解释一下,如何正确地从OnLongClickListener振动。在下面的方法中,振动非常短。 如果我设置
返回false振动按预期持续5000ms,但
OnClickListener
被触发

我应该如何在整个时间段内从OnLongClickListener振动,而不是触发OnClickListener

final Vibrator x = (Vibrator) getParent()
            .getSystemService(Context.VIBRATOR_SERVICE);
button.setOnLongClickListener(new OnLongClickListener() {
        @Override
    public boolean onLongClick(View v) {
        x.vibrate(5000);
        return true;
    } 
}); 

您可以将计时器设置为在振动期间运行,并且只有在计时器超时后,才返回True。有点模糊,但它应该可以工作。

当一个点击事件被触发时,它会被传递到可用的最低处理程序(除非有人打断)。在您的情况下,长单击事件首先传递给
onlongclicklister
。如果该侦听器返回
true
,它基本上会宣布此单击事件已被处理。如果它返回
false
,它将宣布click事件不是由它处理的,这就是为什么该事件在层次结构中沿着更高一级传递给它上面的处理程序的原因,在您的例子中,就是
OnClickListener

这就是为什么返回
false
不是正确的方法,因为您确实希望处理长时间单击事件

为振动本身创建一个背景线程或
ASyncTask
怎么样。 比如:

@Override
public boolean onLongClick(View v) {
    getHandler().post(new Runnable() {

        @Override
        public void run() {
            x.vibrate(5000);           
        }

    });
    return true;
} 
我没有测试代码,但应该可以