2014-02-11 28 views
1

这很可能是一个微不足道的东西,但我找不到解决方案。 事情很简单,用户按下屏幕,当他在屏幕上按住手指时,我想要一段代码执行。SurfaceView执行方法,而手指触摸屏幕

下面是一个代码示例:

@Override 
    public boolean onTouchEvent(MotionEvent event) { 
     synchronized (getHolder()) { 
      if (event.getAction() == MotionEvent.ACTION_DOWN) { 
         myobject.setX(myobject.getX() - 10); 
      } else if (event.getAction() == MotionEvent.ACTION_MOVE) { 

      } else if (event.getAction() == MotionEvent.ACTION_UP) { 
      } 
      return true; 
     } 
    } 

这段代码的作用是,myobject.setX()只发生一次,我希望它保持在用户保持屏幕上的手指重复,所以如果它持有3秒,myobject.setX()会以-10减少几次。

+0

通过在返回true最后,您可能会禁用事件的进一步传播,将return语句更改为false ... –

回答

0

你可以做这样的事情(例如):

int howLongUntilEdge = 1000; 
CountDownTimer t = new CountDownTimer(howLongUntilEdge, 1000) { 

    @Override 
    public void onTick(long millisUntilFinished) { 
     myobject.setX(myobject.getX() - 10); 
    } 

    @Override 
    public void onFinish() {} 
}; 

然后在你的触摸事件:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    synchronized (getHolder()) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      t.start(); 
     } else if (event.getAction() == MotionEvent.ACTION_UP) { 
      t.stop(); 
     } 

     return true; 
    } 
} 

这将将其向左10每一秒。你需要做一些事情,比如决定多少秒,直到它到达边缘并设置howLongUntilEdge var以反映正确的值

+0

我最喜欢这种方法。感谢你的回答。 – Alin

+0

不客气。有一点需要注意 - onTouchEvent和ACTION_UP可能不会在极少数情况下运行,例如,如果您在按下电话时接到电话。您可能还想停止片段/活动的暂停计时器 –

0

public boolean onTouchEvent(MotionEvent event)中提供的MotionEvent只会匹配MotionEvent.ACTION_DOWN作为初始触摸。您需要在其他语句中继续更新:(event.getAction() == MotionEvent.ACTION_MOVE)

1

你可以使用一个布尔变量(在ACTION_DOWN上赋值为true)来指示你仍然按下在屏幕上,当你提高你的手指(ACTION_UP),可以将其设置为false,那么在此期间,你可以启动一个线程来执行你希望你的代码的时间,像这样:

private boolean mIsStillPressing; 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    synchronized (getHolder()) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      mIsStillPressing = true; 
      new Thread() { 
       @Override 
       public void run() { 
        // Still moving object until an ACTION_UP is done. 
        while (mIsStillPressing) { 
         myobject.setX(myobject.getX() - 10); 

         // Some sleep time 
         try { 
          Thread.sleep(100L); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 
        } 
       } 
      }.start(); 
     } else if (event.getAction() == MotionEvent.ACTION_UP) { 
      mIsStillPressing = false; 
     } 
     return true; 
    } 
}` 
相关问题