我有一个VideoView,它占据了活动的上半部分,在屏幕的下半部分显示了一些图像和文本。当活动开始时,我正在视频视图中播放rtsp视频流。我已经通过以下代码将一个MediaController附加到VideoView:
MediaController controller = new MediaController(this);
controller.setAnchorView(this.videoView);
controller.setMediaPlayer(this.videoView);
this.videoView.setMediaController(controller);
当我点击VideoView在屏幕上调出MediaController时,我希望播放控件会覆盖在VideoView的底部区域( MediaController的底部,甚至与VideoView的底部)。相反,MediaController在屏幕下方弹出,覆盖了我在VideoView下面的一些图形和文本。
要使MediaController显示在屏幕上我想要显示的位置,我还需要采取其他步骤吗?
发布于 2011-08-12 21:17:55
尝试setAnchorView()
--根据我对源代码的阅读,MediaController
将出现在锚视图的底部。
发布于 2014-07-02 19:15:37
我找到了非常简单的解决方案。
只需将videoView包装在FrameLayout中,然后就可以从代码中将MediaController添加到该FrameLayout中,如下所示:
MediaController mc = new MediaController(context);
videoView.setMediaController(mc);
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.BOTTOM;
mc.setLayoutParams(lp);
((ViewGroup) mc.getParent()).removeView(mc);
((FrameLayout) findViewById(R.id.videoViewWrapper)).addView(mc);
编辑:自从我发布了这个答案后,我遇到了很多隐藏它和控制它大小的问题,所以我最终做的就是创建了我自己的布局,我可以使用这些控件进行动画处理,而不会感到头疼
发布于 2013-12-04 18:29:32
我最近遇到了同样的问题,使用setAnchorView( VideoView )会将控制器完全设置在VideoView下,而不是停留在它的底部区域。我的VideoView是上部区域的三分之一的屏幕,所以控制器最终覆盖了VideoView下的任何视图。
下面是我在没有编写完整的自定义控制器的情况下完成这项工作的方法(仅覆盖MediaController的onSizeChanged
以向上移动锚点):
使用FrameLayout作为MediaContoller的锚点,与VideoView封装在一起,如下所示:
<RelativeLayout
android:id="@+id/videoLayout"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1.3"
android:layout_gravity="center"
android:background="#000000">
<VideoView
android:id="@+id/videoView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true" />
<FrameLayout android:id="@+id/controllerAnchor"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
/>
</RelativeLayout>
创建自定义MediaController,当FrameLayout的大小改变时,它将向上移动(锚定到它的MediaController将跟随):
public class MyMediaController extends MediaController
{
private FrameLayout anchorView;
public MyMediaController(Context context, FrameLayout anchorView)
{
super(context);
this.anchorView = anchorView;
}
@Override
protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld)
{
super.onSizeChanged(xNew, yNew, xOld, yOld);
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) anchorView.getLayoutParams();
lp.setMargins(0, 0, 0, yNew);
anchorView.setLayoutParams(lp);
anchorView.requestLayout();
}
}
使用上面的自定义控制器代替标准控制器,然后将其锚定到FrameLayout:
protected void onCreate(Bundle savedInstanceState)
{
//...
videoView = (VideoView) findViewById(R.id.videoView1);
videoController = new MyMediaController(this, (FrameLayout) findViewById(R.id.controllerAnchor));
videoView.setMediaController(videoController);
//...
}
public void onPrepared(MediaPlayer mp)
{
videoView.start();
FrameLayout controllerAnchor = (FrameLayout) findViewById(R.id.controllerAnchor);
videoController.setAnchorView(controllerAnchor);
}
https://stackoverflow.com/questions/3686729
复制相似问题