首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MediaController定位-绑定到VideoView

MediaController定位-绑定到VideoView
EN

Stack Overflow用户
提问于 2014-03-25 14:23:10
回答 3查看 5.7K关注 0票数 11

关于如何定位MediaController,已经有很多讨论,大多数答案都是使用setAnchorView-Method。乍一看,这个解决方案似乎奏效了,但在我的例子中却没有。

根据这一点,Post setAnchorView只作为MediaController初始定位的参考,但实际上在顶部创建了一个新的浮动Window

所以我想要的是一个MediaController,它是真正的绑定到父View (例如VideoView)。

例如,如果您在一个LinearLayout中有一个ScrollView,并且您必须向下滚动到连接MediaControllerVideoView,那么MediaController实际上应该附加到这个VideoView上,这样MediaController就可以与VideoView一起滚动。

另一种用例--讨论这个问题准确的地方是hereMediaController是在ViewPager中使用的。

那么如何为MediaController实现这样的行为呢?

EN

回答 3

Stack Overflow用户

发布于 2014-04-02 19:36:37

最后我做了个肮脏的黑客..。我只是手动地将视图附加到我的videoView以实现想要的行为:

代码语言:javascript
复制
public void onPrepared(MediaPlayer mp) {

                MediaController mc = new MediaController(videoView.getContext(), false);
                // set correct height
                RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) videoView.getLayoutParams();
                params.height =  mp.getVideoHeight();
                videoView.setLayoutParams(params);

                videoView.setMediaController(mc);
                pBar.setVisibility(View.GONE);
                mc.show(0);

                FrameLayout f = (FrameLayout) mc.getParent();
                RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                        RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
                lp.addRule(RelativeLayout.ALIGN_BOTTOM, videoView.getId());

                ((LinearLayout) f.getParent()).removeView(f);
                ((RelativeLayout) videoView.getParent()).addView(f, lp);

                mc.setAnchorView(videoView);
            }

这个解决方案的问题是,设置anchorView没有任何效果,因此点击VideoView不会像它应该的那样隐藏/显示MediaController

肯定有一个更好的解决方案,希望有人能给我一个提示!

票数 9
EN

Stack Overflow用户

发布于 2015-09-30 16:30:16

只是想补充一下DERIIIFranz的答案。我使用相同的方法将媒体控制器分配给我想要的视图,并使Hide()和Show()函数正常工作--我只是创建了自己的MediaController类,覆盖了Hide()和Show()方法以及isShowing属性(我用Xamarin在C#中这样做了,所以我不知道您在使用C#时会遇到什么问题)。

我还在VideoView上添加了自己的单击侦听器,以确保自己能够处理Hide()和Show()事件。

代码语言:javascript
复制
public class MyMediaController : MediaController
{
    private bool _isShowing { get; set; } = false;
    public override bool IsShowing { get { return _isShowing; } }

    public override void Show ()
    {
        base.Show();
        _isShowing = true;

        Native.ViewGroup parent = ((Native.ViewGroup)this.Parent);
        parent.Visibility = Native.ViewStates.Visible;
    }

    public override void Hide ()
    {
        base.Hide();
        _isShowing = false;

        Native.ViewGroup parent = ((Native.ViewGroup)this.Parent);
        parent.Visibility = Native.ViewStates.Gone;
    }
}
票数 1
EN

Stack Overflow用户

发布于 2016-08-18 10:11:18

要将Jonathan的答案转换为Java,并将其添加到DERIIIFranz的答案中:

代码语言:javascript
复制
public class MyMediaController extends MediaController {

        public MyMediaController(Context context) {
                super(context);
        }

        public MyMediaController(Context context, boolean useFastForward) {
                super (context, useFastForward);
        }

        public MyMediaController(Context context, AttributeSet attrs) {
                super(context, attrs);
        }

        private boolean _isShowing = false;

        @Override
        public boolean isShowing() { return _isShowing; }

        @Override
        public void show() {
                super.show();
                _isShowing = true;

                ViewGroup parent = (ViewGroup) this.getParent();
                parent.setVisibility(View.VISIBLE);
        }

        @Override
        public void hide() {
                super.hide();
                _isShowing = false;

                ViewGroup parent = (ViewGroup) this.getParent();
                parent.setVisibility(View.GONE);
        }
}

对于videoView:

代码语言:javascript
复制
    public void onPrepared(MediaPlayer mediaPlayer) {
            MyMediaController mediaController = new MyMediaController(videoView.getContext(), false);

            RelativeLayout parentLayout = (RelativeLayout) videoView.getParent();
            RelativeLayout.LayoutParams parentParams = (RelativeLayout.LayoutParams) parentLayout.getLayoutParams();
            parentParams.height = this.getHeight();
            parentLayout.setLayoutParams(parentParams);

            FrameLayout frameLayout = (FrameLayout) mediaController.getParent();
            RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
            layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, this.getId());

            ((ViewGroup)frameLayout.getParent()).removeView(frameLayout);
            parentLayout.addView(frameLayout, layoutParams);

            mediaController.setAnchorView(this);
            mediaController.hide();

            videoView.setMediaController(mediaController);
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22637413

复制
相关文章

相似问题

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