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

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

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

Обработка событий + прорисовка - Программирование Android

27.10.2014, 16:39. Просмотров 508. Ответов 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
Добрый день!Пишу в данный момент книгу-приложение.Вопрос такой:как можно заменить if;else или это будет самое просто решение? Тоесть...

Обработка событий в ExpandableListView - Программирование Android
Всем привет. Только начал осваивать Android Studio как столкнулся с рядом проблем: у меня есть Список-дерево ExpandableListView в которой...

Обработка событий в Service - Программирование Android
Ребят,как можно отловить события в Service? Что-то не совсем могу понять как сделать,может это вообще не возможно?:D

Обработка событий для массива кнопок - Программирование Android
Здравствуйте. У меня в программе создается массив из N ImageButton. и для каждой кнопки нужно обработать событие нажатия. //это...

Обработка событий при работе с sqlite - Программирование Android
Добрый день, утоните пожалуйста как правильно отработать событие. При обработке SQL запроса если после условия WHERE = идет...

Обработка событий дочерним и родительским элементами - Программирование Android
Здравствуйте, Всем... В HTML + JS было так.. например: &lt;div&gt; &lt;ul&gt; &lt;li&gt; &lt;a href=&quot;&quot;&gt;Link&lt;/a&gt; ...

Прорисовка не на весь экран - Программирование Android
На эмуляторе 480х800 все идеально а на планшете рисует заужено Ориентация стоит портретная &lt;activity ...

Прорисовка элементов в ListView - Программирование Android
Доброго дня. Необходимо сделать свой список с своим View, нашёл статью и сделал как в ней. Но поведение CheckBox'ов оказалось поломанное....

Обработчик событий в табхост - Программирование Android
Подскажите метод для присвоение дествия вкладки по нажатию. Например при переходе на 1 вкладку обновляеться инфа в ListView на активити.

DatePickerDialog на нескольких обработчиках событий - Программирование Android
Здравствуйте! Помогите разобраться: есть активити, на котором два button'а, один из них уже создает DatePickerDialog, а как можно со ...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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     Обработка событий + прорисовка
Ответ Создать тему
Опции темы

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