首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >基于VideoView的MediaController定位

基于VideoView的MediaController定位
EN

Stack Overflow用户
提问于 2010-09-11 01:15:59
回答 8查看 64.2K关注 0票数 67

我有一个VideoView,它占据了活动的上半部分,在屏幕的下半部分显示了一些图像和文本。当活动开始时,我正在视频视图中播放rtsp视频流。我已经通过以下代码将一个MediaController附加到VideoView:

代码语言:javascript
复制
    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显示在屏幕上我想要显示的位置,我还需要采取其他步骤吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-08-12 21:17:55

尝试setAnchorView() --根据我对源代码的阅读,MediaController将出现在锚视图的底部。

票数 7
EN

Stack Overflow用户

发布于 2014-07-02 19:15:37

我找到了非常简单的解决方案。

只需将videoView包装在FrameLayout中,然后就可以从代码中将MediaController添加到该FrameLayout中,如下所示:

代码语言:javascript
复制
    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);

编辑:自从我发布了这个答案后,我遇到了很多隐藏它和控制它大小的问题,所以我最终做的就是创建了我自己的布局,我可以使用这些控件进行动画处理,而不会感到头疼

票数 23
EN

Stack Overflow用户

发布于 2013-12-04 18:29:32

我最近遇到了同样的问题,使用setAnchorView( VideoView )会将控制器完全设置在VideoView下,而不是停留在它的底部区域。我的VideoView是上部区域的三分之一的屏幕,所以控制器最终覆盖了VideoView下的任何视图。

下面是我在没有编写完整的自定义控制器的情况下完成这项工作的方法(仅覆盖MediaController的onSizeChanged以向上移动锚点):

使用FrameLayout作为MediaContoller的锚点,与VideoView封装在一起,如下所示:

代码语言:javascript
复制
<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将跟随):

代码语言:javascript
复制
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:

代码语言:javascript
复制
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);                
}
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3686729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档