Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
1ые
1 / 1 / 0
Регистрация: 19.01.2013
Сообщений: 98
#1

Обработка событий + прорисовка - Android

27.10.2014, 16:39. Просмотров 490. Ответов 2
Метки нет (Все метки)

Доброго времени суток, создаю свое первое приложение на Android. У меня есть прорисовка в отдельном потоке и обработка событий, проблемма в том что в debugе все работает как надо, а при запуске на эмуляторе в обычном режиме срабатывает только первый раз.

Кода достаточно много так что привожу только ту часть которая отвечает за обработку событий и прорисовку

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
@Override
    public boolean onTouchEvent(MotionEvent event)
    {
        int action = event.getAction();
        int count  = event.getHistorySize();
        int step  = 0;
        int oldX = 0;
        int oldY = 0;
        if ((action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE) && count != 0)
        {
            oldX = (int) event.getHistoricalX(0);
            oldY = (int) event.getHistoricalY(0);
            for(int i =0; i < count;    i++)
            {
                curx = (int)event.getHistoricalX(i);
                cury =  (int)event.getHistoricalY(i);
                boolean var = Math.abs(curx-oldX) > Math.abs(cury-oldY);
                if(var == true) {
                    if (curx < oldX) {
                        if (cur_direction == direction.LEFT)
                            step += oldX - curx;
                        else
                            step = oldX - curx;
                        while (step > 100) {
                            dir.offer(direction.LEFT);/*dir это список где я храню последовательность шагов*/
                            step -= 100;
                        }
                        cur_direction = direction.LEFT;
                    } else if (curx > oldX) {
                        if (cur_direction == direction.RIGHT)
                            step += curx - oldX;
                        else
                            step = curx - oldX;
                        while (step > 100) {
                            dir.offer(direction.RIGHT);
                            step -= 100;
                        }
                        cur_direction = direction.RIGHT;
                    }
                }else
                    {
                        if (cury < oldY)
                        {
                            if (cur_direction == direction.UP)
                                step += oldY-cury;
                            else
                                step = oldY-cury;
                            while (step > 100) {
                                dir.offer(direction.UP);
                                step-=100;
                            }
                            cur_direction = direction.UP;
                        }
                        else if (cury >  oldY){
                            if (cur_direction == direction.DOWN)
                                step += cury-oldY;
                            else
                                step = cury-oldY;
                            while(step > 100) {
                                dir.offer(direction.DOWN);
                                step-=100;
                            }
                            cur_direction = direction.DOWN;
                        }
                    }
                oldX = curx;
                oldY = cury;
            }
        }
        return true;
    }
Вот прорисовка.
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
public class SurfaceClass extends SurfaceView implements Runnable
    {
        Thread mythread = null;
        final SurfaceHolder holder = getHolder();
        Canvas c;
}
public SurfaceClass(Context context)
        {
            super(context);
            running = false;
        }
 
        public void pause()
        {
            running = false;
            boolean var= true;
            while(var)
            {
                try {
                    mythread.join();
                    var = false;
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        public void resume()
        {
            mythread = new Thread(this);
            running = true;
            mythread.start();
 
        }
        public void run()
        {
            while(running) {
                if (!holder.getSurface().isValid())
                    continue;
                c = holder.lockCanvas();
                c.drawColor(Color.BLACK);
                h = c.getHeight()/koly;
                w = c.getWidth()/kolx;
                p.setColor(Color.BLACK);
                c.drawRect(0,0,c.getWidth(),c.getHeight(),p);
                p.setColor(Color.GREEN);
                for(int i = 0; i < koly;i++)
                    for(int j = 0; j < kolx;j++)
                    {
                        if(!G.Versh[i*kolx+j].contains(i*kolx+j+1))
                            c.drawLine((j+1)*w, i*h, (j+1)*w, (i+1)*h,p);
                        if(!G.Versh[i*kolx+j].contains((i+1)*kolx+j))
                            c.drawLine(j*w, (i+1)*h, (j+1)*w, (i+1)*h,p);
                    }
                if(!dir.isEmpty())/*Вот тут прорисовка объекта который должен реагировать на движение*/
                {
                    switch (dir.poll())
                    {
                        case LEFT:
                        {
                            if(Player_x> 0 && G.Versh[Player_y*kolx+Player_x].contains(Player_y*kolx+Player_x-1)) {
                                for (int i = 0; i < w; i++) {
                                    drawplayer((Player_x*w+w/2) - i, Player_y*h+h/2);
                                }
                                Player_x-=1;
                            }
                            else
                                drawplayer(Player_x*w+w/2,Player_y*h+h/2);
                        }
                        break;
                        case RIGHT:
                        {
                            if(Player_x < kolx-1 && G.Versh[Player_y*kolx+Player_x].contains(kolx*Player_y+Player_x+1)) {
                                for (int i = 0; i < w; i++) {
                                    drawplayer((Player_x*w+w/2) + i, Player_y*h+h/2);
                                }
                                Player_x+=1;
                            }
                            else
                                drawplayer(Player_x*w+w/2,Player_y*h+h/2);
                        }
                        break;
                        case UP:
                        {
                            if(Player_y > 0 && G.Versh[Player_y*kolx+Player_x].contains((Player_y-1)*kolx+Player_x)) {
                                for (int i = 0; i < h; i++) {
                                    drawplayer(Player_x*w+w/2, (Player_y*h+h/2)-i);
                                }
                                Player_y-=1;
                            }
                            else
                                drawplayer(Player_x*w+w/2,Player_y*h+h/2);
                        }
                        break;
                        case DOWN:
                        {
                            if(Player_y < koly-1 && G.Versh[Player_y*kolx+Player_x].contains((Player_y+1)*kolx+Player_x)) {
                                for (int i = 0; i < h; i++) {
                                    drawplayer(Player_x*w+w/2, (Player_y*h+h/2)+i);
                                }
                                Player_y+=1;
                            }else
                                drawplayer(Player_x*w+w/2,Player_y*h+h/2);
                        }
                    }
                }
                else
                    drawplayer(Player_x*w+w/2,Player_y*h+h/2);
                /*draw_Out();*/
                holder.unlockCanvasAndPost(c);
 
            }
        }
Пробовал в интернете искать, но честно говоря не особо представляю в каком направлении искать. С кодом все в порядке никаких ошибок нет, но при запуске на эмуляторе объект который должен двигаться никак на движение не реагирует при этом все остальное работает нормально, меню кнопки переходы между активити.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2014, 16:39     Обработка событий + прорисовка
Посмотрите здесь:

Android Обработка событий для массива кнопок
Android Обработка событий
DatePickerDialog на нескольких обработчиках событий Android
Android перехват событий в Intent.ACTION_VIEW
Обработчик событий для ImageButton Android
Прорисовка не на весь экран Android
Обработчик событий в табхост Android
Обработка событий при работе с sqlite Android
Обработка событий в Service Android
Прорисовка элементов в ListView Android
Android Обработка событий в ExpandableListView
Android Обработка событий дочерним и родительским элементами

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
28.10.2014, 05:17     Обработка событий + прорисовка #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Искать в таком большом коде чужую ошибку - ОЧЕНЬ тяжело!
Советую воспользоваться логированием! Через текстовики или хотя-бы через Log.i("что-то делаем №1");
Я постоянно этим пользуюсь. Сможешь хоть узнать где перестает работать...

Эмулятором не пользуюсь, но по идее разницы быть не должно! НИКАКОЙ! Разве что на эмуляторе тяжело мультитач тестировать за неимением "второго пальца".
1ые
1 / 1 / 0
Регистрация: 19.01.2013
Сообщений: 98
28.10.2014, 13:16  [ТС]     Обработка событий + прорисовка #3
Да, спасибо уже разобрался в чем была проблема просто неправильно обрабатывал касания, я думал что event.getHistorySize() - возвращает сколько точек прошло текущее касание, оказывается данный метод возвращает количество касаний.
Yandex
Объявления
28.10.2014, 13:16     Обработка событий + прорисовка
Ответ Создать тему
Опции темы

Текущее время: 12:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru