我必须开发一个应用程序,因为我想触发一个动作,就像按钮在按下时有争议地振动,我离开按下它停止振动。
在onTouch中 - 事件仅在按下时发生,但是当我有争议地按下按钮时 - >事件有争议地发生
就像我按下按钮1分钟它振动同一时间,如果按下它停止。
我不知道使用哪种方法,所以,请任何人帮我这样做。
我的代码在下面是这样做的:但它不适用于按下期间的连续动作(使用线程仅适用于振动,如果我加入更多代码,则会出现错误,请参阅以下内容。
**编辑:**
我使用下面的方法获得了振动的解决方案,但是当我编写代码(在vibrator.vibrate(100);下面)为某些动画连续按下时,我得到了错误:只有创建视图层次结构的原始线程可以触及它的观点。我也尝试使用 runOnUIThread ,但这样做不起作用。
img_laser_ballpen.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View view, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
MainActivity.this.vibrating = true;
img_laser_light.setVisibility(View.VISIBLE);
new Thread(new Runnable() {
public void run() {
while (MainActivity.this.vibrating) {
// ADD CODE FOR MAKING VIBRATION
vibrator.vibrate(100); // it works properly
//Animation shake = AnimationUtils.loadAnimation(
MainActivity.this, R.anim.shake);
//img_laser_light.startAnimation(shake); //if it open then give error
}
//
}
}).start();
} else if (event.getAction() == MotionEvent.ACTION_UP) {
MainActivity.this.vibrating = false;
img_laser_light.setVisibility(View.INVISIBLE);
}
return vibrating;
}
});
答案 0 :(得分:0)
This answer有一个抓住这些事件的好例子;即 - 您应该使用OnTouchListener而不是OnClickListener。
// this goes wherever you setup your button listener:
button.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN) {
// START VIBRATE HERE
return true;
} else if (event.getAction() == MotionEvent.ACTION_UP) {
// STOP VIBRATE HERE
return true;
}
}
};
修改强>:
处理完振动后应返回true
,以便为此视图触发其他事件。来自the documentation:
onTouch() - 返回一个布尔值,指示您的侦听器是否使用此事件。重要的是这个事件可以有多个相互跟随的动作。因此,如果在收到向下操作事件时返回false,则表示您尚未使用该事件,并且对此事件的后续操作也不感兴趣。因此,您不会在事件中调用任何其他操作,例如手指手势或最终的上行动作事件。
答案 1 :(得分:0)
你可以喜欢这个
Button btn = (Button) findViewById(YOUR_BUTTON_ID);
btn.setOnTouchListener(new OnTouchListener() {
public boolean onTouch (View v, MotionEvent event){
if(event.getAction() == MotionEvent.DOWN){
// Start vibrating
}else if (event.getAction() == MotionEvent.UP){
// Stop vibrating
}
}
});
答案 2 :(得分:0)
您可以选择以下内容:
Button btn = (Button) findViewById(YOUR_BUTTON_ID);
boolean vibrating = true;
btn.setOnTouchListener(new OnTouchListener() {
public boolean onTouch (View view, MotionEvent event){
if(event.getAction() == MotionEvent.DOWN){
YOUR_CLASS_NAME.this.vibrating = true;
new Thread(
new Runnable(){
public void run(){
while(YOUR_CLASS_NAME.this.vibrating){
//ADD CODE FOR MAKING VIBRATION
}
}
}
).start();
}else if (event.getAction() == MotionEvent.UP){
YOUR_CLASS_NAME.this.vibrating = false;
}
}
});