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

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

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

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

18.02.2015, 23:36. Просмотров 353. Ответов 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 нужно ли хранить все отрисовываемые объекты?
Посмотрите здесь:

Canvas, SurfaceView, Touch - Программирование Android
Всем добра. Возник один баг (может в коде проблема), который неприятно выглядит в приложении. Рисуя с помощью SurfaceView, Canvas...

SurfaceView&Canvas - Программирование Android
Подскажите, как реализовать отображение, например, карандашика, когда рисуешь на Canvas в SurfaceView. В какую сторону копать, чтобы такое...

Можно ли хранить во ViewPager не только элементы (объекты), но и какую-то переменную? - Программирование Android
Добрый вечер! Столкнулся с необходимостью использовать ViewPager и PagerAdapter. Подскажите пожалуйста, можно ли хранить во ViewPager...

Как растянуть surfaceview на все activity? - Программирование Android
У активити какая то дурацкая область по периметру, на которой нельзя размещять никакие компоненты.В итоге вокруг surfaceview получаеться...

Ошибка в SurfaceView - Программирование Android
есть игра. отрисовка идет через SurfaceView и поток привязанный к нему. ошибка возникает в следующем моменте - я открываю сам игровой...

Мерцание в SurfaceView - Программирование Android
Всем привет! Рисую на SurfaceView фон и на нем анимированные объекты. Кадры беру из атласа. Появилось мерцание, причем фон не мерцает а...

Работа с SurfaceView - Программирование Android
Отрисовка в SurfaceView никогда не вызывала трудностей, до тех пор, пока не запустил приложение на телефоне с экраном 1920х1080px. Фпс упал...

Узнать фон SurfaceView - Программирование Android
Как узнать фон SurfaceView? mSurfaceViewLeft = (SurfaceView)findViewById(R.id.surfaceViewLeft); mSurfaceViewRight =...

Простейший пример SurfaceView - Программирование Android
Здравствуйте. Напишите пожалуйста простейшую программу рисующую точку на экране с помощью SurfaceView.

Вращение фигуры в SurfaceView - Программирование Android
Сейчас фигура вращается с помощью функции glRotate, все работает, и она вращается при запуске. Как сделать, чтобы фигура вращалась не...

Camera без SurfaceView - Программирование Android
Здравствуйте. Можно ли сделать снимок с помощью класса Camera без предварительного просмотра? Например Camera.open() и потом сразу...

Вспомогательный поток в SurfaceView - Программирование Android
Правильно ли использовать дополнительный поток в SurfaceView? Т.е. допустим для обработки долгого касания экрана, удержания. В 42-й и...


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

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

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

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