2013-08-31 21 views
0

那么,我一直在寻找答案,但没有人为我工作。我有一个按钮,当它持续下来时,应该继续在屏幕上移动图像。但出于某种原因,当我点击按钮时,它只是冻结我的点燃。我认为线程是问题的一部分,但我不确定。下面是代码:如何在onTouch函数中使用while循环? (Android)

package com.evilsea.darkages; 

import android.os.Bundle; 
import android.app.Activity; 
import android.graphics.Color; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.widget.ImageView; 

public class MainActivity extends Activity implements OnTouchListener, Runnable { 

ImageView leftImageButton; 

boolean leftButtonDown = false; 

ImageView knight; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Thread thread1 = new Thread(this); 
    thread1.start(); 
    this.run(); 
} 

public void addListenerOnLeftButton() { 

    leftImageButton = (ImageView) findViewById(R.id.left_button); 
    leftImageButton.setOnTouchListener(leftButtonlistener); 

    knight = (ImageView) findViewById(R.id.knight_image); 

} 

OnTouchListener leftButtonlistener = new OnTouchListener() { 
    @Override 
    public boolean onTouch(View view, MotionEvent event) { 
     switch (event.getAction()) { 

      case MotionEvent.ACTION_DOWN: 
       leftButtonDown = true; 
      try { 
       while(leftButtonDown) { 
        Thread.sleep(10); 
        moveLeft(5); 
       } 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      break; 

      case MotionEvent.ACTION_UP: 
       leftButtonDown = false; 
      break; 
     } 

     return false; 
    } 
    }; 

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    // TODO Auto-generated method stub 
    return false; 
} 

@Override 
public void run() { 
    addListenerOnLeftButton(); 
} 

public void moveLeft(int speed) throws InterruptedException { 
    knight.setLeft(knight.getLeft() -speed); 
} 

} 

顺便说一句,我刚刚起步的W/Android的,所以我很抱歉,如果这是一个明显的问题。谢谢!非常感激。

+2

有几件事情不就在这里。抛出所有与线程相关的东西,并查看android如果您打算移动图像视图,请查看动画。 – pumpkee

回答

2

首先,你是一个UI线程睡眠,这就是为什么你的UI越来越freeze.Here,我已经建立我在哪里睡背景的异步任务线程运行在主线程的UI更新,你可以在doInBackground method.Here见下文为您的解决方案 - :

public class MainActivity extends Activity { 

    private ImageView leftImageButton; 
    private boolean leftButtonDown = false; 
    private ImageView knight; 
    private AsyncTask asyncTask = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     leftImageButton = (ImageView) findViewById(R.id.imageView2); 
     knight = (ImageView) findViewById(R.id.imageView1); 
     leftImageButton.setOnTouchListener(new LeftImageListener()); 
    } 

    public void startTask() { 
     asyncTask = new AsyncTask<Void, Void, Void>() { 

      @Override 
      protected Void doInBackground(Void... params) { 
       if (leftButtonDown) { 
        while (leftButtonDown) { 
         try { 
          Thread.sleep(10); 
          runOnUiThread(new Runnable() { 

           @Override 
           public void run() { 
            try { 
             moveLeft(5); 

            } catch (InterruptedException e) { 
             // TODO Auto-generated catch block 
             e.printStackTrace(); 
            } 

           } 
          }); 

         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 
        } 
       } 
       return null; 
      } 

     }.execute(); 
    } 

    public void moveLeft(int speed) throws InterruptedException { 
     knight.setLeft(knight.getLeft() - speed); 
    } 

    public class LeftImageListener implements OnTouchListener { 

     public LeftImageListener() { 
      // TODO Auto-generated constructor stub 
     } 

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

      switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       leftButtonDown = true; 
       startTask(); 
       break; 
      case MotionEvent.ACTION_UP: 
       leftButtonDown = false; 
       break; 
      default: 
       break; 
      } 

      return true; 
     } 

    } 

} 
+0

谢谢!它非常完美! – romofan23

+0

你可以接受这个答案。 –

0

创建第二个线程是正确的,但你应该填充一些行动,因为你创建的线程是空的:) 你不需要在启动线程后调用run。

THX阿布舍克Birdawade做我的工作代码:)

+0

你能举个例子吗? – romofan23

+0

我真的不明白你想说什么。请张贴一些示例代码。非常感激! – romofan23