注意:下面几种方式所在的Activity不要忘记配置manifest的config。
<activity android:name=".xxxxx" android:configChanges="orientation|keyboardHidden|screenSize" android:screenOrientation="portrait" />1、adapter布局中添加播放控件
<com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer android:id="@+id/detail_player" android:layout_width="match_parent" android:layout_height="@dimen/post_media_height" />2、adapter中配置播放控件(也可以使用builder模式,详见下方detail模式中)
holder.gsyVideoPlayer.setUpLazy(url, true, null, null, "这是title"); //增加title holder.gsyVideoPlayer.getTitleTextView().setVisibility(View.GONE); //设置返回键 holder.gsyVideoPlayer.getBackButton().setVisibility(View.GONE); //设置全屏按键功能 holder.gsyVideoPlayer.getFullscreenButton().setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { holder.gsyVideoPlayer.startWindowFullscreen(context, false, true); } }); //防止错位设置 holder.gsyVideoPlayer.setPlayTag(TAG); holder.gsyVideoPlayer.setPlayPosition(position); //是否根据视频尺寸,自动选择竖屏全屏或者横屏全屏 holder.gsyVideoPlayer.setAutoFullWithSize(true); //音频焦点冲突时是否释放 holder.gsyVideoPlayer.setReleaseWhenLossAudio(false); //全屏动画 holder.gsyVideoPlayer.setShowFullAnimation(true); //小屏时不触摸滑动 holder.gsyVideoPlayer.setIsTouchWiget(false);3、Activity中配置生命周期
@Override protected void onCreate(Bundle savedInstanceState) { ··· videoList.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) {} @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { int lastVisibleItem = firstVisibleItem + visibleItemCount; //大于0说明有播放 if (GSYVideoManager.instance().getPlayPosition() >= 0) { //当前播放的位置 int position = GSYVideoManager.instance().getPlayPosition(); //对应的播放列表TAG if (GSYVideoManager.instance().getPlayTag().equals(ListNormalAdapter.TAG) && (position < firstVisibleItem || position > lastVisibleItem)) { if(GSYVideoManager.isFullState(ListVideoActivity.this)) { return; } //如果滑出去了上面和下面就是否,和今日头条一样 GSYVideoManager.releaseAllVideos(); adapter.notifyDataSetChanged(); } } } }); ··· } @Override public void onBackPressed() { if (GSYVideoManager.backFromWindowFull(this)) { return; } super.onBackPressed(); } @Override protected void onPause() { super.onPause(); GSYVideoManager.onPause(); } @Override protected void onResume() { super.onResume(); GSYVideoManager.onResume(); } @Override protected void onDestroy() { super.onDestroy(); GSYVideoManager.releaseAllVideos(); }一、item布局中添加
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <FrameLayout android:id="@+id/list_item_container" android:layout_width="match_parent" android:layout_height="@dimen/post_media_height" android:scaleType="centerCrop" android:src="@mipmap/xxx1" /> <ImageView android:id="@+id/list_item_btn" android:layout_width="60dp" android:layout_height="60dp" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:layout_gravity="center_vertical" android:src="@drawable/video_click_play_selector" /> </RelativeLayout>2、Activity中创建helper和配置生命周期
GSYVideoHelper smallVideoHelper; ListVideoAdapter listVideoAdapter; GSYVideoHelper.GSYVideoHelperBuilder gsySmallVideoHelperBuilder; int lastVisibleItem; int firstVisibleItem; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list_video2); //创建小窗口帮助类 smallVideoHelper = new GSYVideoHelper(this); //配置 gsySmallVideoHelperBuilder = new GSYVideoHelper.GSYVideoHelperBuilder(); gsySmallVideoHelperBuilder .setHideStatusBar(true) .setNeedLockFull(true) .setCacheWithPlay(true) .setShowFullAnimation(false) .setRotateViewAuto(false) .setLockLand(true) .setVideoAllCallBack(new GSYSampleCallBack(){ @Override public void onQuitSmallWidget(String url, Object... objects) { super.onQuitSmallWidget(url, objects); //大于0说明有播放,//对应的播放列表TAG if (smallVideoHelper.getPlayPosition() >= 0 && smallVideoHelper.getPlayTAG().equals(ListVideoAdapter.TAG)) { //当前播放的位置 int position = smallVideoHelper.getPlayPosition(); //不可视的是时候 if ((position < firstVisibleItem || position > lastVisibleItem)) { //释放掉视频 smallVideoHelper.releaseVideoPlayer(); listVideoAdapter.notifyDataSetChanged(); } } } }); smallVideoHelper.setGsyVideoOptionBuilder(gsySmallVideoHelperBuilder); videoList.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { ListVideo2Activity.this.firstVisibleItem = firstVisibleItem; lastVisibleItem = firstVisibleItem + visibleItemCount; //大于0说明有播放,//对应的播放列表TAG if (smallVideoHelper.getPlayPosition() >= 0 && smallVideoHelper.getPlayTAG().equals(ListVideoAdapter.TAG)) { //当前播放的位置 int position = smallVideoHelper.getPlayPosition(); //不可视的是时候 if ((position < firstVisibleItem || position > lastVisibleItem)) { //如果是小窗口就不需要处理 if (!smallVideoHelper.isSmall()) { //小窗口 int size = CommonUtil.dip2px(ListVideo2Activity.this, 150); smallVideoHelper.showSmallVideo(new Point(size, size), false, true); } } else { if (smallVideoHelper.isSmall()) { smallVideoHelper.smallVideoToNormal(); } } } } }); } @Override public void onBackPressed() { if (smallVideoHelper.backFromFull()) { return; } super.onBackPressed(); } @Override protected void onDestroy() { super.onDestroy(); smallVideoHelper.releaseVideoPlayer(); GSYVideoManager.releaseAllVideos(); }3、adapter中使用helper
··· smallVideoHelper.addVideoPlayer(position, holder.imageView, TAG, holder.videoContainer, holder.playerBtn); holder.playerBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { notifyDataSetChanged(); smallVideoHelper.setPlayPositionAndTag(position, TAG); final String url = "http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f20.mp4"; gsySmallVideoHelperBuilder.setVideoTitle("title " + position) .setUrl(url); smallVideoHelper.startPlay(); } }); ···1、布局中添加播放控件
<com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer android:id="@+id/detail_player" android:layout_width="match_parent" android:layout_height="@dimen/post_media_height" />2、Activity继承GSYBaseActivityDetail
public class DetailControlActivity extends GSYBaseActivityDetail<StandardGSYVideoPlayer>3、重载配置
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail_player); detailPlayer = (StandardGSYVideoPlayer) findViewById(R.id.detail_player); //增加title detailPlayer.getTitleTextView().setVisibility(View.GONE); detailPlayer.getBackButton().setVisibility(View.GONE); initVideoBuilderMode(); } @Override public StandardGSYVideoPlayer getGSYVideoPlayer() { return detailPlayer; } @Override public GSYVideoOptionBuilder getGSYVideoOptionBuilder() { //内置封面可参考SampleCoverVideo ImageView imageView = new ImageView(this); loadCover(imageView, url); return new GSYVideoOptionBuilder() .setThumbImageView(imageView) .setUrl(url) .setCacheWithPlay(true) .setVideoTitle(" ") .setIsTouchWiget(true) .setRotateViewAuto(false) .setLockLand(false) .setShowFullAnimation(false) .setNeedLockFull(true) .setSeekRatio(1); } @Override public void clickForFullScreen() { } /** * 是否启动旋转横屏,true表示启动 */ @Override public boolean getDetailOrientationRotateAuto() { return true; }1、布局中添加播放控件
<com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer android:id="@+id/detail_player" android:layout_width="match_parent" android:layout_height="@dimen/post_media_height" />2、onCreate中配置播放器、添加旋转外部旋转支持、增加监听。(也可以会直接通过player设置,不用builder)
//外部辅助的旋转,帮助全屏 orientationUtils = new OrientationUtils(this, detailPlayer); //初始化不打开外部的旋转 orientationUtils.setEnable(false); GSYVideoOptionBuilder gsyVideoOption = new GSYVideoOptionBuilder(); gsyVideoOption.setThumbImageView(imageView) .setIsTouchWiget(true) .setRotateViewAuto(false) .setLockLand(false) .setAutoFullWithSize(true) .setShowFullAnimation(false) .setNeedLockFull(true) .setUrl(url) .setCacheWithPlay(false) .setVideoTitle("测试视频") .setVideoAllCallBack(new GSYSampleCallBack() { @Override public void onPrepared(String url, Object... objects) { super.onPrepared(url, objects); //开始播放了才能旋转和全屏 orientationUtils.setEnable(true); isPlay = true; } @Override public void onQuitFullscreen(String url, Object... objects) { super.onQuitFullscreen(url, objects); Debuger.printfError("***** onQuitFullscreen **** " + objects[0]);//title Debuger.printfError("***** onQuitFullscreen **** " + objects[1]);//当前非全屏player if (orientationUtils != null) { orientationUtils.backToProtVideo(); } } }).setLockClickListener(new LockClickListener() { @Override public void onClick(View view, boolean lock) { if (orientationUtils != null) { //配合下方的onConfigurationChanged orientationUtils.setEnable(!lock); } } }).build(detailPlayer); detailPlayer.getFullscreenButton().setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //直接横屏 orientationUtils.resolveByClick(); //第一个true是否需要隐藏actionbar,第二个true是否需要隐藏statusbar detailPlayer.startWindowFullscreen(SimpleDetailActivityMode2.this, true, true); } });3、配置生命周期
@Override public void onBackPressed() { if (orientationUtils != null) { orientationUtils.backToProtVideo(); } if (GSYVideoManager.backFromWindowFull(this)) { return; } super.onBackPressed(); } @Override protected void onPause() { detailPlayer.getCurrentPlayer().onVideoPause(); super.onPause(); isPause = true; } @Override protected void onResume() { detailPlayer.getCurrentPlayer().onVideoResume(false); super.onResume(); isPause = false; } @Override protected void onDestroy() { super.onDestroy(); if (isPlay) { detailPlayer.getCurrentPlayer().release(); } if (orientationUtils != null) orientationUtils.releaseListener(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); //如果旋转了就全屏 if (isPlay && !isPause) { detailPlayer.onConfigurationChanged(this, newConfig, orientationUtils, true, true); } }(以下设置全局生效哦)
