Разделите экран на SurfaceView и XML-макет - PullRequest
0 голосов
/ 01 ноября 2018

MyActivity имеет setContentView(MySurfaceView), который покрывает весь экран.

Я хотел бы разделить экран на две части: первая 2/3 экрана должна быть занята MySurfaceView, а последняя 1/3 - my_activity_layout.xml.

Как я могу это сделать? Спасибо.

enter image description here

EDIT

Спасибо за ваши ответы, но я не знаю, как их применять в моем случае. Чтобы быть понятным, это мои объекты:

enter image description here

enter image description here

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Решение:

Чтобы прикрепить файл xml в макете, вы можете использовать тег <include>.

Повторное использование макетов особенно эффективно, поскольку позволяет создавать сложные макеты многократного использования. Например, панель кнопок «да / нет» или пользовательский индикатор выполнения с текстом описания. Подробнее

Вы можете использовать функциональность, как показано в вопросе, с помощью ConstraintLayout. Конечно, есть решения, использующие устаревшие <LinearLayout> с так называемыми весами , но, как говорится в предупреждении весовые коэффициенты плохо влияют на производительность .

Почему веса плохо влияют на производительность?

Для весов макета требуется, чтобы виджет был измерен дважды. Когда LinearLayout с ненулевыми весами вложен в другой LinearLayout с ненулевыми весами, то количество измерений увеличивается в геометрической прогрессии.

Итак, давайте перейдем к решению, используя <ConstraintLayout>.

Допустим, у нас есть файл макета с именем my_activity_layout.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"
    tools:context=".MainActivity">

    <SurfaceView
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@+id/guideline"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <android.support.constraint.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.67" />

    <include
        android:id="@+id/news_title"
        layout="@layout/my_activity_layout"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/guideline" />

</android.support.constraint.ConstraintLayout>

Как видите, Guideline помогает нам получить 2/3, то есть 66,666 ~ 67% экрана, а затем вы можете ограничить свой SurfaceView и свой макет, используя тег <include> в своей деятельности.

Вы также можете увидеть требуемый результат:

Desired Result

Вы можете просто скопировать и вставить решение и посмотреть, работает ли оно должным образом.

0 голосов
/ 01 ноября 2018

Это можно решить с помощью линейного макета и указания веса макета для коэффициентов коррекции.

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <SurfaceView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="2"/>

    <include layout="my_activity_layout.xml" 
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

</LinearLayout>
...