Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

18.02.2015, 23:36. Просмотров 366. Ответов 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, а уже его рисую на активити.

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

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

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

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

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

Android. Как прорисовать что-нибудь в SurfaceView используя canvas? - Java
Решения на подобии http://stackoverflow.com/questions/5650810/canvas-and-surfaceview-example-crash-freeze-memory-leak не рассматриваются...

Canvas растягивается на все окно, а нужно справа от холста оставить StackPanel - C# WPF
&lt;Window&gt; &lt;Grid&gt; &lt;DockPanel&gt; &lt;Canvas /&gt; &lt;StackPanel Orientation=&quot;Vertical&quot;&gt; ...

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

Как быть? Дайте совет кто разберается. Все говорят, что нужно полностью перерисовывать Canvas. Так и делаю Но почему часть изображения пропадает? Мне что отдельный Bitmap заводить, где я буду рисовать все что мне нужно, а потом его отрисовывать. Не зажирно???
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2015, 23:59
Привет! Вот еще темы с ответами:

Нужно вывести все объекты, у которых конечный родительский объект с определённым ID - SQL Server
Есть таблица, содержащая в себе данные по городам, домам и улицам есть поля id и id_parent Нужно вывести все объекты, у которых...

POJO может хранить объекты? - Java EE
Привет всем! Столкнулся с такой проблемой. Разрабатываю учебное вебприложение. Сделал классы POJO и теперь через setter наполняю их...

Можно хранить объекты на диске? - Java SE
Можно хранить объекты на диске и при необходимости восстановить с диска? Например, есть объект JEditorPane. Нужно его сохранить на диск и...

объекты Canvas - Delphi
Изобразите окружность диаметром d, перемещающуюся по вертикали через центр экрана.


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

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

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