Как заставить SurfaceView занимать определенный раздел экрана

Я пытаюсь использовать SurfaceView. Поэтому я создал виджет SurfaceView в файле макета, как показано ниже в коде. У меня проблема в том, как установить вес для SurfaceView? Как показано ниже в коде, который я установил:

android:layout_weight=".4"

но все же SurfaceView занимает весь экран, я хочу, чтобы SurfaceView занимал только 40% экрана. Я также сослался на сообщение по этой ссылке SurfaceView в макете, но оно не показывает, как установить вес в SurfaceView из XML-файла.

Пожалуйста, дайте мне знать, как установить вес для SurfaceView из файла xml.

код:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.surfaceview_00.MainActivity">

<SurfaceView
    android:id="@+id/mainActivity_surfaceView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight=".4"/>
</RelativeLayout>

обновить:

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

код:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.surfaceview_00.MainActivity">

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

    <SurfaceView
        android:id="@+id/mainActivity_SurfaceView1"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <SurfaceView
        android:id="@+id/mainActivity_SurfaceView2"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>
</LinearLayout>

</RelativeLayout>

person user2121    schedule 10.11.2016    source источник
comment
но все же у меня есть один SurfaceView, который занимает весь экран. Откуда вы знаете, что существует только один SurfaceView?   -  person Code-Apprentice    schedule 10.11.2016
comment
@Code-Apprentice, потому что я указал в коде, опубликованном в разделе обновлений выше. у меня есть два вида поверхности внутри linearlayout, и каждому из них назначается layout_weoght = .5, и во время выполнения появляется только один вид поверхности, и он занимает весь экран   -  person user2121    schedule 11.11.2016


Ответы (3)


RelativeLayout не поддерживает layout_weight. Вам нужно использовать LinearLayout для этого.

Подробнее читайте на странице https://developer.android.com/guide/topics/ui/layout/linear.html

Но в основном измените его на что-нибудь вроде этого:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:id="@+id/activity_main"
      android:layout_width="match_parent"
      android:orientation="vertical"
      android:layout_height="match_parent"
      android:weightSum="1">

         <SurfaceView
              android:id="@+id/mainActivity_surfaceView"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_weight=".4"/>

</LinearLayout>
person malmling    schedule 10.11.2016

android:layout_weight используется только LinearLayout. Поскольку вы используете RelativeLayout, он игнорируется.

person Code-Apprentice    schedule 10.11.2016
comment
Хорошо, но как заставить SurfaceView занимать определенную часть экрана, а не весь экран? - person user2121; 10.11.2016
comment
@ user2121 Что вы имеете в виду под определенной частью экрана? - person Code-Apprentice; 10.11.2016
comment
как я уже упоминал в своем вопросе, я хочу, чтобы SurfaceView занимал, например, 50% половины экрана. - person user2121; 10.11.2016
comment
@ user2121 Вы имеете в виду половину ширины, высоты или площади? Первые два можно выполнить с помощью LinearLayout. Я не знаю о последнем. - person Code-Apprentice; 10.11.2016
comment
@ user2121 Вы можете сделать то или иное с LinearLayout. - person Code-Apprentice; 10.11.2016

SurfaceView не принадлежит к иерархии представлений приложения. Он создает отдельный слой на фоне и позиционирует его в зависимости от его размера. Все остальные виды отображаются поверх SurfaceView. Чтобы делать то, что вы хотите, вам нужно использовать TextureView.

person Maxim Metelskiy    schedule 10.11.2016
comment
@user2121 user2121 ответ был полезен? - person Maxim Metelskiy; 14.11.2016