如何根据视频的高度和宽度设置屏幕方向
Posted
技术标签:
【中文标题】如何根据视频的高度和宽度设置屏幕方向【英文标题】:How to set screen orientation according to a video's height and width 【发布时间】:2015-04-28 12:02:18 【问题描述】:我在onPrepared
方法中使用videoview
,它返回媒体播放器的高度和宽度。然后我检查视频的宽度是否大于高度并旋转屏幕。问题是,如果我旋转屏幕方向,它会再次调用onCreate
方法,然后调用所有代码,因此再次初始化视频需要时间。
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
// Get the layout from video_main.xml
setContentView(R.layout.play_video_activity);
// Insert your Video URL
String VideoURL = "http://www.androidbegin.com/tutorial/AndroidCommercial.3gp";
// Find your VideoView in your video_main.xml layout
final VideoView videoview = (VideoView) findViewById(R.id.VideoView);
// Execute StreamVideo AsyncTask
// Create a progressbar
final ProgressDialog pDialog;
pDialog = new ProgressDialog(PlayVideoActivity.this);
// Set progressbar title
pDialog.setTitle("Android Video Streaming Tutorial");
// Set progressbar message
pDialog.setMessage("Buffering...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
// Show progressbar
pDialog.show();
try
// Start the MediaController
MediaController mediacontroller = new MediaController(
PlayVideoActivity.this);
mediacontroller.setAnchorView(videoview);
// Get the URL from String VideoURL
Uri video = Uri.parse(VideoURL);
videoview.setMediaController(mediacontroller);
videoview.setVideoURI(video);
catch (Exception e)
Log.e("Error", e.getMessage());
e.printStackTrace();
videoview.requestFocus();
videoview.setOnPreparedListener(new OnPreparedListener()
// Close the progress bar and play the video
public void onPrepared(MediaPlayer mp)
pDialog.dismiss();
videoview.start();
if(mp.getVideoWidth()> mp.getVideoHeight())
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
);
【问题讨论】:
if(videoview.getVideoWidth()> videoview.getVideoHeight()) 检查这个条件 这种情况正常工作。请参阅 OnPrepared 方法。 您正在检查媒体播放器的高度和宽度...对 videoview 做同样的事情 但问题是假设视频宽度为 480,高度为 640,那么我将以纵向模式显示视频(默认情况下),但如果宽度为 640,高度为 480,那么我必须以横向模式显示视频,但在这种情况下,如果我以横向模式旋转视频,它会再次初始化视频,因为活动再次调用 onCreate 方法 【参考方案1】:将android:configChanges="orientation"
添加到清单文件中的活动
在你的活动中声明变量
boolean orienChanged = false;
int lastOrientation = 0;
重写方法
@Override
public void onConfigurationChanged(Configuration newConfig)
super.onConfigurationChanged(newConfig);
int orientation = newConfig.orientation;
if(orientation != lastOrientation)
orienChanged = true;
lastOrientation = orientation ;
检查onCreate()
中的变量orienChanged
,仅在初始时为假,否则必须为真。
【讨论】:
【参考方案2】:在创建时初始化新配置...并使 newConfigOD 为全局变量。
Configuration newConfigOD = getResources().getConfiguration();
然后重写这个方法..
@Override
public void onConfigurationChanged(Configuration newConfig)
super.onConfigurationChanged(newConfig);
if(videoview.getVideoWidth()> videoview.getVideoHeight())
if (newConfigOD.orientation != Configuration.ORIENTATION_LANDSCAPE)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
else
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
试试这个...这应该可以根据您的要求工作。并从 onCreate() 中删除这个 if 条件
【讨论】:
但是我必须获取视频大小(高度和宽度)而不是视频视图大小(高度和宽度),并且加载视频大小(高度和宽度)需要几秒钟,因为它是从服务器加载的。假设我运行我的代码,进度条会一直显示直到加载视频,然后如果视频加载完成,我会检查视频的尺寸,如果高度大于宽度,那么它将正常工作,但如果宽度大于高度然后我将不得不将屏幕方向更改为横向模式,但在这种情况下,onCreate 方法将再次调用,并且进度条将再次显示哪个已经先显示【参考方案3】:根据视频比例自动设置方向。
实现 addVideoListener()
videoPlayer.addVideoListener(new VideoListener()
@Override
public void onVideoSizeChanged(int width, int height, int
unappliedRotationDegrees, float pixelWidthHeightRatio)
@Override
public void onRenderedFirstFrame()
);
根据高宽设置条件
if(width>height)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
if(height>width)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
你的最终目标是这样的
videoPlayer.addVideoListener(new VideoListener()
@Override
public void onVideoSizeChanged(int width, int height, int
unappliedRotationDegrees, float pixelWidthHeightRatio)
if(width>height)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
if(height>width)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
@Override
public void onRenderedFirstFrame()
);
【讨论】:
以上是关于如何根据视频的高度和宽度设置屏幕方向的主要内容,如果未能解决你的问题,请参考以下文章