Clear all canvas android

Android, canvas: How do I clear (delete contents of) a canvas (= bitmaps), living in a surfaceView?

In order to make a simple game, I used a template that draws a canvas with bitmaps like this:

(The canvas is defined in «run()» / the SurfaceView lives in a GameThread.)

My first question is how do I clear (or redraw) the whole canvas for a new layout?
Second, how can I update just a part of the screen?

19 Answers 19

Draw transparent color with PorterDuff clear mode does the trick for what I wanted.

How do I clear (or redraw) the WHOLE canvas for a new layout (= try at the game) ?

Just call Canvas.drawColor(Color.BLACK) , or whatever color you want to clear your Canvas with.

And: how can I update just a part of the screen ?

There is no such method that just update a «part of the screen» since Android OS is redrawing every pixel when updating the screen. But, when you’re not clearing old drawings on your Canvas , the old drawings are still on the surface and that is probably one way to «update just a part» of the screen.

So, if you want to «update a part of the screen», just avoid calling Canvas.drawColor() method.

Found this in google groups and this worked for me..

This removes drawings rectangles etc. while keeping set bitmap..

use the reset method of Path class

I tried the answer of @mobistry:

But it doesn’t worked for me.

The solution, for me, was:

Maybe some one has the same problem.

please paste below code on surfaceview extend class constructor.

Here is the code of a minimal example showing that you always have to redraw every pixel of the Canvas at each frame.

This activity draw a new Bitmap every second on the SurfaceView, without clearing the screen before. If you test it, you will see that the bitmap is not always written to the same buffer, and the screen will alternate between the two buffers.

I tested it on my phone (Nexus S, Android 2.3.3), and on the emulator (Android 2.2).

For me calling Canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR) or something similar would only work after I touch the screen. SO I would call the above line of code but the screen would only clear after I then touched the screen. So what worked for me was to call invalidate() followed by init() which is called at the time of creation to initialize the view.

Erasing on Canvas in java android is similar erasing HTML Canvas via javascript with globalCompositeOperation. The logic was similar.

U will choose DST_OUT (Destination Out) logic.

Note: DST_OUT is more useful because it can erase 50% if the paint color have 50% alpha. So, to clear completely to transparent, the alpha of color must be 100%. Apply paint.setColor(Color.WHITE) is recommended. And make sure that the canvas image format was RGBA_8888.

After erased, go back to normal drawing with SRC_OVER (Source Over).

Update small area display literally will need to access graphic hardware, and it maybe not supported.

The most close for highest performance is using multi image layer.

Don’t forget to call invalidate();

With the following approach, you can clear the whole canvas or just a part of it.
Please do not forget to disable Hardware acceleration since PorterDuff.Mode.CLEAR doesn’t work with hardware acceleration and finally call setWillNotDraw(false) because we override the onDraw method.

Try to remove the view at onPause() of an activity and add onRestart()

LayoutYouAddedYourView.addView(YourCustomView); LayoutYouAddedYourView.removeView(YourCustomView);

The moment you add your view, onDraw() method would get called.

YourCustomView, is a class which extends the View class.

In my case, I draw my canvas into linearlayout. To clean and redraw again:

and then, I call the class with the new values:

This is the class Lienzo:

In my case, creating canvas every time worked for me, even though it’s not memory-friendly

Your first requirement, how to clear or redraw whole canvas — Answer — use canvas.drawColor(color.Black) method for clearing the screen with a color of black or whatever you specify .

Читайте также:  Android meta data xml

Your second requirement, how to update part of the screen — Answer — for example if you want to keep all other things unchanged on the screen but in a small area of screen to show an integer(say counter) which increases after every five seconds. then use canvas.drawrect method to draw that small area by specifying left top right bottom and paint. then compute your counter value(using postdalayed for 5 seconds etc., llike Handler.postDelayed(Runnable_Object, 5000);) , convert it to text string, compute the x and y coordinate in this small rect and use text view to display the changing counter value.

I had to use a separate drawing pass to clear the canvas (lock, draw and unlock):

Источник

Android, canvas: Как очистить (удалить содержимое) холста (= растровые изображения), живущего в surfaceView?

чтобы сделать простую игру, я использовал шаблон, который рисует холст с растровыми изображениями, как это:

(холст определен в «run ()» / SurfaceView живет в GameThread.)

мой первый вопрос: Как очистить (или перерисовать) в весь холст для нового макета?
Во-вторых, как я могу обновить только часть экрана?

14 ответов

Как очистить (или перерисовать) весь холст для нового макета (=попробовать в игре) ?

просто позвони Canvas.drawColor(Color.BLACK) , или любой цвет вы хотите очистить свой Canvas С.

и: как я могу обновить только часть экрана ?

нет такого метода, который просто обновляет «часть экрана», так как Android OS перерисовывает каждый пиксель при обновлении экрана. Но, когда вы не очищаете старый рисунки на Canvas , старые рисунки все еще находятся на поверхности, и это, вероятно, один из способов «обновить только часть» экрана.

Итак, если вы хотите «обновить часть экрана», просто избегайте вызова Canvas.drawColor() метод.

Draw прозрачный цвет с PorterDuff clear mode делает трюк для того, что я хотел.

нашел это в группах google, и это сработало для меня..

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

я попробовал ответ @mobistry:

но это не сработало для меня.

решение для меня было:

может быть, у кого-то такая же проблема.

используйте метод reset класса Path

пожалуйста, вставьте ниже код на конструкторе класса расширения surfaceview.

попробуйте код выше.

для меня вызов Canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR) или что-то подобное будет работать только после того, как я коснитесь экрана. Поэтому я бы вызвал вышеуказанную строку кода, но экран очистится только после того, как я коснусь экрана. Так что у меня получилось позвонить invalidate() следовал по init() который вызывается во время создания для инициализации представления.

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

это действие рисует новое растровое изображение каждую секунду на SurfaceView, не очищая экран раньше. Если вы протестируете его, вы увидите, что растровое изображение не всегда записывается в один и тот же буфер, и экран будет чередоваться между двумя буферами.

Я тестировал его на своем телефоне (Nexus S, Android 2.3.3) и на эмуляторе (Android 2.2).

мне пришлось использовать отдельный чертеж прохода, чтобы очистить холст (блокировка и разблокировка):

ваше первое требование, как очистить или перерисовать весь холст-ответ — используйте холст.drawColor(цвет.Черный) метод очистки экрана с цветом черного или что вы укажете .

Источник

Как очистить canvas?

Как очистить Canvas, чтобы не пропал цвет фона?
Здравствуйте! Подскажите как правильно очистить Canvas, что бы не пропал цвет фона.

Очистить Canvas
Подскажите, как очистить канву, чтобы не пропали динамически созданные на ней элементы. При.

Есть способ очистить Canvas?
Собственно нужно коим-то образом очистить канву.Все линии которые построены на форме через.

Canvas html5, как разместить черный пискель в центре canvas’a?
как разместить черный пискель в центре canvas’a?

а варианта импортировать не предлагает?

Добавлено через 37 секунд
android.graphics.PorterDuff.Mode доступен с API level 1

Как добиться одинакового размера шрифта при выводе на Image.Canvas и Printer.Canvas
Здравствуйте! Подскажите, пожалуйста, как добиться одинакового размера шрифта при выводе на.

Можно ли одной процедурой рисовать на Image.Canvas и Printer.Canvas
Здравствуйте, пожалуйста, подскажите можно ли одной процедурой рисовать на Image.Canvas и.

построить функцию y=kx+b (линейная функция) с помощью Vcart или canvas (form.canvas)
Надо построить функцию y=kx+b (линейная функция) с помощью Vcart или canvas (form.canvas)

Ошибка при попытке очистить дерево дважды или попытке очистить и заново заполнить
Привет, нужно написать программу с деревьями ( VS, формы) однако возникли проблемы: есть функции .

Как можно заблокировать очередь и как ее очистить и терять поступающие заявки?
Уважаемый администратор Сергей, господа посетители форума! Не поможете ли разобраться с тем как.

Я сохраняю html как текст, а как txt очистить от тегов?
напр. в txt ТУТ любой Текст должно получиться: Тут любоай текст

Читайте также:  Синхронизация андроида с gmail

Источник

Android, canvas: Как очистить (удалить содержимое) холста (= растровые изображения), живущего в surfaceView?

Чтобы сделать простую игру, я использовал шаблон, который рисует холст с растровыми изображениями следующим образом:

(Холст определяется в «run ()» / SurfaceView живет в GameThread.)

Мой первый вопрос: как очистить (или перерисовать) весь холст для нового макета?
Во-вторых, как я могу обновить только часть экрана?

Как очистить (или перерисовать) холст WHOLE для нового макета (= попробовать в игре)?

Просто вызовите Canvas.drawColor(Color.BLACK) или любой цвет, который вы хотите очистить от Canvas .

И: как я могу обновить только часть экрана?

Нет такого метода, который просто обновляет «часть экрана», поскольку ОС Android перерисовывает каждый пиксель при обновлении экрана. Но, когда вы не очищаете старые рисунки на своем Canvas , старые рисунки все еще остаются на поверхности, и это, вероятно, один из способов «обновить только часть» экрана.

Итак, если вы хотите «обновить часть экрана», просто не Canvas.drawColor() метод Canvas.drawColor() .

Нарисовать прозрачный цвет с прозрачным режимом PorterDuff делает трюк за то, что я хотел.

Нашел это в группах google, и это сработало для меня ..

Это удаляет рисунки прямоугольников и т. Д., Сохраняя заданное растровое изображение.

Я попробовал ответить @mobistry:

Но это не сработало для меня.

Решение для меня было следующим:

Возможно, у кого-то такая же проблема.

Используйте метод сброса класса Path

Для меня вызов Canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR) или что-то подобное будет работать только после того, как я коснусь экрана. Я бы назвал указанную выше строку кода, но экран будет очищен только после того, как я коснулся экрана. Так что для меня работало, чтобы вызвать invalidate() за которым следует init() который вызывается во время создания для инициализации представления.

Вот код минимального примера, показывающий, что вам всегда приходится перерисовывать каждый пиксель холста в каждом кадре.

Эта активность рисует новый битмап каждую секунду в SurfaceView, не очищая экран раньше. Если вы проверите это, вы увидите, что растровое изображение не всегда записывается в один и тот же буфер, и экран будет чередоваться между двумя буферами.

Я тестировал его на своем телефоне (Nexus S, Android 2.3.3) и на эмуляторе (Android 2.2).

Пожалуйста, вставьте ниже код в конструктор класса classviewview ………….

Источник

Класс Canvas

Класс android.graphics.Canvas (Холст) предоставляет методы для рисования, которые отображают графические примитивы на исходном растровом изображении. При этом надо сначала подготовить кисть (класс Paint), который позволяет указывать, как именно графические примитивы должны отображаться на растровом изображении (цвет, обводка, стиль, сглаживание шрифта и т.д.).

Android поддерживает полупрозрачность, градиентные заливки, округлённые прямоугольники и сглаживание. Из-за ограниченных ресурсов векторная графика пока что не поддерживается, вместо этого используется традиционная растровая перерисовка.

Canvas работает с пикселями, поэтому следует заботиться о конвертации единиц dp в px и наоборот при необходимости. Начало координат находится в левом верхнем углу.

Получить доступ к холсту можно через объект Bitmap или компонент View. Очень часто разработчики создают свой собственный компонент, наследуясь от View, и рисуют на его холсте для реализации своих замыслов.

Методы

Ниже представлены некоторые методы класса Canvas, которые что-то рисуют.

  • drawARGB()/drawRGB()/drawColor(). Заполняет холст сплошным цветом.
  • drawArc(). Рисует дугу между двумя углами внутри заданной прямоугольной области.
  • drawBitmap(). Рисует растровое изображение на холсте. Вы можете изменять внешний вид целевой картинки, указывая итоговый размер или используя матрицу для преобразования.
  • drawBitmapMesh(). Рисует изображение с использованием сетки, с помощью которой можно управлять отображением итоговой картинки, перемещая точки внутри неё.
  • drawCircle(). Рисует круг/окружность с определённым радиусом вокруг заданной точки.
  • drawLine(s)(). Рисует линию (или последовательность линий) между двумя точками.
  • drawOval(). Рисует овал на основе прямоугольной области.
  • drawPaint(). Закрашивает весь холст с помощью заданного объекта Paint.
  • drawPath(). Рисует указанный контур, используется для хранения набора графических примитивов в виде единого объекта.
  • drawPicture(). Рисует объект Picture внутри заданного прямоугольника.
  • drawPoint(). Рисует точку в заданном месте.
  • drawPosText(). Рисует текстовую строку, учитывая смещение для каждого символа.
  • drawRect(). Рисует прямоугольник.
  • drawRoundRect(). Рисует прямоугольник с закруглёнными углами.
  • drawText(). Рисует текстовую строку на холсте. Шрифт, размер, цвет и свойства отображения текста задаются в соответствующем объекте Paint.
  • drawTextOnPath(). Рисует текст, который отображается вокруг определённого контура.
  • drawVertices(). Рисует набор треугольников в виде совокупности вершинных (вертексных) точек.
  • rotate() и restore(). Вращение холста
  • Методы scale() и translate(). Изменение и перемещение координатной системы

Мы уже изучали основы рисования в первом месяце обучения (Работаем с графикой. Основы). Можно вернуться к этому проекту, закомментировать код вывода графики и продолжить изучение рисования при помощи методов класса Canvas.

Метод drawArc()

В API 21 появилась перегруженная версия метода, в котором можно указать координаты двух точек вместо RectF.

Метод drawArc() позволяет рисовать дуги и сектора. Ниже приводится код для трёх вариантов: сектор с заливкой (похож на PacMan), сектор без заливки (контур) и часть дуги:

Читайте также:  Lingualeo переводчик для андроид

Метод drawBitmap()

Вывести готовое изображение просто.

Метод drawCircle()

Первые два аргумента определяют координаты центра окружности/круга, следующий аргумент — её радиус в пикселах, последний — объект Paint. В зависимости от выбранного стиля кисти можно нарисовать закрашенный круг или только окружность.

Нарисуем зелёный круг.

drawLine(s)()

Простой метод — указываем начальные и конечные координаты отрезка.

Метод drawOval()

Метод drawOval() рисует овалы. Естественно, если вы зададите одинаковые размеры ширины и высоты, то получите круг/окружность.

Если вам нужно наклонить овал в ту или иную сторону, то поверните холст на требуемый угол с помощью метода rotate(). Не забудьте потом повернуть холст обратно, что следующие фигуры выводились нормально.

Повернём синий овал из предыдущего примера:

В API 21 появилась перегруженная версия метода, в котором можно указать координаты двух точек вместо RectF:

Метод drawPaint()

Метод позволяет закрасить весь холст одним цветом.

Метод drawRect()

У метода существует три перегруженные версии для рисования прямоугольника. Рассмотрим один из них:

Метод drawRoundRect()

Для рисования прямоугольников с закруглёнными углами используется метод drawRoundRect (RectF rect, float rx, float ry, Paint paint).

В параметрах указываются ограничивающий прямоугольник, радиусы овалов для скругления углов и кисть.

Реализуем три разных способа:

В API 21 появилась перегруженная версия метода, в котором можно указать координаты двух точек вместо RectF.

Метод drawPath()

Для рисования соединённых отрезков можно использовать метод drawPath(), указав в параметрах настройки для рисования и массив координат точек. Для удобства добавим в класс Draw2D новый класс Pt, который позволит быстро создать массив точек с заданными координатами. Далее настраиваем объекты для рисования и формируем путь через созданный массив. В результате получим кошкин дом.

Путь можно составлять не только из точек, но и из фигур, например, дуг. Сначала формируем дугу, добавляем её в путь при помощи метода Path.addArc(), повторяем операцию снова несколько раз, а в конце выводим окончательный вариант:

Можно нарисовать символ парашюта:

Метод drawPoint()

Простой метод для рисования точки в нужно месте указанной кистью. Для координат используются значения типа float.

Метод drawText()

С помощью метода drawText() можно выводить текст в заданной позиции. Добавим сначала несколько эффектов, чтобы казалось, что текст парит над поверхностью:

Центрируем текст

Есть небольшая тонкость, если вам захочется вывести текст в центре холста. Проблем с вычислением центра холста и размером текста нет. Центр можно найти, разделив пополам значения ширины и высоты холста. А ширину и высоту текста можно узнать через метод кисти getTextBounds(), который возвращает ограничивающий прямоугольник.

Но вычисление ширины текста через textBounds.width(); приводит к небольшому смещению. Лучше воспользоваться методом кисти measureText(). Тогда текст отцентрируется точнее.

Пример на Kotlin с дополнительной информацией.

Методы rotate() и restore()

Холст во время рисования можно вращать. Во многих ситуациях такой приём менее затратный по ресурсам, чем рисование самого объекта под углом. Суть в следующем: вы поворачиваете холст на нужный градус, рисуете фигуру, а затем возвращаете холст на место при помощи метода restore(), чтобы следующие фигуры рисовались в ожидаемых местах. Иначе остальные фигуры будут рисоваться уже относительно поворота.

В примере с овалом уже использовался данный метод. В примере Работаем с графикой. Основы мы также поворачивали холст, чтобы вывести текст под углом.

Вращение происходит вокруг начальной точки холста (0, 0). Но можно также использовать перегруженную версию метода rotate(float degrees, float px, float py), в которой можно указать координаты точки поворота.

Методы scale() и translate()

Стандартная система координат начинает свой отсчёт с верхнего левого угла. Иногда, для рисования сложных фигур удобнее назначить свою систему координат. Например, для рисования циферблата часов удобнее рисовать относительно центра экрана в диапазоне от -1 до 1.

Чтобы установить свою систему координат, нужно произвести трансформацию. В следующем примере мы установим координаты в диапазоне от 0 до 10 и нарисуем график в стандартном виде из точки 0,0 в левом нижнем углу в точку 10,10 в верхнем правом углу.

Для наглядности я добавил на оси несколько точек. Следует обратить внимание, что мы задали диапазон от 0 до 10 и все размеры должны масштабироваться в новых величинах, в том числе и ширина обводки в методе setStrokeWidth(). Поэтому значения должны быть достаточно маленькими, иначе толщина обводки может просто оказаться больше самой фигуры. Кстати, в некоторых случаях с текстом и другими методами рисование масштабирование может сыграть злую шутку и дробные значения не позволят увидеть текст и некоторые линии. В этих случаях приходиться создавать цепочку преобразований, когда временно масштаб увеличивается до нормальных размеров, рисуется текст с подходящим размером шрифта, затем опять всё уменьшается и т.д. Это долгая история.

Источник

Оцените статью