Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
1ые
1 / 1 / 3
Регистрация: 19.01.2013
Сообщений: 98
#1

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

27.10.2014, 16:39. Просмотров 600. Ответов 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);
 
            }
        }
Пробовал в интернете искать, но честно говоря не особо представляю в каком направлении искать. С кодом все в порядке никаких ошибок нет, но при запуске на эмуляторе объект который должен двигаться никак на движение не реагирует при этом все остальное работает нормально, меню кнопки переходы между активити.
http://www.cyberforum.ru/android-dev/thread867034.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2014, 16:39
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Обработка событий + прорисовка (Программирование Android):

Обработка событий в Service
Ребят,как можно отловить события в Service? Что-то не совсем могу понять как...

Обработка событий в цикле
Здравствуйте! Есть массив параметров ArrayList&lt;int&gt; params = new...

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

Обработка событий дочерним и родительским элементами
Здравствуйте, Всем... В HTML + JS было так.. например: &lt;div&gt; &lt;ul&gt;...

Обработка событий для массива кнопок
Здравствуйте. У меня в программе создается массив из N ImageButton. и для...

2
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
28.10.2014, 05:17 #2
Лучший ответ Сообщение было отмечено 1ые как решение

Решение

Искать в таком большом коде чужую ошибку - ОЧЕНЬ тяжело!
Советую воспользоваться логированием! Через текстовики или хотя-бы через Log.i("что-то делаем №1");
Я постоянно этим пользуюсь. Сможешь хоть узнать где перестает работать...

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

Обработка событий при работе с sqlite
Добрый день, утоните пожалуйста как правильно отработать событие. При...

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

Keyboard прорисовка кнопок
Здравствуйте. Делаю клавиатуру, хочу чтобы в верхнем ряду, рядом с каждой...

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


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

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

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