按下按钮时连续Android调用事件

时间:2014-09-01 07:05:38

标签: android events

我必须开发一个应用程序,因为我想触发一个动作,就像按钮在按下时有争议地振动,我离开按下它停止振动。

在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;
        }
    });

3 个答案:

答案 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;
         }
     }
});