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

При изменении мерцает SurfaceView

27.05.2017, 09:06. Просмотров 310. Ответов 0
Метки нет (Все метки)

В связи с достаточно низкой скоростью работы View решил использовать SurfaceView, но столкнулся с проблемой: содержимое на экране при перерисовке мерцает. Как исправить проблему? На View все было идеально.
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
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {
        DrawThread drawThread;
        
        public MySurfaceView(Context context) {
            super(context);
            getHolder().addCallback(this);
        }
 
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {   
        }
 
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            drawThread = new DrawThread(getHolder());
            drawThread.setRunning(true);
            drawThread.start();
        }
        
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            // завершаем работу потока
            drawThread.setRunning(false);
            while (true) {
                try {
                    drawThread.join();
                    break;
                } catch (InterruptedException e) {
                    // если не получилось, то будем пытаться еще и еще
                }
            }
        }
    }
    
    class DrawThread extends Thread {
        private boolean runFlag = false;
        private SurfaceHolder surfaceHolder;
        
        public DrawThread(SurfaceHolder surfaceHolder){
            this.surfaceHolder = surfaceHolder;
        }
 
        public void setRunning(boolean run) {
            runFlag = run;
        }
 
        @Override
        public void run() {
            Canvas canvas;
            while (runFlag) {
                canvas = null;
                try {
                    // получаем объект Canvas и выполняем отрисовку
                    canvas = surfaceHolder.lockCanvas();
                    synchronized (surfaceHolder) {
                        canvas.drawColor(Color.BLACK);
                        Paint p = new Paint();
                        p.setStyle(Paint.Style.FILL);
 
                        p.setColor(Color.RED);
                        p.setTextSize(26);
                        p.setAntiAlias(true);
 
                        for (int y = matrix2.length-1; y>=0; y--) {
                            for (int x = 0; x<matrix2[y].length; x++) {
                                for (int z = matrix2[y][x].length-1; z>=0; z--) { // идем сзада на перед, ибо 0 - самый близкий з
                                    if (matrix2[y][x][z] == null) continue;
                                    try { // понятие не имею почему пишет как нулл
                                        drawBlock(canvas, p, matrix2[y][x][z]);
                                        ArrayList<Cube> childs = matrix2[y][x][z].getChilds();
                                        for (int i = 0; i<childs.size(); i++) {
                                            drawBlock(canvas, p, childs.get(i));
                                        }
                                        break;
                                    } catch (Exception e) {
 
                                    }
                                }
                            }
                        }
                    }
                } 
                finally {
                    if (canvas != null) {
                        // отрисовка выполнена. выводим результат на экран
                        surfaceHolder.unlockCanvasAndPost(canvas);
                    }
                }
            }
        }
Очень прошу о помощи! Видео, в котором показана проблема: https://yadi.sk/i/eyUeGDvr3JYsyo

Добавлено через 16 часов 33 минуты
Как я понял, проблема кроется где-то в массивах... Так как if (matrix2[y][x][z] == null) возвращает false, а далее true. Пробовал synchronized(matrix2) - не помогло
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.05.2017, 09:06
Ответы с готовыми решениями:

SurfaceView при изменении ориентации экрана перегружается
при создании тетриса возник вопрос. один из моих классов расширяет класс SurfaceView public...

Мерцает изображение при перерисовке
Прочитал много тем по данному вопросу, 2 способа включения двойной буферизации не помогли, но так ...

Image Мерцает при перемещении!
Пишу 2D игру, хотел узнать почему при меремещении Image мерцает, есть исходник, если кто знает...

При выводе мерцает текст
Всем привет. Есть у меня в окне статик текст, для которого определил атрибуты шрифта, заполнив ...

Image мерцает при перетаскивании
Подскажите что нужно прописать??? Я сделал что бы image1 можно было перетаскивать, но когда я его...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2017, 09:06

При наведении блок мерцает
Есть 4 блока, при наведении изображение затемняется и появляется 4 иконки социалки. Но дело в том...

При движении объект мерцает
Я сделал анимацию управляемую таймером: LineShape1.X1 = LineShape1.X1 + 5 LineShape1.X2 =...

Мерцает PictureBox при движении
PictureBox движется по нажатию кнопки, по таймеру, на нем прозрачный фон, у него есть родитель...


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

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

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