[Android学习笔记八] 使用VideoView屏幕方向发生变化,视频方向自动切换
一个Activity主要用来做播放视频使用,并且是全屏播放的话,主要采用横屏(Landscape orientation 显示宽度大于高度)显示视频,那么可以指定Activity的属性android:screenOrientation="landscape"让Activity在设备上以横屏显示。 本文使用VideoView来显示视屏,Potrait(竖屏)时布局样式中宽匹配父布局,高匹配内容;Landscape(横屏)时布局样式中宽匹配内容,高匹配布局。视屏播放中,用户调正设备方向时,导致屏幕方向发生变化,视屏能够适应布局样式显示视频,并正常继续播放。 示例图: 1. 构建布局 Potrait: res/layout/activity_videoview.xml 1 2 3 4 5 6 7 8 9 10 11 <? xml version = "1.0" encoding = "utf-8" ?> < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" android:layout_width = "match_parent" android:layout_height = "match_parent" android:orientation = "vertical" > < VideoView android:id = "@+id/videoView" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_gravity = "center_horizontal" android:layout_margin = "5dp" /> </ LinearLayout > Landscape: res/layout-land/activity_videoview.xml 1 2 3 4 5 6 7 8 9 10 <? xml version = "1.0" encoding = "utf-8" ?> < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" android:orientation = "vertical" android:layout_width = "match_parent" android:layout_height = "match_parent" > < VideoView android:layout_width = "wrap_content" android:layout_height = "match_parent" android:id = "@+id/videoView" android:layout_gravity = "center_horizontal" android:layout_margin = "5dp" /> </ LinearLayout > 2.创建Activity 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 package secondriver.sdk.activity; import android.app.Activity; import android.app.ProgressDialog; import android.content.res.Configuration; import android.media.MediaPlayer; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.widget.MediaController; import android.widget.Toast; import android.widget.VideoView; import secondriver.sdk.R; /** *Author:secondriver *Created:2015/11/30 */ public class VideoViewActivity extends Activity implements MediaPlayer.OnPreparedListener,MediaPlayer.OnCompletionListener,MediaPlayer.OnErrorListener{ private final StringTAG=VideoViewActivity. class .getName(); public VideoViewvideoView; public MediaControllermediaController; public int videoPosition= 0 ; public ProgressDialogdialog; @Override protected void onCreate(BundlesavedInstanceState){ Log.d(TAG, "onCreate" ); super .onCreate(savedInstanceState); setContentView(R.layout.activity_videoview); dialog= new ProgressDialog( this ); dialog.setTitle( "视屏播放器" ); dialog.setMessage( "正在加载..." ); dialog.setCancelable( false ); mediaController= new MediaController( this ); videoView=(VideoView)findViewById(R.id.videoView); videoView.setMediaController(mediaController); videoView.setOnCompletionListener( this ); videoView.setOnPreparedListener( this ); videoView.setOnErrorListener( this ); } private void loadVideo(){ Log.d(TAG, "loadvideo" ); dialog.show(); try { videoView.setVideoURI(Uri.parse( "android.resource://" +getPackageName()+ "/" +R.raw.bsg)); } catch (Exceptione){ Log.e(TAG,e.getMessage()); } } @Override protected void onStart(){ Log.d(TAG, "onStart" ); super .onStart(); loadVideo(); } @Override public void onConfigurationChanged(ConfigurationnewConfig){ Log.d(TAG, "onConfigurationChanged" ); super .onConfigurationChanged(newConfig); } @Override public void onCompletion(MediaPlayermp){ Log.d(TAG, "MediaonCompletion" ); Toast.makeText(VideoViewActivity. this , "播放完成" ,Toast.LENGTH_LONG).show(); mp.release(); } @Override public void onPrepared(MediaPlayermp){ Log.d(TAG, "MediaonPrepared" ); if (dialog.isShowing()){ dialog.dismiss(); } mp.seekTo(videoPosition); if (videoPosition== 0 ){ mp.start(); } else { mp.pause(); } } @Override public boolean onError(MediaPlayermp, int what, int extra){ Log.d(TAG, "MediaonError" ); Stringerr= "未知错误" ; switch (what){ case MediaPlayer.MEDIA_ERROR_UNKNOWN: break ; case MediaPlayer.MEDIA_ERROR_SERVER_DIED: err= "媒体服务终止" ; break ; default : break ; } Toast.makeText(VideoViewActivity. this ,err,Toast.LENGTH_LONG).show(); return true ; } } 3. 设置Activity属性 1 2 3 <activityandroid:name= ".activity.VideoViewActivity" android:configChanges= "orientation|screenSize|keyboardHidden" /> 代码中重写了onConfigurationChanged,可以在此处做配置发生变化的处理。 在运行时发生配置更改,Activity被关闭,默认情况下重新启动,但在设置了Activity的configChanges属性的配置将防止活动被重新启动,Activity仍在运行并且onConfigurationChanged方法被调用。 需要注意的是如果应用程序的target API level是13+的话(声明了minSdkversion和targetSdkVersion属性),需要同时设置screensize, 因为设备的横竖方向发生变化的时候,当前屏幕的可用尺寸也将发生变化。 本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1718653,如需转载请自行联系原作者