From 5f21be46566ab81e35c714997cf767f760841df0 Mon Sep 17 00:00:00 2001 From: Wangshiwei Date: Thu, 8 Mar 2018 17:59:44 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E5=A2=9E=E5=8A=A0RecycleView=20=E6=BB=91?= =?UTF-8?q?=E5=8A=A8=E7=9B=91=E5=90=AC=EF=BC=8C=E5=AE=9E=E7=8E=B0=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=92=AD=E6=94=BE=E5=8F=AF=E8=A7=81=E5=8C=BA=E5=9F=9F?= =?UTF-8?q?=E5=86=85=E7=9A=84=E7=AC=AC=E4=B8=80=E4=B8=AA=E8=A7=86=E9=A2=91?= =?UTF-8?q?Item?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/ActivityListViewRecyclerView.java | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) diff --git a/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java b/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java index 196809f0c..534ba1cbb 100644 --- a/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java +++ b/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java @@ -1,5 +1,6 @@ package cn.jzvd.demo; +import android.graphics.Rect; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; @@ -13,6 +14,7 @@ import cn.jzvd.JZUtils; import cn.jzvd.JZVideoPlayer; import cn.jzvd.JZVideoPlayerManager; +import cn.jzvd.JZVideoPlayerStandard; /** * Created by yujunkui on 16/8/29. @@ -52,6 +54,7 @@ public void onChildViewDetachedFromWindow(View view) { } } }); + recyclerView.addOnScrollListener(new FeedScrollListener()); } @Override @@ -78,4 +81,123 @@ public boolean onOptionsItemSelected(MenuItem item) { return super.onOptionsItemSelected(item); } + /** + * 监听recycleView滑动状态, + * 自动播放可见区域内的视频 + */ + private static class FeedScrollListener extends RecyclerView.OnScrollListener { + + private int firstVisibleItem = 0; + private int lastVisibleItem = 0; + private int visibleCount = 0; + + /** + * 视频状态标签 + */ + private enum VideoTagEnum { + + /** + * 自动播放视频 + */ + TAG_AUTO_PLAY_VIDEO, + + /** + * 暂停视频 + */ + TAG_PAUSE_VIDEO + } + + + + @Override + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + + // TODO 这可以加上 wifi 下自动播放视频开关 +// if (wifiTag) { + switch (newState) { + case RecyclerView.SCROLL_STATE_IDLE: + autoPlayVideo(recyclerView, VideoTagEnum.TAG_AUTO_PLAY_VIDEO); + default: + autoPlayVideo(recyclerView, VideoTagEnum.TAG_PAUSE_VIDEO); + break; + } +// } else { +// JZVideoPlayer.releaseAllVideos(); +// } + } + + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + + RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); + + if (layoutManager instanceof LinearLayoutManager) { + + LinearLayoutManager linearManager = (LinearLayoutManager) layoutManager; + + firstVisibleItem = linearManager.findFirstVisibleItemPosition(); + lastVisibleItem = linearManager.findLastVisibleItemPosition(); + visibleCount = lastVisibleItem - firstVisibleItem + //TODO + headerView 的个数 ? + ; + } + + } + + /** + * 循环遍历 可见区域的播放器 + * 然后通过 getLocalVisibleRect(rect)方法计算出哪个播放器完全显示出来 + *

+ * getLocalVisibleRect相关链接:http://www.cnblogs.com/ai-developers/p/4413585.html + * + * @param view + * @param handleVideoTag 视频需要进行状态 + */ + private void autoPlayVideo(RecyclerView view, VideoTagEnum handleVideoTag) { + for (int i = 0; i < visibleCount; i++) { + if (view != null && view.getChildAt(i) != null && view.getChildAt(i).findViewById(R.id.videoplayer) != null) { + JZVideoPlayerStandard homeGSYVideoPlayer = (JZVideoPlayerStandard) view.getChildAt(i).findViewById(R.id.videoplayer); + + Rect rect = new Rect(); + homeGSYVideoPlayer.getLocalVisibleRect(rect); + int videoheight = homeGSYVideoPlayer.getHeight(); + if (rect.top == 0 && rect.bottom == videoheight) { + handleVideo(handleVideoTag, homeGSYVideoPlayer); + // 借助跳出循环,达到只处理可见区域内的第一个播放器 + break ; + } + } + } + + } + + /** + * 视频状态处理 + * @param handleVideoTag 视频需要进行状态 + * @param homeGSYVideoPlayer JZVideoPlayer播放器 + */ + private void handleVideo(VideoTagEnum handleVideoTag, JZVideoPlayerStandard homeGSYVideoPlayer) { + switch (handleVideoTag) { + case TAG_AUTO_PLAY_VIDEO: + if ((homeGSYVideoPlayer.currentState != JZVideoPlayerStandard.CURRENT_STATE_PLAYING)) { + // 进行播放 + homeGSYVideoPlayer.startVideo(); + } + break; + case TAG_PAUSE_VIDEO: + if ((homeGSYVideoPlayer.currentState != JZVideoPlayerStandard.CURRENT_STATE_PAUSE)) { + // 模拟点击播放Button,实现暂停视频 + homeGSYVideoPlayer.startButton.performClick(); + } + break; + default: + break; + } + } + + + } + } From debd6683c4488e117e125760ed34180c8263fdc6 Mon Sep 17 00:00:00 2001 From: Wangshiwei Date: Fri, 9 Mar 2018 10:12:45 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E6=BB=91=E5=8A=A8?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E4=B8=8B=E6=9A=82=E5=81=9C=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91=EF=BC=8C=20=E5=BD=93=E5=81=9C?= =?UTF-8?q?=E6=AD=A2=E6=BB=91=E5=8A=A8=E6=97=B6=EF=BC=8C=E9=81=8D=E5=8E=86?= =?UTF-8?q?=E6=89=BE=E5=87=BA=E5=8F=AF=E8=A7=81=E5=8C=BA=E5=9F=9F=E5=86=85?= =?UTF-8?q?=E7=9A=84=E7=AC=AC=E4=B8=80=E4=B8=AA=E6=92=AD=E6=94=BE=E5=99=A8?= =?UTF-8?q?=E6=8E=A7=E4=BB=B6=EF=BC=8C=E8=BF=9B=E8=A1=8C=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E6=92=AD=E6=94=BE=EF=BC=8C=E7=B1=BB=E4=BC=BC=E5=BE=AE=E5=8D=9A?= =?UTF-8?q?=E6=95=88=E6=9E=9C=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (播放器控件被屏幕顶部或者底部遮罩时,才停止播放视频,--> 框架本身就支持这个) --- .../main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java b/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java index 534ba1cbb..20f808db8 100644 --- a/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java +++ b/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java @@ -119,11 +119,12 @@ public void onScrollStateChanged(RecyclerView recyclerView, int newState) { case RecyclerView.SCROLL_STATE_IDLE: autoPlayVideo(recyclerView, VideoTagEnum.TAG_AUTO_PLAY_VIDEO); default: - autoPlayVideo(recyclerView, VideoTagEnum.TAG_PAUSE_VIDEO); + // 滑动时暂停视频 + // autoPlayVideo(recyclerView, VideoTagEnum.TAG_PAUSE_VIDEO); break; } // } else { -// JZVideoPlayer.releaseAllVideos(); +// // do some .... // } } From c74209426978c0489e79eb4e51edada2f4d8f152 Mon Sep 17 00:00:00 2001 From: Wangshiwei Date: Tue, 13 Mar 2018 14:45:37 +0800 Subject: [PATCH 3/7] =?UTF-8?q?Fix=20=20issues=20#1681=20JZVideoPlayerMana?= =?UTF-8?q?ger.getCurrentJzvd().currentScreen=20-->=20NullPointerException?= =?UTF-8?q?=20=E8=AF=A6=E7=BB=86=E6=8F=8F=E8=BF=B0=E8=AF=B7=E5=8F=82?= =?UTF-8?q?=E9=98=85=20https://github.com/lipangit/JiaoZiVideoPlayer/issue?= =?UTF-8?q?s/1681?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/ActivityListViewRecyclerView.java | 37 ++++++++++++------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java b/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java index 20f808db8..2982fb849 100644 --- a/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java +++ b/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java @@ -8,7 +8,6 @@ import android.support.v7.widget.RecyclerView; import android.view.MenuItem; import android.view.View; -import android.widget.Toast; import cn.jzvd.JZMediaManager; import cn.jzvd.JZUtils; @@ -48,7 +47,19 @@ public void onChildViewAttachedToWindow(View view) { public void onChildViewDetachedFromWindow(View view) { JZVideoPlayer jzvd = view.findViewById(R.id.videoplayer); if (jzvd != null && JZUtils.dataSourceObjectsContainsUri(jzvd.dataSourceObjects, JZMediaManager.getCurrentDataSource())) { - if(JZVideoPlayerManager.getCurrentJzvd().currentScreen != JZVideoPlayer.SCREEN_WINDOW_FULLSCREEN){ +/* + + 在使用过程中发现,在快速滑动RecycleView 时, + JZVideoPlayerManager.getCurrentJzvd().currentScreen 这句 会报NullPointerException + java.lang.NullPointerException: Attempt to read from field 'int cn.jzvd.JZVideoPlayer.currentScreen' on a null object reference + 详见 https://github.com/lipangit/JiaoZiVideoPlayer/issues/1681 + + if (JZVideoPlayerManager.getCurrentJzvd().currentScreen != JZVideoPlayer.SCREEN_WINDOW_FULLSCREEN) { + JZVideoPlayer.releaseAllVideos(); + } +*/ + + if (jzvd.currentScreen != JZVideoPlayer.SCREEN_WINDOW_FULLSCREEN) { JZVideoPlayer.releaseAllVideos(); } } @@ -108,21 +119,20 @@ private enum VideoTagEnum { } - @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); // TODO 这可以加上 wifi 下自动播放视频开关 // if (wifiTag) { - switch (newState) { - case RecyclerView.SCROLL_STATE_IDLE: - autoPlayVideo(recyclerView, VideoTagEnum.TAG_AUTO_PLAY_VIDEO); - default: - // 滑动时暂停视频 - // autoPlayVideo(recyclerView, VideoTagEnum.TAG_PAUSE_VIDEO); - break; - } + switch (newState) { + case RecyclerView.SCROLL_STATE_IDLE: + autoPlayVideo(recyclerView, VideoTagEnum.TAG_AUTO_PLAY_VIDEO); + default: + // 滑动时暂停视频 + // autoPlayVideo(recyclerView, VideoTagEnum.TAG_PAUSE_VIDEO); + break; + } // } else { // // do some .... // } @@ -167,7 +177,7 @@ private void autoPlayVideo(RecyclerView view, VideoTagEnum handleVideoTag) { if (rect.top == 0 && rect.bottom == videoheight) { handleVideo(handleVideoTag, homeGSYVideoPlayer); // 借助跳出循环,达到只处理可见区域内的第一个播放器 - break ; + break; } } } @@ -176,7 +186,8 @@ private void autoPlayVideo(RecyclerView view, VideoTagEnum handleVideoTag) { /** * 视频状态处理 - * @param handleVideoTag 视频需要进行状态 + * + * @param handleVideoTag 视频需要进行状态 * @param homeGSYVideoPlayer JZVideoPlayer播放器 */ private void handleVideo(VideoTagEnum handleVideoTag, JZVideoPlayerStandard homeGSYVideoPlayer) { From d566527817b21bb5f13d577f7ceb7c03533088ea Mon Sep 17 00:00:00 2001 From: Wangshiwei Date: Tue, 13 Mar 2018 15:08:33 +0800 Subject: [PATCH 4/7] Revert --- .../cn/jzvd/demo/ActivityListViewRecyclerView.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java b/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java index 2982fb849..14b7a4c15 100644 --- a/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java +++ b/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java @@ -47,21 +47,9 @@ public void onChildViewAttachedToWindow(View view) { public void onChildViewDetachedFromWindow(View view) { JZVideoPlayer jzvd = view.findViewById(R.id.videoplayer); if (jzvd != null && JZUtils.dataSourceObjectsContainsUri(jzvd.dataSourceObjects, JZMediaManager.getCurrentDataSource())) { -/* - - 在使用过程中发现,在快速滑动RecycleView 时, - JZVideoPlayerManager.getCurrentJzvd().currentScreen 这句 会报NullPointerException - java.lang.NullPointerException: Attempt to read from field 'int cn.jzvd.JZVideoPlayer.currentScreen' on a null object reference - 详见 https://github.com/lipangit/JiaoZiVideoPlayer/issues/1681 - if (JZVideoPlayerManager.getCurrentJzvd().currentScreen != JZVideoPlayer.SCREEN_WINDOW_FULLSCREEN) { JZVideoPlayer.releaseAllVideos(); } -*/ - - if (jzvd.currentScreen != JZVideoPlayer.SCREEN_WINDOW_FULLSCREEN) { - JZVideoPlayer.releaseAllVideos(); - } } } }); From fb3237e32e8e844105aff8be1b3d918ba575ee6b Mon Sep 17 00:00:00 2001 From: Wangshiwei Date: Tue, 13 Mar 2018 15:45:26 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E5=8F=82=E7=85=A7=E4=B8=BB=E5=B9=B2?= =?UTF-8?q?=EF=BC=8C=E8=BF=98=E5=8E=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/ActivityListViewRecyclerView.java | 121 ------------------ 1 file changed, 121 deletions(-) diff --git a/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java b/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java index 14b7a4c15..b8fbb1fc6 100644 --- a/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java +++ b/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java @@ -53,7 +53,6 @@ public void onChildViewDetachedFromWindow(View view) { } } }); - recyclerView.addOnScrollListener(new FeedScrollListener()); } @Override @@ -80,124 +79,4 @@ public boolean onOptionsItemSelected(MenuItem item) { return super.onOptionsItemSelected(item); } - /** - * 监听recycleView滑动状态, - * 自动播放可见区域内的视频 - */ - private static class FeedScrollListener extends RecyclerView.OnScrollListener { - - private int firstVisibleItem = 0; - private int lastVisibleItem = 0; - private int visibleCount = 0; - - /** - * 视频状态标签 - */ - private enum VideoTagEnum { - - /** - * 自动播放视频 - */ - TAG_AUTO_PLAY_VIDEO, - - /** - * 暂停视频 - */ - TAG_PAUSE_VIDEO - } - - - @Override - public void onScrollStateChanged(RecyclerView recyclerView, int newState) { - super.onScrollStateChanged(recyclerView, newState); - - // TODO 这可以加上 wifi 下自动播放视频开关 -// if (wifiTag) { - switch (newState) { - case RecyclerView.SCROLL_STATE_IDLE: - autoPlayVideo(recyclerView, VideoTagEnum.TAG_AUTO_PLAY_VIDEO); - default: - // 滑动时暂停视频 - // autoPlayVideo(recyclerView, VideoTagEnum.TAG_PAUSE_VIDEO); - break; - } -// } else { -// // do some .... -// } - } - - @Override - public void onScrolled(RecyclerView recyclerView, int dx, int dy) { - super.onScrolled(recyclerView, dx, dy); - - RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); - - if (layoutManager instanceof LinearLayoutManager) { - - LinearLayoutManager linearManager = (LinearLayoutManager) layoutManager; - - firstVisibleItem = linearManager.findFirstVisibleItemPosition(); - lastVisibleItem = linearManager.findLastVisibleItemPosition(); - visibleCount = lastVisibleItem - firstVisibleItem - //TODO + headerView 的个数 ? - ; - } - - } - - /** - * 循环遍历 可见区域的播放器 - * 然后通过 getLocalVisibleRect(rect)方法计算出哪个播放器完全显示出来 - *

- * getLocalVisibleRect相关链接:http://www.cnblogs.com/ai-developers/p/4413585.html - * - * @param view - * @param handleVideoTag 视频需要进行状态 - */ - private void autoPlayVideo(RecyclerView view, VideoTagEnum handleVideoTag) { - for (int i = 0; i < visibleCount; i++) { - if (view != null && view.getChildAt(i) != null && view.getChildAt(i).findViewById(R.id.videoplayer) != null) { - JZVideoPlayerStandard homeGSYVideoPlayer = (JZVideoPlayerStandard) view.getChildAt(i).findViewById(R.id.videoplayer); - - Rect rect = new Rect(); - homeGSYVideoPlayer.getLocalVisibleRect(rect); - int videoheight = homeGSYVideoPlayer.getHeight(); - if (rect.top == 0 && rect.bottom == videoheight) { - handleVideo(handleVideoTag, homeGSYVideoPlayer); - // 借助跳出循环,达到只处理可见区域内的第一个播放器 - break; - } - } - } - - } - - /** - * 视频状态处理 - * - * @param handleVideoTag 视频需要进行状态 - * @param homeGSYVideoPlayer JZVideoPlayer播放器 - */ - private void handleVideo(VideoTagEnum handleVideoTag, JZVideoPlayerStandard homeGSYVideoPlayer) { - switch (handleVideoTag) { - case TAG_AUTO_PLAY_VIDEO: - if ((homeGSYVideoPlayer.currentState != JZVideoPlayerStandard.CURRENT_STATE_PLAYING)) { - // 进行播放 - homeGSYVideoPlayer.startVideo(); - } - break; - case TAG_PAUSE_VIDEO: - if ((homeGSYVideoPlayer.currentState != JZVideoPlayerStandard.CURRENT_STATE_PAUSE)) { - // 模拟点击播放Button,实现暂停视频 - homeGSYVideoPlayer.startButton.performClick(); - } - break; - default: - break; - } - } - - - } - } From 8f7c9c3c8f89a670f90bb3c3e074705950597e0d Mon Sep 17 00:00:00 2001 From: Wangshiwei Date: Tue, 13 Mar 2018 15:46:41 +0800 Subject: [PATCH 6/7] Fix NullPointerException https://github.com/lipangit/JiaoZiVideoPlayer/issues/1681 --- .../main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java b/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java index b8fbb1fc6..e3f4c337c 100644 --- a/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java +++ b/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java @@ -47,7 +47,7 @@ public void onChildViewAttachedToWindow(View view) { public void onChildViewDetachedFromWindow(View view) { JZVideoPlayer jzvd = view.findViewById(R.id.videoplayer); if (jzvd != null && JZUtils.dataSourceObjectsContainsUri(jzvd.dataSourceObjects, JZMediaManager.getCurrentDataSource())) { - if (JZVideoPlayerManager.getCurrentJzvd().currentScreen != JZVideoPlayer.SCREEN_WINDOW_FULLSCREEN) { + if (jzvd.currentScreen != JZVideoPlayer.SCREEN_WINDOW_FULLSCREEN) { JZVideoPlayer.releaseAllVideos(); } } From ddbf132344fb6f960467988aa5e56741c88000f5 Mon Sep 17 00:00:00 2001 From: Wangshiwei Date: Tue, 13 Mar 2018 16:01:27 +0800 Subject: [PATCH 7/7] Fix NullPointerException https://github.com/lipangit/JiaoZiVideoPlayer/issues/1681 --- .../main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java b/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java index e3f4c337c..4e16aa6cd 100644 --- a/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java +++ b/app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java @@ -47,7 +47,7 @@ public void onChildViewAttachedToWindow(View view) { public void onChildViewDetachedFromWindow(View view) { JZVideoPlayer jzvd = view.findViewById(R.id.videoplayer); if (jzvd != null && JZUtils.dataSourceObjectsContainsUri(jzvd.dataSourceObjects, JZMediaManager.getCurrentDataSource())) { - if (jzvd.currentScreen != JZVideoPlayer.SCREEN_WINDOW_FULLSCREEN) { + if (jzvd.currentScreen != JZVideoPlayer.SCREEN_WINDOW_FULLSCREEN ) { JZVideoPlayer.releaseAllVideos(); } }