android: hiding media controller functions

2019-02-26 12:39发布

问题:

I have a videoview and when the video starts, the media controller is shown for 3 seconds. I want to hide the media controller unless i tap on the screen. I tried

MediaController mc= new MediaController();
mc.hide();
Videoview.setMediaController(mc);
..
..
..

But it didn't work.. Any suggestions please?

回答1:

This isn't really a solution to hiding the MediaController, but if you want to get rid of the thing altogether, do this:

videoView.setMediaController(null);

You can have it initially hidden by doing the above, and then when you want it to show (onClick or onTouch or whatever), just make a new MediaController and set it on the videoView. I added a boolean to prevent the action from happening more than once.

@Override
public boolean onTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        if (controllerCreated == false) {
            videoView.setMediaController(mc);
            mc.show();
            controllerCreated = true;
        }
        return true;
    } else {
        return false;
    }
}


回答2:

Specifying videoView.setMediaController(null) is not necessary.

The problem is you cannot hide the controller till it fully prepared.

Use OnPreparedListener and in the callback onPrepared do your hide inderectly, like:

@Override
public void onPrepared (MediaPlayer mp) 
{
    int childs = mediaController.getChildCount();
    for (int i = 0; i < childs; i++)
    {
        View child = mediaController.getChildAt (i);
        child.setVisibility (View.GONE);
    }
}


回答3:

Unfortunately, this is hardcoded behavior in VideoView:

...
if (mTargetState == STATE_PLAYING) {
    start();
    if (mMediaController != null) {
        mMediaController.show();
    }
...

As a workaround, wrap the MediaController in your own class and suppress the initial show() call, like this:

package pkg.your;

import android.content.Context;
import android.widget.MediaController;

public class MyMediaController extends MediaController {

    private boolean suppressed = true;

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

    @Override
    public void show(int timeout) {
        if (! suppressed) {
            super.show(timeout);
        }
        suppressed = false;
    }
}

Then, simply hookup the MyMediaController above as usual, e.g.:

MyMediaController mc = mediaController = new MyMediaController(this);
mc.setAnchorView(videoView);
mc.setMediaPlayer(videoView);
videoView.setMediaController(mc);
....

Now, the controls are initially hidden, and they show up as expected when the user taps the screen.