From c5197b1c26a60f46929ea202a8459423322013d5 Mon Sep 17 00:00:00 2001 From: shuyu <359369982@qq.com> Date: Thu, 21 Jun 2018 21:44:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=97=E8=A1=A8=E5=B9=BF?= =?UTF-8?q?=E5=91=8A=E6=A8=A1=E5=BC=8F2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 7 + .../gsyvideoplayer/ListADVideoActivity2.java | 334 ++++++++++++++++++ .../gsyvideoplayer/utils/JumpUtils.java | 4 +- .../video/RequestListADVideoPlayer.java | 52 +++ .../main/res/layout/list_video_item_ad2.xml | 19 + 5 files changed, 415 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/example/gsyvideoplayer/ListADVideoActivity2.java create mode 100644 app/src/main/java/com/example/gsyvideoplayer/video/RequestListADVideoPlayer.java create mode 100644 app/src/main/res/layout/list_video_item_ad2.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 03952b3..f817d9a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -138,6 +138,13 @@ android:screenOrientation="portrait" android:theme="@style/Theme.AppCompat.Translucent" /> + + + = Build.VERSION_CODES.LOLLIPOP) { + getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS); + getWindow().setEnterTransition(new Explode()); + getWindow().setExitTransition(new Explode()); + } + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_list_video); + ButterKnife.bind(this); + + listADNormalAdapter = new ListADNormalAdapter(this); + videoList.setAdapter(listADNormalAdapter); + + 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(ListADNormalAdapter.TAG) + && (position < firstVisibleItem || position > lastVisibleItem)) { + //如果滑出去了上面和下面就是否,和今日头条一样 + //释放广告和视频 + if (GSYVideoADManager.instance().listener() != null) { + GSYVideoADManager.instance().listener().onAutoCompletion(); + } + GSYVideoADManager.releaseAllVideos(); + GSYVideoManager.releaseAllVideos(); + listADNormalAdapter.notifyDataSetChanged(); + } + } + } + }); + + } + + @Override + public void onBackPressed() { + if (GSYVideoADManager.backFromWindowFull(this)) { + return; + } + if (GSYVideoManager.backFromWindowFull(this)) { + return; + } + super.onBackPressed(); + } + + @Override + protected void onPause() { + super.onPause(); + GSYVideoManager.onPause(); + GSYVideoADManager.onPause(); + } + + @Override + protected void onResume() { + super.onResume(); + GSYVideoManager.onResume(); + GSYVideoADManager.onResume(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + GSYVideoManager.releaseAllVideos(); + GSYVideoADManager.releaseAllVideos(); + } + + + public class ListADNormalAdapter extends BaseAdapter { + + public static final String TAG = "ListADNormalAdapter"; + + private List list = new ArrayList<>(); + private LayoutInflater inflater = null; + private Context context; + + public ListADNormalAdapter(Context context) { + super(); + this.context = context; + inflater = LayoutInflater.from(context); + for (int i = 0; i < 40; i++) { + list.add(new VideoModel()); + } + + } + + @Override + public int getCount() { + return list.size(); + } + + @Override + public Object getItem(int position) { + return null; + } + + @Override + public long getItemId(int position) { + return 0; + } + + @Override + public View getView(final int position, View convertView, ViewGroup parent) { + final ViewHolder holder; + if (convertView == null) { + holder = new ViewHolder(); + convertView = inflater.inflate(R.layout.list_video_item_ad2, null); + holder.gsyVideoPlayer = (SampleCoverVideo) convertView.findViewById(R.id.video_item_player); + holder.adVideoPlayer = (RequestListADVideoPlayer) convertView.findViewById(R.id.video_ad_player); + convertView.setTag(holder); + } else { + holder = (ViewHolder) convertView.getTag(); + } + + + final String url = "http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f20.mp4"; + final String urlAD = "http://video.7k.cn/app_video/20171202/6c8cf3ea/v.m3u8.mp4"; + + //多个播放时必须在setUpLazy、setUp和getGSYVideoManager()等前面设置 + holder.gsyVideoPlayer.setPlayTag(TAG); + holder.gsyVideoPlayer.setPlayPosition(position); + + boolean isPlaying = holder.gsyVideoPlayer.getCurrentPlayer().isInPlayingState(); + + if (!isPlaying) { + holder.gsyVideoPlayer.setUpLazy(url, false, null, null, "这是title"); + } + + boolean isADPlaying = holder.adVideoPlayer.getCurrentPlayer().isInPlayingState(); + if (!isADPlaying) { + holder.adVideoPlayer.setUpLazy(urlAD, false, 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) { + resolveFullBtn(holder.gsyVideoPlayer); + } + }); + holder.adVideoPlayer.getFullscreenButton().setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + resolveFullBtn(holder.adVideoPlayer); + } + }); + holder.gsyVideoPlayer.setRotateViewAuto(false); + holder.adVideoPlayer.setRotateViewAuto(false); + holder.gsyVideoPlayer.setLockLand(true); + holder.adVideoPlayer.setLockLand(true); + holder.gsyVideoPlayer.setReleaseWhenLossAudio(false); + holder.adVideoPlayer.setReleaseWhenLossAudio(false); + holder.gsyVideoPlayer.setShowFullAnimation(false); + holder.adVideoPlayer.setShowFullAnimation(false); + holder.gsyVideoPlayer.setIsTouchWiget(false); + holder.adVideoPlayer.setIsTouchWiget(false); + + holder.gsyVideoPlayer.setNeedLockFull(true); + + if (position % 2 == 0) { + holder.gsyVideoPlayer.loadCoverImage(url, R.mipmap.xxx1); + } else { + holder.gsyVideoPlayer.loadCoverImage(url, R.mipmap.xxx2); + } + + holder.gsyVideoPlayer.setVideoAllCallBack(new GSYSampleCallBack() { + + @Override + public void onClickStartIcon(String url, Object... objects) { + super.onClickStartIcon(url, objects); + if (holder.adVideoPlayer.getGSYVideoManager().listener() != null) { + holder.adVideoPlayer.getGSYVideoManager().listener().onAutoCompletion(); + } + } + + @Override + public void onPrepared(String url, Object... objects) { + super.onPrepared(url, objects); + if (isNeedAdOnStart()) { + holder.gsyVideoPlayer.getCurrentPlayer().onVideoPause(); + startAdPlay(holder.adVideoPlayer, holder.gsyVideoPlayer); + } + } + + @Override + public void onQuitFullscreen(String url, Object... objects) { + super.onQuitFullscreen(url, objects); + } + + @Override + public void onEnterFullscreen(String url, Object... objects) { + super.onEnterFullscreen(url, objects); + holder.gsyVideoPlayer.getCurrentPlayer().getTitleTextView().setText((String) objects[0]); + } + + @Override + public void onAutoComplete(String url, Object... objects) { + super.onAutoComplete(url, objects); + } + }); + + holder.adVideoPlayer.setVideoAllCallBack(new GSYSampleCallBack() { + + + @Override + public void onAutoComplete(String url, Object... objects) { + //广告结束,释放 + holder.adVideoPlayer.getCurrentPlayer().release(); + holder.adVideoPlayer.onVideoReset(); + holder.adVideoPlayer.setVisibility(View.GONE); + + //开始播放原视频,根据是否处于全屏状态判断 + int playPosition = holder.gsyVideoPlayer.getGSYVideoManager().getPlayPosition(); + if (position == playPosition) { + holder.gsyVideoPlayer.getCurrentPlayer().startAfterPrepared(); + } + + if (holder.adVideoPlayer.getCurrentPlayer().isIfCurrentIsFullscreen()) { + holder.adVideoPlayer.removeFullWindowViewOnly(); + if (!holder.gsyVideoPlayer.getCurrentPlayer().isIfCurrentIsFullscreen()) { + resolveFullBtn(holder.gsyVideoPlayer); + holder.gsyVideoPlayer.setSaveBeforeFullSystemUiVisibility(holder.adVideoPlayer.getSaveBeforeFullSystemUiVisibility()); + } + } + } + + @Override + public void onQuitFullscreen(String url, Object... objects) { + //退出全屏逻辑 + if (holder.gsyVideoPlayer.isIfCurrentIsFullscreen()) { + holder.gsyVideoPlayer.onBackFullscreen(); + } + } + + }); + + + return convertView; + } + + /** + * 全屏幕按键处理 + */ + private void resolveFullBtn(final StandardGSYVideoPlayer standardGSYVideoPlayer) { + standardGSYVideoPlayer.startWindowFullscreen(context, false, true); + } + + + /** + * 显示播放广告 + */ + public void startAdPlay(GSYADVideoPlayer gsyadVideoPlayer, StandardGSYVideoPlayer normalPlayer) { + gsyadVideoPlayer.setVisibility(View.VISIBLE); + gsyadVideoPlayer.startPlayLogic(); + if (normalPlayer.getCurrentPlayer().isIfCurrentIsFullscreen()) { + resolveFullBtn(gsyadVideoPlayer); + gsyadVideoPlayer.setSaveBeforeFullSystemUiVisibility(normalPlayer.getSaveBeforeFullSystemUiVisibility()); + } + } + + class ViewHolder { + SampleCoverVideo gsyVideoPlayer; + RequestListADVideoPlayer adVideoPlayer; + } + } + + + /** + * 需要片头广告 + */ + public boolean isNeedAdOnStart() { + return true; + } + +} diff --git a/app/src/main/java/com/example/gsyvideoplayer/utils/JumpUtils.java b/app/src/main/java/com/example/gsyvideoplayer/utils/JumpUtils.java index 8fe75b3..250523b 100644 --- a/app/src/main/java/com/example/gsyvideoplayer/utils/JumpUtils.java +++ b/app/src/main/java/com/example/gsyvideoplayer/utils/JumpUtils.java @@ -19,6 +19,7 @@ import com.example.gsyvideoplayer.DetailPlayer; import com.example.gsyvideoplayer.FragmentVideoActivity; import com.example.gsyvideoplayer.InputUrlDetailActivity; import com.example.gsyvideoplayer.ListADVideoActivity; +import com.example.gsyvideoplayer.ListADVideoActivity2; import com.example.gsyvideoplayer.ListMultiVideoActivity; import com.example.gsyvideoplayer.ListVideo2Activity; import com.example.gsyvideoplayer.ListVideoActivity; @@ -202,7 +203,8 @@ public class JumpUtils { * @param activity */ public static void goToADListVideoPlayer(Activity activity) { - Intent intent = new Intent(activity, ListADVideoActivity.class); + //Intent intent = new Intent(activity, ListADVideoActivity.class); + Intent intent = new Intent(activity, ListADVideoActivity2.class); ActivityOptionsCompat activityOptions = ActivityOptionsCompat.makeSceneTransitionAnimation(activity); ActivityCompat.startActivity(activity, intent, activityOptions.toBundle()); } diff --git a/app/src/main/java/com/example/gsyvideoplayer/video/RequestListADVideoPlayer.java b/app/src/main/java/com/example/gsyvideoplayer/video/RequestListADVideoPlayer.java new file mode 100644 index 0000000..1215f4d --- /dev/null +++ b/app/src/main/java/com/example/gsyvideoplayer/video/RequestListADVideoPlayer.java @@ -0,0 +1,52 @@ +package com.example.gsyvideoplayer.video; + +import android.content.Context; +import android.os.Handler; +import android.util.AttributeSet; + +import com.shuyu.gsyvideoplayer.GSYVideoADManager; + +import java.util.Random; + +public class RequestListADVideoPlayer extends ListADVideoPlayer { + + public RequestListADVideoPlayer(Context context, Boolean fullFlag) { + super(context, fullFlag); + } + + public RequestListADVideoPlayer(Context context) { + super(context); + } + + public RequestListADVideoPlayer(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public void startPlayLogic() { + //模拟请求 + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + int min = 1; + int max = 10; + Random random = new Random(); + int i = random.nextInt(max) % (max - min + 1) + min; + if (i % 3 == 0) { + mOriginUrl = "http://7xse1z.com1.z0.glb.clouddn.com/1491813192"; + mUrl = "http://7xse1z.com1.z0.glb.clouddn.com/1491813192"; + mTitle = "ggg2"; + } else if (i % 4 == 0) { + //模拟请求失败 + onError(0, 0); + } else { + mOriginUrl = "http://video.7k.cn/app_video/20171202/6c8cf3ea/v.m3u8.mp4"; + mUrl = "http://video.7k.cn/app_video/20171202/6c8cf3ea/v.m3u8.mp4"; + mTitle = "ffff1"; + } + mCache = false; + RequestListADVideoPlayer.super.startPlayLogic(); + } + }, 2000); + } +} diff --git a/app/src/main/res/layout/list_video_item_ad2.xml b/app/src/main/res/layout/list_video_item_ad2.xml new file mode 100644 index 0000000..866590b --- /dev/null +++ b/app/src/main/res/layout/list_video_item_ad2.xml @@ -0,0 +1,19 @@ + + + + + + + + + + \ No newline at end of file -- GitLab