2015-01-28 1 views
3

У меня есть установка с 3 вкладками с помощью ViewPager и 3 фрагментов. Один из фрагментов реализует сканер QR-кода (ZBarScanner), который заполняет весь фрагмент живым представлением камеры устройств.ViewPager проскакивает лагами, когда фрагмент содержит предварительный просмотр камеры

Я обнаружил, что этот вид камеры заставляет пользовательский интерфейс сильно отставать. Анимация для прокрутки между вкладками намного медленнее, а использование ЦП приложений сильно увеличилось. Запуск трассировки показывает, что метод «onPreviewFrame» библиотеки сканера занимает большую часть процессорного времени.

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

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

Я могу отправить код, если это поможет, но все это довольно упрощенно.

+0

* Что я могу сделать, чтобы уменьшить задержку, которую создает предварительный просмотр этой камеры в моем приложении? * Вы можете купить более мощное устройство ... также это немного утонченный интерфейс ... проведите по экрану QR-сканера? вместо этого называя намерение сканера? – Selvin

+0

@Selvin Хорошая точка. Однако я использую Nexus 5, который довольно мощный и не вызвал у меня никаких проблем в любом приложении, которое я запускал. Поэтому мне кажется, что я могу оптимизировать то, как я приближаюсь к своему приложению – pwee92

+0

@ Selvin относительно ваших прав: я бы предпочел, чтобы QR-сканирование было самодостаточным для беспрепятственного использования пользователем. Это было бы неотъемлемой частью того, что приложение пытается достичь – pwee92

ответ

2

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

Используйте TextureView для отображения предварительного просмотра.

Это будет полезно: How can I make my view pager more smooth?

Успехов!

ОБНОВЛЕНО:

Добавлен пример TextureView

CameraModule.java

public class CameraModule implements SurfaceTextureListener { 
    private Camera mCamera; 

    @Override 
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { 
     mCamera = getCamera(); 

     try { 
      mCamera.setPreviewTexture(surface); 
      mCamera.startPreview(); 
     } catch (IOException ioe) { 
      // Something bad happened 
     } 
    } 

    @Override 
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { 
     // Ignored, Camera does all the work for us 
    } 

    @Override 
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { 
     mCamera.stopPreview(); 
     mCamera.release(); 
     return true; 
    } 

    @Override 
    public void onSurfaceTextureUpdated(SurfaceTexture surface) { 
     // Invoked every time there's a new Camera preview frame 
    } 

    private Camera getCamera() { 
     Camera cam = null; 

     try { 
      cam = Camera.open(); 
     } catch (RuntimeException e) { 
      loggerManager.error("Camera not available"); 
     } 

     return cam; 
    } 
} 

CameraFragment.java

public class CameraFragment extends Fragment { 

    // You create an instance of the module. I use a singleton. 
    CameraModule mCameraModule = new CameraModule(); 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_camera, container, false); 

     TextureView mTextureView = (TextureView) view.findViewById(R.id.camera_preview); 
     mTextureView.setSurfaceTextureListener(mCameraModule); 

     return view; 
    } 
} 

fragment_camera.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#000" 
    android:orientation="vertical"> 

    <TextureView 
     android:id="@+id/camera_preview" 
     android:layout_width="match_parent" 
     android:background="#000" 
     android:layout_height="match_parent" /> 


</RelativeLayout> 

Успехов!

+0

Помогло ли это решить вашу проблему? Еще одна проблема, с которой я столкнулся, - это когда я оставляю текущую активность, которая содержит viewpager с фрагментом камеры (surfaceview), чтобы начать новую, и я пытаюсь вернуться ... это медленный процесс. Задержка 2-3 секунды по крайней мере.При выходе и возврате к активности (предположительно, потому что камера перезапускается и отпускается). Как это исправить? Пожалуйста помоги! – Rohan

+0

@Rohan, я обновил свой ответ! – Qulery