2013-08-31 4 views
0

글쎄, 나는 대답을 찾고 있지만 아무도 나를 위해 일한 적이 없다. HELD DOWN 일 때 화면을 가로 질러 이미지를 계속 움직이는 버튼이 있습니다. 그러나 웬일인지, 버튼을 가볍게 치면 내 빛이 얼어 붙습니다. 스레드가 문제의 일부라고 생각하지만 확실하지 않습니다. 여기에 코드입니다 :onTouch 함수로 while 루프를 사용하려면 어떻게해야합니까? (안드로이드)

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

} 

가 BTW, 난 그냥 안드로이드/w에서 시작하고, 그래서 이것은 명백한 질문의 경우 내가 죄송합니다. 감사! 매우 감사.

+2

바로 여기에 몇 가지가 있습니다. 스레드와 관련된 모든 것을 버리고 안드로이드를보십시오. 이미지 뷰를 움직이려면 애니메이션을보십시오. – pumpkee

답변

2

일을 위해, 당신은 당신의 UI가 freeze.Here을 받고있다 왜 UI를 스레드 잠을하고있다, 나는 배경을 자고 오전 비동기 작업을 만들었습니다 스레드 및 doInBackground 메서드에서 아래에서 볼 수있는 것처럼 주 스레드에서 UI 업데이트를 실행합니다. 여기에 해결책이 있습니다 - :

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

두 번째 스레드를 생성하는 것이 옳았지만 작성한 스레드가 빈 스레드 인 이유는 무엇입니까? 스레드를 시작한 후에 실행을 호출 할 필요가 없습니다.

들으 Abhishek Birdawade 나를 위해 코드가 작동 : 첫째

+0

예를 들려 줄 수 있습니까? – romofan23

+0

나는 당신의 말을 정말로 이해하지 못합니다. 몇 가지 예제 코드를 게시하십시오. 매우 감사! – romofan23

관련 문제