У меня есть SurfaceView
, который используется для рисования изображений, и я хотел бы наложить их на прямую трансляцию из камера телефона.
В настоящее время SurfaceView
, который содержит изображения, имеют белый фон, но если бы я наложил их на канал камеры телефона, они должны были бы быть прозрачными. Рисование камеры и анимации не может быть выполнено на одном и том же SurfaceView
.
Как лучше всего использовать несколько видов, которые включают управление камерой и рисование изображений? Можно ли сделать SurfaceView
прозрачным?
Я добился успеха со следующим подходом.
Сначала создайте XML-файл макета, который выглядит примерно так (обратите внимание на порядок двух представлений):
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical">
<com.yourcustom.OverlayView
android:id="@+id/overlay" android:layout_width="fill_parent"
android:layout_height="fill_parent">
</com.yourcustom.OverlayView>
<SurfaceView android:id="@+id/surface"
android:layout_width="fill_parent" android:layout_height="fill_parent">
</SurfaceView>
</FrameLayout>
OverlayView
является подклассом SurfaceView
с реализацией потоков рисования и анимации. Другой SurfaceView будет поверхностью, которая обрабатывает предварительный просмотр камеры. Внутри onCreate
вы должны настроить свои представления следующим образом:
mView = (OverlayView)this.findViewById(R.id.overlay);
mView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
mSurfaceView = (SurfaceView)this.findViewById(R.id.surface);
mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.addCallback(this);
mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
Вы должны добавить реализацию SurfaceHolder.Callback
в SurfaceHolder
из mView
, который обрабатывает поток анимации. Пример реализации этого в подклассе и использования потоков анимации/рисования можно найти в старом примере LunarLander здесь:
http://developer.android.com/resources/samples/LunarLander/src/com/example/android/lunarlander/LunarView.html
Кроме того, вы настраиваете SurfaceView камеры так же, как в этом примере: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html
Я тоже делаю дополненное приложение и столкнулся с той же проблемой, что и вы. Информации о том, как правильно ее решить, очень мало. Но я нашел фреймворк под названием mixare — он позволяет создавать AR-приложения для Android. Вам обязательно стоит взглянуть на источник — выглядит довольно многообещающе. Надеюсь, что это поможет вам.