Вы можете попробовать
var browserZoomLevel = Math.round(window.devicePixelRatio * 100);
Это даст вам процент масштабирования браузера.
Чтобы захватить событие масштабирования, вы можете использовать
$(window).resize(function() {
// your code
});
В этом есть много путаницы, и некоторые правильные отвечают .
Вот сделка:
getDrawingCache()
работает только на уровне «Вид», поэтому он не захватывает ничего на поверхности. eglSwapBuffers()
. С рендерингом Canvas самый простой способ «захватить» поверхность содержимое состоит в том, чтобы просто нарисовать его дважды. Создайте растровое изображение размером с экран, создайте Canvas из растрового изображения и передайте его функции draw()
.
С помощью рендеринга GLES вы можете использовать glReadPixels()
до того, как буферный своп захватит пиксели. В Grafika реализована (менее дорогая, чем код в вопросе) реализация кода захвата; см. saveFrame()
в EglSurfaceBase .
Если вы отправляете видео непосредственно на поверхность (через MediaPlayer), невозможно было бы захватить фреймы, потому что ваше приложение никогда не имеет доступа к ним - они идут непосредственно от медиазера до композитора (SurfaceFlinger). Однако вы можете направлять входящие кадры через SurfaceTexture и отображать их дважды из вашего приложения, один раз для отображения и один раз для захвата. См. этот вопрос для получения дополнительной информации.
. Один из вариантов заключается в замене SurfaceView на TextureView, который можно рисовать, как и любая другая поверхность. Затем вы можете использовать один из вызовов getBitmap()
для захвата кадра. TextureView менее эффективен, чем SurfaceView, поэтому это не рекомендуется для всех ситуаций, но это просто сделать.
Если бы вы надеялись получить композитный скрин-кадр, содержащий как содержимое Surface, так и содержимое View UI, вам нужно будет захватить Canvas, как указано выше, захватить представление с помощью обычного трюка кэша чертежа, а затем собрать два вручную. Обратите внимание, что это не приведет к сбою компонентов системы (строка состояния, панель навигации).
Обновление: на Lollipop и позже (API 21+) вы можете использовать класс MediaProjection для захватить весь экран с помощью виртуального дисплея. Существуют некоторые компромиссы с таким подходом, например. вы захватываете отображаемый экран, а не кадр, который был отправлен на поверхность, поэтому то, что вы получаете, возможно, было масштабировано по шкале вверх или вниз, чтобы соответствовать окну. Кроме того, этот подход включает в себя переключатель Activity, поскольку вам нужно создать намерение (вызвав createScreenCaptureIntent в объекте ProjectionManager) и дождитесь его результата.
Если вы хотите узнать больше о том, как работает все это , см. в документе Системная графическая архитектура doc.
Это связано с тем, что SurfaceView использует поток OpenGL для рисования и рисования непосредственно в аппаратном буфере. Вы должны использовать glReadPixels (и, возможно, GLWrapper).
См. Поток: Скриншот Android OpenGL