Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.82
nnnikotinnn995
5 / 5 / 4
Регистрация: 07.07.2011
Сообщений: 382
#1

onTouchEvent в потоке - Программирование Android

21.02.2012, 12:02. Просмотров 4487. Ответов 22
Метки нет (Все метки)

Здравствуйте. Задача изменить с помощью onTouchEvent(MotionEvent event) переменную public int b и отрисовать графику с новым параметром в цикле – без invalidate();.
Переменная public int b наверняка меняется но метод
Java
1
2
3
4
5
 public void onDraw(Canvas canvas) 
       {
           x=x+b;
        canvas.drawBitmap(bmp, x, y, null);
       }
не видит этого изменения.
Вот основные классы
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.view.MotionEvent;
 
 public class Sprite {
   
     private GameView gameView;
    
    private Bitmap bmp;
   public int x = 0;
    private int y = -155;
     public int b=1;
  
    /**Ширина*/
    private int width;
    
    /**Высота*/
    private int height;
    public boolean onTouchEvent(MotionEvent event)
    {
        Float X=(Float)event.getX();
        Float Y=(Float)event.getY();
        int Action=event.getAction();
        
        if (event.getAction() == MotionEvent.ACTION_DOWN)
        {
           b=5; 
                }
        if (event.getAction() == MotionEvent.ACTION_UP)
        {
             b=55;
                }
                if (event.getAction() == MotionEvent.ACTION_MOVE)
                {
                     
                        }
        return true;
    }      
       /**Конструктор*/
    public Sprite(GameView gameView, Bitmap bmp) 
    {
          this.gameView = gameView;
          this.bmp = bmp;
          this.width = bmp.getWidth(); 
          this.height = bmp.getHeight(); 
    }
 
       public void onDraw(Canvas canvas) 
       {
           x=x+b;
        canvas.drawBitmap(bmp, x, y, null);
       }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
 public class GameView extends SurfaceView {
   
   
    /**Загружаем спрайт*/
    private Bitmap bmp;
        
    /**Поле рисования*/
    private SurfaceHolder holder;
    
    /**объект класса GameView*/
    private GameManager gameLoopThread;
    
    /**Объект класса Sprite*/
    private Sprite sprite;
    
   
    /**Конструктор*/
    public GameView(Context context) 
    {
          super(context);
          gameLoopThread = new GameManager(this);
          holder = getHolder();
          
          /*Рисуем все наши объекты и все все все*/
          holder.addCallback(new SurfaceHolder.Callback() 
          {
                        /*** Уничтожение области рисования */
                 public void surfaceDestroyed(SurfaceHolder holder) 
                 {
                        boolean retry = true;
                        gameLoopThread.setRunning(false);
                        while (retry) 
                        {
                               try 
                               {
                                     gameLoopThread.join();
                                     retry = false;
                               } catch (InterruptedException e) 
                               {
                               }
                        }
                 }
 
                 /** Создание области рисования */
                 public void surfaceCreated(SurfaceHolder holder) 
                 {
                        gameLoopThread.setRunning(true);
                        gameLoopThread.start();
                 }
 
                 /** Изменение области рисования */
                 public void surfaceChanged(SurfaceHolder holder, int format,
                               int width, int height) 
                 {
                 }
          });
          bmp = BitmapFactory.decodeResource(getResources(), R.drawable.bad1);
          sprite = new Sprite(this,bmp);
          
    }
 
    /**Функция рисующая все спрайты и фон*/
    protected void onDraw(Canvas canvas) 
    {
          canvas.drawColor(Color.BLACK);
          sprite.onDraw(canvas);
         
    }
   
          }
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import android.graphics.Canvas;
 
public class GameManager extends Thread
{
       /**Наша скорость в мс = 10*/
       static final long FPS = 500;
      
       /**Объект класса GameView*/
       private GameView view; 
 
       /**Задаем состояние потока*/
       private boolean running = false;
      
       /**Конструктор класса*/
       public GameManager(GameView view) 
       {
             this.view = view;
       }
 
        /**Задание состояния потока*/
       public void setRunning(boolean run) 
       {
             running = run;
       }
 
       /** Действия, выполняемые в потоке */
 
       @Override
       public void run() 
       {
             long ticksPS = 1000 / FPS;
             long startTime;
             long sleepTime;
             while (running) {
                    Canvas c = null;
                    startTime = System.currentTimeMillis();
                    try {
                           c = view.getHolder().lockCanvas();
                           synchronized (view.getHolder()) {
                                  view.onDraw(c);
                           }
                    } finally {
                           if (c != null) {
                                  view.getHolder().unlockCanvasAndPost(c);
                           }
                    }
                    sleepTime = ticksPS-(System.currentTimeMillis() - startTime);
                    try {
                           if (sleepTime > 0)
                                  sleep(sleepTime);
                           else
                                  sleep(5);
                    } catch (Exception e) {}
             }
       }
}
Подскажите пожалуйста в чем тут причина?
http://www.cyberforum.ru/android-dev/thread1108143.html
0
Вложения
Тип файла: zip Tectnzapasn5.zip (3.12 Мб, 14 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2012, 12:02
Я подобрал для вас темы с готовыми решениями и ответами на вопрос onTouchEvent в потоке (Программирование Android):

Не срабатывает onTouchEvent
Всем доброго Вечера, недавно занимаюсь программирование под Android. Каким...

Обработка onTouchEvent в Activity
Хочу в активити обрабатывать все прикосновения, независимого от того, были ли...

OnTouchEvent - нарисовать точку
Здравствуйте! Уже который час мучаюсь с программой. В том месте где...

Не работает onTouchEvent, GLSurefaceView
Определил onTouchEvent от GLSurfaceView, не реагирует на касания. Прошу помочь...

Warning: Custom view overrides onTouchEvent but not performClick
У меня есть кастомный view который перегружает onTouchEvent следующим образом....

22
Bes-s
31 / 31 / 2
Регистрация: 05.11.2011
Сообщений: 178
05.03.2012, 13:50 #21
try{ попытаться сделать это }
catch(Exception ex){ если не получилось, то сделать это(в случае ошибки в блоке try{}) }
finnaly{сделать в любом случае(обычно ради избежания nullPointerException возникших в результате провала try{})}
так вот... finnaly употреблять необязательно. но если в блоке try{} возникает ошибка - надо обязательно выполнить блок catch{}. если же выполнять нечего - тут и крашает. по логике java, catch обязателен к выполнению - хотя бы вывести AlertDialog с кодом ошибки...
1
nnnikotinnn995
5 / 5 / 4
Регистрация: 07.07.2011
Сообщений: 382
05.03.2012, 14:40  [ТС] #22
А еще бывает вот такое "});". Например тут
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 public GameView(Context context) 
    {
          super(context);
          gameLoopThread = new GameManager(this);
          holder = getHolder();
          
          
          
          /*Рисуем все наши объекты и все все все*/
          holder.addCallback(new SurfaceHolder.Callback() 
          {
                        /*** Уничтожение области рисования */
                 public void surfaceDestroyed(SurfaceHolder holder) 
                 {
                        boolean retry = true;
                        gameLoopThread.setRunning(false);
                        while (retry) 
                        {
                               try 
                               {
                                     gameLoopThread.join();
                                     retry = false;
                               } catch (InterruptedException e) 
                               {
                               }
                        }
                 }
 
                 /** Создание области рисования */
                 public void surfaceCreated(SurfaceHolder holder) 
                 {
                        gameLoopThread.setRunning(true);
                        gameLoopThread.start();
                 }
 
                 /** Изменение области рисования */
                 public void surfaceChanged(SurfaceHolder holder, int format,
                               int width, int height) 
                 {
                 }
          });                                     //ВОТ ОНО
          bmp = BitmapFactory.decodeResource(getResources(), R.drawable.bad1);
          sprite = new Sprite(this,bmp);
          
    }
Количество открывающих и закрывающих скобок одинаково, зачем тогда нужно "});"( и что это такое)?
0
dajver
410 / 274 / 22
Регистрация: 18.09.2010
Сообщений: 1,114
05.03.2012, 20:13 #23
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
Честно говоря я не больше двух месяцев изучаю JAVA и не могу не воспользываться случаем чтобы у Вас спросить одно не понятное место с точки зрения языка (об котором я пака ни чего не нашел в книгах). Вот оно самое страшное место

Если в catch (Exception e) {} удалить скобки {}, в которых не чего не происходит, то возникает ошибка. Зачем же нужны эти скобки, если в них не чего не происходит? По внешнему виду catch (Exception e) {} походит на функцию, в теле которой не чего не происходит. Зачем тогда эта функция тут присутствует?
Это метод, в любом случае он должен иметь фигурные скобки - это вход в метод, если их нет значит в метод нету входа и он не рабочий. Это как диструктор.
1
05.03.2012, 20:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2012, 20:13
Привет! Вот еще темы с решениями:

Как отловить последние касание экрана (onTouchEvent)
Привет товарищи программисты :) Как отловить последние касание устройства? ...

OnTouchEvent() работает не при касании, а при касании + движение, почему?
Здравствуйте! Есть приложение, где выполняется определенное действие при...

Handlers в новом потоке
Почему не могу создать handlers в новом потоке ? Thread streamThread = new...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru