android surfaceview 大小,MediaPlayer + SurfaceView(视频大小和surfaceview大小)

  • Post author:
  • Post category:其他


第一部分:问题的出现

需求:页面有很多布局,其中有一块区域播放视频,当我单击这块区域的时候,全屏播放。

我使用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