2014-12-15 3 views
1

작은 안드로이드 프로그램을 작성 중이며 문제가 있습니다. 내 프로그램에서 지역으로 설정된 버튼을 사용해야하며 터치 한 경우 객체를 움직여야합니다. 이것은 작동 중입니다. 문제는 내가 터치 할 때이 버튼이 스프라이트를 계속 움직이게하고 싶습니다. 현재 버튼 중 하나를 누르면 코드가 한 번 실행됩니다.버튼 홀드 옵션이있는 움직이는 객체

버튼을 누르고있는 동안 버튼이 객체를 계속 움직 이도록 할 수 있습니까?

감사합니다. 여기에 좋아

Region Rbleft = new Region(135,1585,450,1900); 
    Region Rbright = new Region(630,1585,945,1900); 



public boolean onTouchEvent(MotionEvent event) 
    { 
     synchronized (getHolder()){ 
     float x = event.getX(); 
     float y = event.getY(); 

     if(Rbleft.contains((int)x, (int)y)){ 
      if(xw <= getWidth() - (lore.getWidth()/2)){ 
       xw=xw-1; 
      } 
     }   
     else if(Rbright.contains((int)x, (int)y)){ 
      if(xw <= getWidth() - (lore.getWidth()/2)){ 
       xw=xw+1; 
      } 
     } 

     return super.onTouchEvent(event);} 
    } 
+0

'onTouch'의 모션 이벤트를 MotionEvent.ACTION_DOWN 상수를 확인하여 버튼이 눌려 졌는지 확인할 수 있습니다. – PalinDrome555

+0

나는 많은 다른 형태로 이것을 시도했지만 나는 심지어 OnTouch로 아무 일도 일어나지 못했습니다. – user2798381

답변

2

그냥 대신 당신이 원하는 작업을 수행하는 계산 예를 들어, 당신은 doInBackground() 방법에 작업을 넣을 수 있습니다. onTouchEvent을 사용하는 대신 버튼에 터치 리스너를 추가했습니다.

Button b1; 
boolean flag = false; 
DoWork doWork; 
int count = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    b1 = (Button)findViewById(R.id.button); 

    b1.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if(event.getAction()==MotionEvent.ACTION_DOWN){ 
       Log.i("TAG", "Action Down Detected"); 
       flag = true; 
       doWork = new DoWork(); 
       doWork.execute(); 
       return true; 
      } 

      if(event.getAction() == MotionEvent.ACTION_UP){ 
       Log.i("TAG", "Action Up Detected"); 
       flag = false; 
       doWork.cancel(false); 
       return true; 
      } 
      return false; 
     } 
    }); 

} 

class DoWork extends AsyncTask<Void, Void, Void> { 


    @Override 
    protected void onPreExecute() { 

    } 

    @Override 
    protected Void doInBackground(Void... resId) { 
     while(flag) { 
      synchronized (this) { 
       this.sleep(100); 
       count++; 
      } 
      Log.i("TAG", Integer.toString(count)); 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 

    } 

    @Override 
    protected void onPostExecute(Void result) { 

    } 

    private void sleep(int delay) { 
     try { 
      Thread.sleep(delay); 
     } catch (InterruptedException e) { 
      Log.e("TAG", e.toString()); 
     } 
    } 
} 

sleep 메서드를 사용하면 원하는 속도로 조절할 수 있습니다. 예 : 1000 = 1 초 지연

+0

위의 코드와 같습니다. 액션은 한 번 실행됩니다. 버튼을 계속 누를 때마다 0,1 초마다 실행되기를 원합니다. – user2798381

+0

동기화 된 메소드를 가져 와서'onTouch' 외부의 자체 메소드로 옮길 수 있다면,'ACTION_DOWN'에 true 플래그를 넣고'else' 블록에 false 플래그를 넣을 수 있습니다. 그런 다음 'while (flag == true) {}'루프를 수행하십시오. – PalinDrome555

+0

좋아, 이런 종류의 작업. 그러나 너무 빠르며, 물체가 화면의 측면에 직접있을 때, 동작이 느려지는 방법이 있습니까? 한 프레임에 한 번 움직일 수 있습니까? 그리고 while 루프가 깨질 수는 없다고 생각합니다. 왜냐하면 첫 번째 onTouch에서만 반응하기 때문입니다. – user2798381