第一部分:问题的出现
需求:页面有很多布局,其中有一块区域播放视频,当我单击这块区域的时候,全屏播放。
我使用MediaPlayer +
SurfaceView,当全屏时,改变SurfaceView的大小,然后MediaPlayer.setHolder(mSurfaceViewHolder),但是
,只有SurfaceView改变了,但是视频大小仍然没有改变。而且在不设置surfaceHolder的情况下,视频仍以奇特的方式播放,具体方法可以参看我之前的例子,链接是:。大家可以尝试,我在后面会进行一些测试来一步一步来排除问题。
第二部分:转换思路,解决问题
解决问题优先,换了一种思路解决问题,使用Android框架封装好的VideoView解决,很快实现。
思路:当需要全屏时,gone掉无关紧要的其他布局。让VideoView的父组件(的父组件)FILL_PARENT。当要回到默认的显示布局时,将之前保存的原始尺寸设置回来,原来gone掉的布局显示出来即可。
关键代码如下:
publicvoidonClick(View v) {
switch(v.getId()) {
caseR.id.videoView:
if(!isFullScreen) {
toFullScreen();
} else{
toDefaultScreen();
}
break;
}
}
privatevoidtoFullScreen() {
// TODO Auto-generated method stub
mVideoBarDefaultWidth = mVideoView.getWidth();
mVideoBarDefaultHeight = mVideoView.getHeight();
mTitleBar.setVisibility(View.GONE);
mAppBar.setVisibility(View.GONE);
mCategoryBar.setVisibility(View.GONE);
mIndicatorBar.setVisibility(View.GONE);
mContentLayout.setLayoutParams(newLinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
mVideoViewLayout.setLayoutParams(newLinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
mVideoView.setLayoutParams(newLinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
isFullScreen = true;
}
privatevoidtoDefaultScreen() {
// TODO Auto-generated method stub
mTitleBar.setVisibility(View.VISIBLE);
mAppBar.setVisibility(View.VISIBLE);
mCategoryBar.setVisibility(View.VISIBLE);
mIndicatorBar.setVisibility(View.VISIBLE);
mContentLayout.setLayoutParams(newLinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, mVideoBarDefaultHeight));
mVideoViewLayout.setLayoutParams(newLinearLayout.LayoutParams(
mVideoBarDefaultWidth, mVideoBarDefaultHeight));
mVideoView.setLayoutParams(newLinearLayout.LayoutParams(
mVideoBarDefaultWidth, mVideoBarDefaultHeight));
isFullScreen = false;
}
第三部分:原因+设计测试
Video