Sunday, January 15, 2012

Программирование элементов игр на Android (рисование картинок, ввод прикосновений и параллельное программирование):
1. Нарисовать картинки по вкусу и положить в дирректорию картинок проекта - <...>/projects/HelloAndroid/res/drawable
    например - <...>/projects/HelloAndroid/res/drawable/aaa.gif
2. В программе загружать картинку следующим образом -
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.aaa);
3. Для рисования картинки надо отнаследовать класс View переопределить у него одну функцию - onDraw, которая и будет
    рисовать на экран когда андроид ее вызовет. Проще всего сделать внутренний класс - от него нужна только одна функция 
    и  желателен доступ ко всем переменным.
public class HelloAndroid extends Activity {
...
    class TestView extends View {
        Paint paint = new Paint();
        @Override protected void onDraw(Canvas canvas) {
            canvas.drawBitmap(bitmap, x, x, paint);
         }
     }
...
4. Далее в основном классе надо этот новый View определить как основной экран в инициализирующей функции onCreate 
...
        TestView tv;
        Bitmap bitmap;         /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.aaa);
            tv = new TestView();
            setContentView(tv);
        }
...
5. Для обрабатывания прикосновений есть функция onTouchEvent()
    event.getX() и event.getY возвращают координаты пальца на экране
    и по этим координатам я рисую картинку - задаю ее новые координаты
    и говорю tv (TestView) перерисоваться - tv.invalidate(). Далее Android вы-
    зовет onDraw() и картинка перересуется.
...
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            x = event.getX();
            y = event.getY();
            tv.invalidate();
            return true;
        } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
            x = event.getX();
            y = event.getY();
            tv.invalidate();
            return true;
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            new Thread(new GoBack()).start();
            return true;
        }
       return super.onTouchEvent(event);
    }
...
    перерисовывание происходит только когда палец дотронулся до экрана (ACTION_DOWN)
    и пока палец двигается по экрану (ACTION_MOVE), а когда палец отняли от экрана (ACTION_UP)
    запускается параллельно нитка которая возвращает картинку на место. 6. Для параллельной нитки исполнения определяем еще один встроенный клас для этой нитки:
    class GoBack implements Runnable {
        public void run() { 
            try {
                Thread.sleep( 100 );
                x = x/2;
                y = y/2;
                tv.postInvalidate();
                Thread.sleep( 100 );
                x = 0;
                y = 0;
                tv.postInvalidate();
            } catch (Exception e) {
            }
        }
    }
    В данном случае нитка в два шага вернет координаты в нуль с задержкой в 0.1 секунды.
    Для перерисовывания View тут надо вызывать postInvallidate(), когда это вне цикла обработки
   событий андроида, почему то нужно вызывать именно эту функцию а не invalidate().

No comments:

Post a Comment