关于mediaController位置调整的问题

最近一直在研究mediaController的位置问题,因为视频只占view的一小部分,想要把mediaController调整到视频上而不是在视频的外部,一直自己在那里尝试设置更重布局和对齐效果,但是没有结果,总是达不到想要的效果。

研究了vidoview的源码,思路清晰了很多,发现videoView的setmediaController的方法调用了attacheMediaController的方法对mediacontroller进行了控制条的添加,再调用setAnchorView的方法,而且控制条现实的时候有一个show函数,代码如下

public void setMediaController(MediaController controller) {
        if (mMediaController != null) {
            mMediaController.hide();
        }
        mMediaController = controller;
        attachMediaController();
    }


    private void attachMediaController() {
        if (mMediaPlayer != null && mMediaController != null) {
            mMediaController.setMediaPlayer(this);
            View anchorView = this.getParent() instanceof View ?
                    (View)this.getParent() : this;
            mMediaController.setAnchorView(anchorView);
            mMediaController.setEnabled(isInPlaybackState());
        }
    }

public void setAnchorView(View view) {
        mAnchor = view;
        FrameLayout.LayoutParams frameParams = new FrameLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT
        );


        removeAllViews();
        View v = makeControllerView();
        addView(v, frameParams);
    }
public void show(int timeout) {


        if (!mShowing && mAnchor != null) {
            setProgress();
            if (mPauseButton != null) {
                mPauseButton.requestFocus();
            }
            disableUnsupportedButtons();


            int [] anchorpos = new int[2];
            mAnchor.getLocationOnScreen(anchorpos);


            WindowManager.LayoutParams p = new WindowManager.LayoutParams();
            p.gravity = Gravity.TOP;
            p.width = mAnchor.getWidth();
            p.height = LayoutParams.WRAP_CONTENT;
            p.x = 0;
            p.y = anchorpos[1] + mAnchor.getHeight() - p.height;
            p.format = PixelFormat.TRANSLUCENT;
            p.type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;
            p.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
            p.token = null;
            p.windowAnimations = 0; // android.R.style.DropDownAnimationDown;
            mWindowManager.addView(mDecor, p);
            mShowing = true;
        }
        updatePausePlay();
        
        // cause the progress bar to be updated even if mShowing
        // was already true.  This happens, for example, if we're
        // paused with the progress bar showing the user hits play.
        mHandler.sendEmptyMessage(SHOW_PROGRESS);


        Message msg = mHandler.obtainMessage(FADE_OUT);
        if (timeout != 0) {
            mHandler.removeMessages(FADE_OUT);
            mHandler.sendMessageDelayed(msg, timeout);
        }
    }


尽管思路清晰了,还是不知道该怎么改。自己闭门研究了好几天不见成效,今天专门在网上找该问题的解决方案,首先注意到一个方案,自定义一个控件实现该功能,原文是这样的:

What i have learning some months ago about Android is this :

When difficultys come , make your own components .

What i mean , that is easy to make your components layout , width 4 or five ImageButtons/Buttons , and link them to the VideoView component functions (or SurfaceView for a better control ).

他说的很好,看到这个让我眼前一亮;但是感觉这个方案稍微有点麻烦,想着应该会有更好的解决方案。于是我就再找发现mediaController.setPadding(0,0,0,100);//设置mediaPlayer的位置left top right bottom。其实这个方法原来就有注意,只是第一次没有调整好,后来也就没有试,这次尝试终于成功了,写出来分享给大家,希望对你有所帮助。

### 回答1: MediaControllerAndroid中的一个媒体控制器类,可以用于控制视频播放器的播放、暂停等操作。要实现播放下一个视频的功能,可以按照以下步骤进行: 1. 首先,需要获得当前正在播放的视频的信息,包括视频的URL或本地路径等。可以通过调用MediaPlayer的getCurrentPosition()方法获取当前视频的播放位置,并结合视频列表的索引来确定下一个视频的位置。 2. 接下来,需要根据下一个视频的位置,更新播放器的资源。可以通过调用MediaPlayer的setDataSource()方法,传入下一个视频的URL或本地路径来更新媒体资源。 3. 然后,重新准备播放器以加载下一个视频。可以调用MediaPlayer的prepare()方法来准备播放器。 4. 最后,启动媒体控制器来播放下一个视频。可以调用MediaController的start()方法来开始播放。 需要注意的是,以上步骤仅适用于使用MediaPlayer和MediaController进行视频播放的情况。如果使用其他视频播放库或自定义实现视频播放器,可能需要针对具体的实现进行相应的调整。 此外,为了良好的用户体验,还可以在切换视频时增加过渡效果,例如淡入淡出效果或切换动画等,以避免突兀的切换。这可以通过使用动画效果或过渡动画来实现。 总之,通过获取当前视频信息、更新媒体资源、重新准备播放器和启动媒体控制器,即可实现MediaController播放下一个视频的功能。 ### 回答2: 要让MediaController实现播放下一个视频,可以采取以下步骤: 1. 首先,确认MediaController已经与MediaPlayer或其他视频播放组件(如VideoView)关联。这可以通过调用setMediaPlayer()或setAnchorView()方法来实现。 2. 接下来,需要获取视频列表或播放队列,以确保有可用的下一个视频。可以通过创建一个包含视频URL或其他ID的列表来实现。如果使用VideoView,可以使用setVideoPath()方法设置视频路径。 3. 当需要切换到下一个视频时,可以通过监听MediaController的一些回调方法来触发。其中最常用的是实现MediaController.MediaPlayerControl接口中的onCompletion()方法。当当前视频播放完成时,onCompletion()方法将被调用。在这个方法中,可以执行逻辑来切换到下一个视频。 4. 在onCompletion()方法中,可以使用MediaPlayer或VideoView的相关方法来进行切换。比如,可以使用setVideoURI()方法设置下一个视频的URI,然后调用start()方法来开始播放下一个视频。 需要注意的是,实现这个功能也取决于所使用的视频播放组件和播放库的特定实现。在一些情况下,可能需要使用其他的方法或回调来实现播放下一个视频的功能。因此,具体实现步骤可能会因播放器库的不同而有所变化。 ### 回答3: 要使用MediaController播放下一个视频,您可以按照以下步骤进行操作: 1. 首先,确保您已经初始化了MediaPlayer对象,并且已经设置了正确的数据源和准备完成的监听器。 2. 创建一个MediaController对象,并将其与MediaPlayer对象进行绑定。这可以通过调用MediaPlayer对象的setMediaController()方法实现。 3. 在MediaController中,您可以添加一个监听器来监听下一个按钮的点击事件。例如,您可以使用setPrevNextListeners()方法来设置这个监听器。 4. 在监听器中,当下一个按钮被点击时,您可以调用MediaPlayer对象的seekTo()方法将播放位置设置为0,即播放下一个视频。例如,您可以使用seekTo()方法来实现这一功能。 5. 最后,调用MediaController对象的show()方法来显示控制器,以便用户可以看到和操作它。 通过这些步骤,您就可以使用MediaController播放下一个视频了。当用户点击下一个按钮时,视频播放器将播放列表中的下一个视频。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值