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

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

Войти
Регистрация
Восстановить пароль
 
some_name
Вежливость-главное оружие
221 / 221 / 55
Регистрация: 19.02.2013
Сообщений: 1,430
#1

SurfaceView Canvas нужно ли хранить все отрисовываемые объекты? - Android

18.02.2015, 23:36. Просмотров 339. Ответов 1
Метки нет (Все метки)

Здравствуйте!

Вот код моего активити:
Кликните здесь для просмотра всего текста
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
public class CanvasActivity extends Activity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new DrawView(this));
    }
 
    class DrawView extends SurfaceView implements SurfaceHolder.Callback {
 
        private DrawThread drawThread;
 
        public DrawView(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) {
            boolean retry = true;
            drawThread.setRunning(false);
            while (retry) {
                try {
                    drawThread.join();
                    retry = false;
                } catch (InterruptedException e) {
                }
            }
        }
 
        class DrawThread extends Thread {
 
            private boolean running = false;
            private SurfaceHolder surfaceHolder;
 
            public DrawThread(SurfaceHolder surfaceHolder) {
                this.surfaceHolder = surfaceHolder;
            }
 
            public void setRunning(boolean running) {
                this.running = running;
            }
 
            @Override
            public void run() {
                Canvas canvas;
                long start = System.currentTimeMillis();
                Random g = new Random();
                Paint paint = new Paint();
                while (System.currentTimeMillis() - start < 5_000) {
                    canvas = null;
                    try {
                        canvas = surfaceHolder.lockCanvas(null);
                        if (canvas == null)
                            continue;
                        int x = g.nextInt(canvas.getWidth());
                        int y = g.nextInt(canvas.getHeight());
                        int r = g.nextInt(10);
                        int c = Color.rgb(g.nextInt(255), g.nextInt(255), g.nextInt(255));
                        paint.setColor(c);
                        canvas.drawCircle(x - r/2, y - r/2, r, paint);
                    } finally {
                        if (canvas != null) {
                            surfaceHolder.unlockCanvasAndPost(canvas);
                        }
                    }
                }
            }
        }
    }
}


В методе run класса DrawThread выполняется отрисовка огружностей в разных местах, расного радиуса и цвета.

Но проблема в том, что после отрисовки часть из них исчезает. Т.е. я запустил приложение, вижу как появляются точки на активити. После окончания отрисовки, часть из низ просто пропадает.

Когда же все созданные окружности я храню в списке, то такой проблемы нет.

Поэтому вопрос, мне нужно хранить все объекты, которые я рисую? Даже если мне нужно сделать это один раз?

З.Ы, Куда делвается часть окружностей?

Заранее спс!

Добавлено через 4 часа 1 минуту
Елки палки!

Вот такой код:
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        canvas = mSurfaceHolder.lockCanvas();
        canvas.drawCircle(50, 50, 50, paint);
        mSurfaceHolder.unlockCanvasAndPost(canvas);
 
        canvas = mSurfaceHolder.lockCanvas();
        canvas.drawCircle(90, 80, 50, paint);
        mSurfaceHolder.unlockCanvasAndPost(canvas);
 
        canvas = mSurfaceHolder.lockCanvas();
        canvas.drawCircle(130, 110, 50, paint);
        mSurfaceHolder.unlockCanvasAndPost(canvas);
 
        canvas = mSurfaceHolder.lockCanvas();
        canvas.drawCircle(160, 140, 50, paint);
        mSurfaceHolder.unlockCanvasAndPost(canvas);


Рисуется только 1-й и последный круги!!! Какого черта!
А если пишу в
Java
1
while(true){....}
, то картинка моргает.

Добавлено через 35 минут
Вообщем пока сделал так:
Кликните здесь для просмотра всего текста

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
public abstract class Sample extends Thread{
    protected boolean mIsRunning = false;
    protected SurfaceHolder mSurfaceHolder;
    protected Bitmap mBitmapSurface;
    protected Canvas mCanvasBitmap;
    protected int mWidth;
    protected int mHeight;
 
    public void initialize(SurfaceHolder surfaceHolder){
        mWidth = surfaceHolder.getSurfaceFrame().width();
        mHeight = surfaceHolder.getSurfaceFrame().height();
        mBitmapSurface = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
        mCanvasBitmap = new Canvas(mBitmapSurface);
        mSurfaceHolder = surfaceHolder;
    }
 
    public void setIsRunning(boolean mIsRunning) {
        this.mIsRunning = mIsRunning;
    }
}
 
 
class BoomSample extends Sample {
    private static final Random G = new Random();//generator
 
    @Override
    public void run() {
        long start = System.currentTimeMillis();
        Paint paint = new Paint();
        float xo = mWidth / 2;
        float yo = mHeight - 50;
        paint.setStrokeWidth(3);
        paint.setColor(Color.YELLOW);
        while (System.currentTimeMillis() - start < 5_000) {
            int x = G.nextInt(mWidth);
            int y = G.nextInt(mHeight);
            int c = Color.rgb(G.nextInt(255), G.nextInt(255), G.nextInt(255));
            int r = G.nextInt(5);
            paint.setColor(c);
            mCanvasBitmap.drawCircle(x, y, r, paint);
            Canvas canvas = null;
            try {
                canvas = mSurfaceHolder.lockCanvas();
                canvas.drawBitmap(mBitmapSurface, 0, 0, paint);
            } finally {
                if (canvas != null) {
                    mSurfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
        }
    }
}


Т.е. рисую на Bitmap, а уже его рисую на активити.

Не знаю тру ли это, но... но лучше ничего не придумал.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2015, 23:36     SurfaceView Canvas нужно ли хранить все отрисовываемые объекты?
Посмотрите здесь:

SurfaceView + onKeyDown Android
Android Ошибка в SurfaceView
Android SurfaceView не отображается
Android Мерцание в SurfaceView
Android Camera без SurfaceView
Android Вспомогательный поток в SurfaceView
Android SurfaceView&Canvas
Android Работа с SurfaceView
Как растянуть surfaceview на все activity? Android
Canvas, SurfaceView, Touch Android
Android Можно ли хранить во ViewPager не только элементы (объекты), но и какую-то переменную?
Восстановление SurfaceView Android

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
some_name
Вежливость-главное оружие
221 / 221 / 55
Регистрация: 19.02.2013
Сообщений: 1,430
26.02.2015, 23:59  [ТС]     SurfaceView Canvas нужно ли хранить все отрисовываемые объекты? #2
Народ, каким образом можно сделать постепенную отрисовку на канвас? У меня приложение по нажатию на кнопку "заливает" канвас по градиенту каким-нубидь цветом. Хочу что бы можно было видеть, как рисуются пиксели. Но по ка не получается это сделать, так как часть изображения пропадает после заверешения отрисовк.

Как быть? Дайте совет кто разберается. Все говорят, что нужно полностью перерисовывать Canvas. Так и делаю Но почему часть изображения пропадает? Мне что отдельный Bitmap заводить, где я буду рисовать все что мне нужно, а потом его отрисовывать. Не зажирно???
Yandex
Объявления
26.02.2015, 23:59     SurfaceView Canvas нужно ли хранить все отрисовываемые объекты?
Ответ Создать тему
Опции темы

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