Android Camera2Video Preview Issue

Я использую Google's APICamera2Video классов Camera2VideoFragment и AutoFitTextureView, и у меня небольшая проблема. Когда я использую preview в кастомном FrameLayout, он идет в угол left.

Я нашел способ растянуть превью, чтобы он заполнил весь framelayout, но, как и ожидалось, он выглядит слишком растянутым. Идеальным решением было бы, если бы по углам были черные края, а экран был бы посередине. Кроме того, я не думаю, что установка инфлятора для раздувания макета из середины может помочь, потому что могут быть случаи, когда экран достаточно большой для предварительного просмотра, чтобы он поместился должным образом, и размещение посередине просто испортит его.

Ссылка на Google's Camera2Video API: https://github.com/googlesamples/android-Camera2Video

Я создал простой layout, чтобы показать, что у меня получается. (Это единственное, что я изменил после загрузки Google's API, а также удаления прилагаемых кнопок):

XML:

<?xml version = "1.0" encoding = "utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android = "http://schemas.android.com/apk/res/android"
    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">

    <FrameLayout xmlns:android = "http://schemas.android.com/apk/res/android"
        xmlns:tools = "http://schemas.android.com/tools"
        android:id = "@+id/container"
        android:layout_width = "match_parent"
        android:layout_height = "250dp"
        android:layout_marginBottom = "8dp"
        android:layout_marginEnd = "8dp"
        android:layout_marginStart = "8dp"
        android:layout_marginTop = "8dp"
        android:background = "#000"
        app:layout_constraintBottom_toBottomOf = "parent"
        app:layout_constraintEnd_toEndOf = "parent"
        app:layout_constraintStart_toStartOf = "parent"
        app:layout_constraintTop_toTopOf = "parent"
        tools:context = "com.example.android.camera2basic.CameraActivity" />

</android.support.constraint.ConstraintLayout>

И картина того, что я вижу.

Android Camera2Video Preview Issue

это на устройстве или в эмуляторе ?. ты должен попробовать это на устройстве

Raghunandan 17.04.2018 16:41

@Raghunandan, этот снимок был сделан на эмуляторе, чтобы я мог сделать снимок экрана, но на устройстве он выглядит так же.

kataroty 17.04.2018 17:03

образец работает нормально. также на каких устройствах и версиях ОС вы тестируете

Raghunandan 17.04.2018 17:06

Он отлично работает, когда вы делаете это с макетом, который он дает вам, но если я вставлю в него макет координатора и макет фрейма, я получу вот что. Эмулятор - Nexus 5X, Устройство - Motorola Moto C

kataroty 17.04.2018 17:11

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

kataroty 17.04.2018 17:35

Потому что я просто пытался сделать это с нуля и получил тот же результат.

kataroty 17.04.2018 17:36

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

kataroty 17.04.2018 17:46

Итак, вы установили высоту рамки 250dp и ожидаете, что ее дочерний элемент заполнит экран?

Alex Cohn 17.04.2018 21:48

@AlexCohn Я не ожидаю, что он заполнит его, скорее я ожидаю, что он поместится, например, посередине, а не в углу. Он может оставаться маленьким.

kataroty 17.04.2018 23:18

Попробуйте добавить android:gravity = "center" для FrameLayout контейнер. Иногда это не работает надежно. Затем вы можете указать android:layout_gravity = "center" для AutoFitTextureView.

Alex Cohn 17.04.2018 23:53

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

kataroty 18.04.2018 00:39

@AlexCohn в любом случае, я попробовал обе предложенные вами строки, и ни одна из них не сработала. Если я правильно понял, что мне нужно было добавить их в созданный мной FrameLayout?

kataroty 18.04.2018 00:46
layout_gravity идет на AutoFitTextureView (id / texture) в fragment_camera2_video.xml или его эквиваленте вместо android:layout_alignParentStart = "true" android:layout_alignParentTop = "true". И вам не нужен RelativeLayout
Alex Cohn 18.04.2018 01:53

@AlexCohn Это не волновало, когда у меня был RelativeLayout, но как только я его удалил, он начал работать, как и требовалось. Несмотря на то, что я не совсем уверен, почему это произошло, я все еще очень благодарен вам за вашу помощь.

kataroty 18.04.2018 02:02
0
14
126
1

Ответы 1

Вы используете образец, который оборачивает AutoFitTextureView в дополнительный обертка из RelativeLayout. Здесь определяет позиция вида текстуры как

android:layout_alignParentStart = "true" 
android:layout_alignParentTop = "true"

что вызвало макет, который вы наблюдали.

Эта обертка вашей задаче не нужна. Вы можете встроить AutoFitTextureView непосредственно в FrameLayout из Камера. Ваш FrameLayout должен определять

android:gravity = "center"

приказать детям сосредоточиться.

Обратите внимание, что вы, вероятно, можете удалить упаковку ConstrantLayout, если ее единственным дочерним элементом является id/containerFrameLayout.

Другие вопросы по теме