Мне нужно захватить основной макет на экране или просто весь экран, если это быстрее. Я пробовал два метода, и оба вызывают заметную задержку.
Метод 1: кеш отрисовки - занимает около 80 мс
setDrawingCacheEnabled (true);
Bitmap oldLayout = Bitmap.createBitmap (getDrawingCache ());
setDrawingCacheEnabled (false);
Метод 2: рисование на холсте - занимает около 50 мс
Bitmap oldLayout = Bitmap.createBitmap (getWidth (), getHeight (), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas (oldLayout);
int wSpec = MeasureSpec.makeMeasureSpec (getWidth (), MeasureSpec.EXACTLY);
int hSpec = MeasureSpec.makeMeasureSpec (getHeight (), MeasureSpec.EXACTLY);
measure (wSpec, hSpec);
layout (0, 0, getWidth (), getHeight ());
draw (canvas);
Кажется, если бы я мог снимать прямо с экрана, это было бы быстрее. Однако я не видел способа сделать это. Есть ли другие методы, которые стоит попробовать?
Я думаю, что у ИИ еще есть путь, чтобы мы могли программировать компьютеры без написания кода :)
Я имел в виду, собираетесь ли вы использовать студию Android для захвата снимка экрана или хотите добиться этого программно. Фраза directly from the screen
сбивала с толку. Вы пробовали ложка, он доступен только для тестирования жестких
Захват в коде. Говоря «прямо с экрана», я предполагаю, что есть аппаратная память для того, что отображается на экране. Очевидно, что на каком-то уровне ОС существует способ чтения и записи этой памяти. Это, в том числе время, необходимое Java для выделения памяти для растрового изображения, займет крайне незначительное количество времени.
Посмотрел только ложку - в исходниках нашел снимок экрана. Они используют метод 2, описанный выше. За исключением того, что они не выполняют шаги измерения и разметки. Я понял, что мне это тоже не нужно, и вынул их. К сожалению, это не имело большого значения во времени.
Удалось ли вам количественно оценить улучшение? Было бы здорово, если бы вы могли обновить свой вопрос этой информацией.
Незначительный. Измерения варьируются от испытания к испытанию - не знаю почему - и разница была в пределах этого разброса. Итак, не имеет значения.
if I could capture directly from the screen that would be faster
вы имеете ввиду без написания кода?