关于如何定位MediaController,已经有很多讨论,大多数答案都是使用setAnchorView-Method。乍一看,这个解决方案似乎奏效了,但在我的例子中却没有。
根据这一点,Post setAnchorView只作为MediaController初始定位的参考,但实际上在顶部创建了一个新的浮动Window。
所以我想要的是一个MediaController,它是真正的绑定到父View (例如VideoView)。
例如,如果您在一个LinearLayout中有一个ScrollView,并且您必须向下滚动到连接MediaController的VideoView,那么MediaController实际上应该附加到这个VideoView上,这样MediaController就可以与VideoView一起滚动。
另一种用例--讨论这个问题准确的地方是here,MediaController是在ViewPager中使用的。
那么如何为MediaController实现这样的行为呢?
发布于 2014-04-02 19:36:37
最后我做了个肮脏的黑客..。我只是手动地将视图附加到我的videoView以实现想要的行为:
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。
肯定有一个更好的解决方案,希望有人能给我一个提示!
发布于 2015-09-30 16:30:16
只是想补充一下DERIIIFranz的答案。我使用相同的方法将媒体控制器分配给我想要的视图,并使Hide()和Show()函数正常工作--我只是创建了自己的MediaController类,覆盖了Hide()和Show()方法以及isShowing属性(我用Xamarin在C#中这样做了,所以我不知道您在使用C#时会遇到什么问题)。
我还在VideoView上添加了自己的单击侦听器,以确保自己能够处理Hide()和Show()事件。
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;
}
}发布于 2016-08-18 10:11:18
要将Jonathan的答案转换为Java,并将其添加到DERIIIFranz的答案中:
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:
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);
}https://stackoverflow.com/questions/22637413
复制相似问题