0

只要用户触摸屏幕,我就想动态增加线条的宽度。我使用了以下代码:-

@Override
public boolean onTouch(View v, MotionEvent event) {

    switch(event.getAction()){
    case MotionEvent.ACTION_DOWN:
        stopX++; 

    }
    return true;//EDITED (FORGOT TO PASTE THIS LINE)
}

stopX只要触摸屏幕,我就会从 0 到y 轴保持恒定。但是,我失败了。线的宽度增加(根据需要)但是,只有在触摸屏幕时,线条的宽度才会增加,即当我触摸屏幕时,线条会增加 1,但只要我触摸它,线条的宽度就不会继续增长。我希望我能让你理解我的问题。任何帮助将不胜感激。提前感谢您的帮助。

4

2 回答 2

1

这是因为MotionEvent.ACTION_DOWN当您触摸视图时会触发一次。例如,您将需要它来启动一个stopX在 event中递增的循环MotionEvent.ACTION_DOWN并在MotionEvent.ACTION_UP. 例如:

Thread t;

@Override
public boolean onTouch(View v, MotionEvent event) {

    switch(event.getAction()){
    case MotionEvent.ACTION_DOWN:
      t=new Thread(new Runnable(){
       @Override run(){
        while(true){
         try{
          stopX++;
          Thread.sleep(500);
         }catch(ThreadInterruptedException e){
          break;
         }
       }

    }
  });
         t.start(); 

     }
    return true;
  case MotionEvent.ACTION_UP:
    t.interrupt();
    return true;
}
于 2013-10-20T15:14:20.027 回答
0

尝试做这样的事情(只要确保在需要的地方添加相关的锁以保证 m_Task 的安全)。我还会考虑使用计时器运行任务,以防止一些忙等待。

@Override
public boolean onTouch(View v, MotionEvent event) {

    switch(event.getAction()){
    case MotionEvent.ACTION_DOWN:
        // Start an async task
        // Add a lock
        m_Task = new LineIncreamentTask(...);
        task.Start();    
    }
    case MotionEvent.ACTION_UP:
        // Cancel the task
        // Add a lock
        if (m_Task != null) m_Task.cancel();
    }
    return true;//EDITED (FORGOT TO PASTE THIS LINE)
}

private class LineIncreamentTask
{
     public void doInBackground(...)
     {
           // Increase the line width
           // Update the UI & whatever
     }

     public void onPostExecute(...)
     {
         if (!isCanceled())
         {
               // Add a lock
               // Consider using a timer to prevent busy waiting
               m_Task = new LineIncreamentTask(...);
               m_Task.start();
         }
     }
}
于 2013-10-20T15:21:31.633 回答