2013-08-31 4 views
0

Ну, я искал ответы, но никто не работал для меня. У меня есть кнопка, которая, когда она HOWD DOWN, должна продолжать перемещать изображение по экрану. Но по какой-то причине, он просто замораживает мой зазор, когда я нажимаю кнопку. Я думаю, что поток является частью проблемы, но я не уверен. Вот код:Как использовать цикл while с функцией onTouch? (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); 
} 

} 

BTW, я только начинал ж/андроида, поэтому я прошу прощения, если это очевидный вопрос. Благодаря! Очень признателен.

+2

Существует несколько вещей, которые здесь не так. Выбросьте все связанные темы и посмотрите на android Посмотреть анимацию, если вы собираетесь перемещать изображение. – pumpkee

ответ

2

Во-первых, вы делаете нить сон UI, поэтому ваш интерфейс становится freeze.Here, я создал асинхронной задачу, где я сплю фон нить и запустить обновление пользовательского интерфейса на главном потоке, как вы можете увидеть ниже в 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

создать вторую нить была правильной, но вы должны заполнить ее каким-либо действием, потому что нить, которую вы создали, является пустой :) , и вам не нужно запускать вызов после запуска потока.

Thx Абхишек Birdawade для выполнения кода для меня работа :)

+0

Можете ли вы привести пример? – romofan23

+0

Я действительно не понимаю, что вы пытаетесь сказать. Пожалуйста, отправьте примерный код. Очень признателен! – romofan23