0

我在将 GLSurfaceView 放在其他布局之间时遇到了问题,事实证明——使用 GLSurfaceView 是不可能的。所以我用TextureView替换了GLSurfaceView,但是问题没有解决。

我的主要布局中有这样的结构:

<RelativeLayout android:id="@+id/mainEngineLayout"
                android:layout_width="match_parent"
                android:layout_height="fill_parent"
                android:background="@android:color/transparent"
                tools:context=".activities.MyActivity">

    <com.myapplication.views.openGL.myGLTextureView
            android:id="@+id/myGLTextureView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_marginLeft="66dp"
            android:layout_marginRight="66dp"/>

    <LinearLayout
            android:id="@+id/leftButtonsLayout"
            android:layout_height="fill_parent"
            android:layout_width="66dp"
            android:layout_alignParentLeft="true"
            android:orientation="vertical"
            android:background="#b7b8b0">

        <ImageButton android:layout_width="66dp"  .../>
        <ImageButton android:layout_width="66dp"  .../>

    </LinearLayout>

    <FrameLayout
            android:layout_height="fill_parent"
            android:id="@+id/rightLayout"
            android:layout_width="wrap_content"
            android:layout_alignParentRight="true"
            android:orientation="vertical"
            android:background="#b7b8b0">

        <ImageButton android:layout_width="66dp"  .../>
        <ImageButton android:layout_width="66dp"  .../>

    </FrameLayout>    

</RelativeLayout>

最后我想得到如下结果:

在此处输入图像描述

问题是在某些设备上我遇到了根本不显示 TextureView 的问题,因此左右布局之间存在黑场。

例如,它可以在我的三星 S3 和模拟器中运行,但在 Xperia 上无法正常运行。我认为原因可能是不同的主题,但我在清单文件中设置了主题,例如:

<application
    android:allowBackup="true"
    android:configChanges="orientation|screenSize"
    android:theme="@style/CustomHoloThemeNoActionBar"
    android:screenOrientation="sensorLandscape"
    android:largeHeap="true">
    <activity
        android:theme="@style/CustomHoloThemeNoActionBar"

在哪里"CustomHoloThemeNoActionBar" parent="@android:style/Theme.Holo.Light"

您能否告知可能导致此类问题的原因?

4

2 回答 2

1

我认为您应该将重力或 (layout_gravity) 设置为 center ,

这取决于你想要它的样子

在此处输入图像描述

如果你想将它们分开来固定百分比,你可以使用 weight 属性

在此处输入图像描述

于 2014-10-23T14:03:20.900 回答
1

我不知道 OpenGLTextureView,但对于你的最后一个问题,我会尝试将 TextureView 放在 FrameLayout 中。

我会更改您的 XML 的结构,例如(没有在 API 级别 8 及更高版本中不推荐使用并重命名为match_parent的fill_parent,但我认为它与您的问题无关):

<RelativeLayout android:id="@+id/mainEngineLayout"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@android:color/transparent"
                tools:context=".activities.MyActivity">

    <LinearLayout
            android:id="@+id/horizontalContainer"
            android:layout_height="match_parent"
            android:layout_width="match_parent"
            android:orientation="horizontal"
            android:background="#b7b8b0">

       <LinearLayout
               android:id="@+id/leftButtonsLayout"
               android:layout_height="match_parent"
               android:layout_width="wrap_content"
               android:orientation="vertical"
               android:background="#b7b8b0">

             <ImageButton android:layout_width="match_parent"  .../>
             <ImageButton android:layout_width="match_parent"  .../>

        </LinearLayout>

        <FrameLayout
               android:layout_height="match_parent"
               android:id="@+id/textureContainer"
               android:layout_width="match_parent"
               android:background="#b7b8b0">

               <TextureView
                  android:id="@+id/myGLTextureView"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  />
        </FrameLayout> 
        <FrameLayout
               android:layout_height="match_parent"
               android:id="@+id/rightLayout"
               android:layout_width="wrap_content"
               android:orientation="vertical"
               android:background="#b7b8b0">

             <ImageButton android:layout_width="match_parent"  .../>
             <ImageButton android:layout_width="match_parent"  .../>

         </FrameLayout>    
     </LinearLayout>

</RelativeLayout>

但我建议您使用 java 代码来使项目大小动态化。例如,在您的活动中,这将给出如下内容:

private LinearLayout leftLayoutButtonContainer;
private FrameLayout rightLayoutButtonContainer;

private TextureView textureView;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        leftLayoutButtonContainer = findViewById(R.id.leftButtonsLayout);
        rightLayoutButtonContainer = findViewById(R.id.rightLayout);

        textureView = findViewById(R.id.myGLTextureView);

        // Screen dimensions
        display = getWindowManager().getDefaultDisplay();
        size = new Point();
        // Get the screen dimensions between the status bar & the navigation bar.
        display.getSize(size);
        //display.getRealSize(size) if you want to use the size in full screen mode
        // This means without the status and navigation bar counted in the screen size.

       //Get the screen dimensions
       maxWidth = size.x 
       maxHeight = size.y;

       // Call this method in the onCreate() of your activity
       // If you are using Fragment, inside the onActivityCreated() method
       // Which is called after onCreateView() so your items will not be null objects
       setupLayouts();
   }


private void setupLayouts() {

    // If you trully need 66dp, you can let it in XML for your buttons 
    // Then just set the TextureView size such as below
    textureView.getLayoutParams.width = maxWidth - 2 * 66;

    // If you want to set everything dynamically : comment the above line
    // 15% of the width of the screen for both container, so you will have 70% of the screen for your textureView 
    //(from what i see on the picture representing what you want)
    // If you choose the below option, you need to set your Buttons in match_parent in your XML file
    leftLayoutButtonContainer.getLayoutParams.width = maxWidth * 15 / 100; 
    rightLayoutButtonContainer.getLayoutParams.width = maxWidth * 15 / 100;
    textureView.getLayoutParams.width = maxWidth * 70 / 100;


}

说明:

一般的想法是在您的 XML 中放置正确的布局方向,这将处理元素的“顺序”。

这就是 main LinearLayoutwithandroid:orientation="horizontal"正在做的事情。

然后,您想使用match_parent属性设置所有元素,并使用 % 设置所需项目的大小。

这是 XML 中属性权重背后的想法和可能的数学,但我从不这样做,因为我有时喜欢在任何时候用我的数学来控制我的项目。

希望这可以帮助 !

于 2020-01-02T09:31:58.397 回答