#java #android #android-studio #android-viewpager #android-viewgroup
Вопрос:
Я создаю приложение, которое использует ViewPager2 для отображения видео и SurfaceView для отображения предварительного просмотра фронтальной камеры. Вид поверхности добавляется в список кадров группой просмотра, и когда я запускаю программу, начальное открытие выглядит так, как задумывалось: первое видео воспроизводится в фоновом режиме, а предварительный просмотр камеры отображается поверх видового экрана, однако, как только я перехожу к следующему видео на видовом экране, экран предварительного просмотра камеры переходит за видовой экран.
Вот код Java:
private ViewPager2 videosViewPager;
private SurfaceView previewDisplayView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getContentViewLayoutResId());
previewDisplayView = new SurfaceView(this);
setupPreviewDisplayView();
videosViewPager = findViewById(R.id.videosViewPager);
List<VideoItem> videoItems = new ArrayList<>();
VideoItem life = new VideoItem();
String path = "android.resource://" getPackageName() "/" R.raw.video;
life.videoURL = Uri.parse(path);
videoItems.add(life);
VideoItem rest = new VideoItem();
String path2 = "android.resource://" getPackageName() "/" R.raw.video1;
rest.videoURL = Uri.parse(path);
videoItems.add(rest);
videosViewPager.setAdapter(new VideoAdapter(videoItems));
}
private void setupPreviewDisplayView() {
previewDisplayView.setVisibility(View.GONE);
ViewGroup viewGroup = findViewById(R.id.preview_display_layout);
viewGroup.addView(previewDisplayView);
previewDisplayView
.getHolder()
.addCallback(
new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
processor.getVideoSurfaceOutput().setSurface(holder.getSurface());
Log.d("Surface","Surface Created");
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
onPreviewDisplaySurfaceChanged(holder, format, width, height);
Log.d("Surface","Surface Changed");
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
processor.getVideoSurfaceOutput().setSurface(null);
Log.d("Surface","Surface destroy");
}
});
}
XML:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@ id/parentPanel"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:hardwareAccelerated="true"
tools:context=".MainActivity">
<androidx.viewpager2.widget.ViewPager2
android:id="@ id/videosViewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="0dp">
</androidx.viewpager2.widget.ViewPager2>
<RelativeLayout
android:id="@ id/parentRelative"
android:elevation="4dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="MissingConstraints">
<FrameLayout
android:id="@ id/preview_display_layout"
android:layout_width="134dp"
android:layout_height="209dp"
android:visibility="visible"
tools:ignore="MissingConstraints"
tools:layout_editor_absoluteX="216dp"
tools:layout_editor_absoluteY="0dp" />
</RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
I know that the problem must be in the ViewGroup usage because RelativeLayout is always on top of the ViewPager(I know this because of elevation), however, its child:FrameLayout disappears after a swipe.
Is there a way to make ViewGroup views get displayed on top of everything else?
Thank you!