0

我正在尝试创建一个类似于 Youtube 播放器的 Android 视频播放器。我将按照以下步骤创建播放器:

  1. 用于设计的顶部布局。
  2. VideoPlayer(surfaceView) 的中间布局。
  3. Progressbar 的底部布局(提示:所有布局都是动态创建的)

这是我要求的模板。

我面临的问题是它SurfaceView占据了显示器的全长。它隐藏了顶部和底部布局。

我该怎么做才能使顶部和底部布局出现?

4

2 回答 2

0

您使用什么作为父布局?顶部和底部视图中的任何一个是否应该覆盖在 VideoView 的顶部(这就是 YouTube 所做的)?

这是一个使用 RelativeLayout 的示例布局,展示了这种方法:(注意:ViewGroups 的位置很重要,它决定了哪些视图是“在顶部”和“下面”。靠近文件底部的 ViewGroups 在“顶部”更高)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <VideoView
        android:id="@+id/videoView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" />

    <LinearLayout
        android:id="@+id/linearLayoutTop"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="This is the top container!" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayoutBottom"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="This is the bottom container!" />
    </LinearLayout>

</RelativeLayout>

如果您不希望顶部和底部视图重叠,您可以使用 LinearLayout(带垂直方向和适当的 layout_heights):

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

    <LinearLayout
        android:id="@+id/linearLayoutTop"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="This is the top container!" />
    </LinearLayout>

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

    <LinearLayout
        android:id="@+id/linearLayoutBottom"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="This is the bottom container!" />
    </LinearLayout>

</LinearLayout>
于 2013-05-06T16:18:22.733 回答
0

这就是我动态定位表面视图的方式。也许有更多 UI 知识的人会做一些不同的事情......我想看到。

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            // Create objects.
            try {
                mCamera = Camera.open();
            }
            catch (Exception e) {
                Log.e("onCreate", "could not open camera", e);
            }
            mLiveGraphView = new LiveGraphView(this);
            mCameraPreview = new CameraPreview(this, mCamera);

            // Create RelativeLayout for layout root.
            mLayoutRoot = new RelativeLayout(this);
            RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.MATCH_PARENT,
                    RelativeLayout.LayoutParams.MATCH_PARENT);

            // Add GraphView to layout.
            RelativeLayout.LayoutParams lpGraph = new RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.MATCH_PARENT,
                    RelativeLayout.LayoutParams.MATCH_PARENT);
            mLiveGraphView.setLayoutParams(lpGraph);
            mLayoutRoot.addView(mLiveGraphView);

            // Add SurfaceView to layout.
            List<Camera.Size> ls = mCamera.getParameters().getSupportedPreviewSizes();
            int n = ls.size();
            int widthMin = 10000;
            int imin = -1;
            for (int i=0; i<n; i++) {
                if (DEBUG)
                    Log.d(TAG, "supported preview width x height: " + ls.get(i).width + " x " + ls.get(i).height);
                if (widthMin > ls.get(i).width) {
                    widthMin = ls.get(i).width;
                    mCameraPreviewSize = ls.get(i);
                    imin = i;
                }
            }
            if (imin >= 0) {
                Camera.Parameters parameters = mCamera.getParameters();
                parameters.setPreviewSize(mCameraPreviewSize.width, mCameraPreviewSize.height);
                parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);
                parameters.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_DAYLIGHT);
                parameters.setSceneMode(Camera.Parameters.SCENE_MODE_SPORTS);
                parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                mCamera.setParameters(parameters);

                RelativeLayout.LayoutParams lpSurface = new RelativeLayout.LayoutParams(
                        ls.get(imin).width, ls.get(imin).height);
                lpSurface.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
                lpSurface.addRule(RelativeLayout.CENTER_HORIZONTAL);
                mCameraPreview.setLayoutParams(lpSurface);
                mLayoutRoot.addView(mCameraPreview);
            }

            // Provide Android framework with layout root.
            setContentView(mLayoutRoot, rlp);
        }
于 2013-05-06T14:24:01.037 回答