From a844b035031b60f41487e897b6ef62aa8d35d49c Mon Sep 17 00:00:00 2001 From: liujing Date: Tue, 2 Nov 2021 18:13:09 +0800 Subject: [PATCH] =?UTF-8?q?[add]=20=E8=A7=86=E9=A2=91=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E5=99=A8UI=20=20=E5=9C=86=E8=A7=92=E6=9C=AA=E8=AE=BE=E7=BD=AE,?= =?UTF-8?q?=E9=83=A8=E5=88=86=E6=9A=82=E5=81=9C.=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E6=9C=AA=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/gradle.xml | 3 +- .../hmi/ui/notice/NoticeTrafficDialog.java | 187 +++++++++++++++++- .../core/function/hmi/ui/utils/FileUtils.java | 29 +++ .../src/main/res/drawable/video_pause.png | Bin 0 -> 6164 bytes .../src/main/res/drawable/video_play.png | Bin 0 -> 7096 bytes .../layout/notice_dialog_traffic_police.xml | 23 +++ .../src/main/AndroidManifest.xml | 2 +- 7 files changed, 240 insertions(+), 4 deletions(-) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/utils/FileUtils.java create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable/video_pause.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable/video_play.png diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 22d04a33fd..ad82747b49 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -4,7 +4,7 @@ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeTrafficDialog.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeTrafficDialog.java index 4fe0f6e1aa..91a1e701c0 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeTrafficDialog.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/notice/NoticeTrafficDialog.java @@ -1,6 +1,9 @@ package com.mogo.eagle.core.function.hmi.ui.notice; import android.content.Context; +import android.graphics.Bitmap; +import android.util.Log; +import android.view.View; import android.widget.ImageView; import androidx.annotation.NonNull; @@ -12,7 +15,11 @@ import com.mogo.eagle.core.function.hmi.R; import com.mogo.eagle.core.widget.media.video.SimpleVideoPlayer; import com.mogo.module.common.dialog.BaseFloatDialog; import com.mogo.module.common.view.SpacesItemDecoration; +import com.mogo.utils.BitmapHelper; import com.mogo.utils.ResourcesHelper; +import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder; +import com.shuyu.gsyvideoplayer.listener.VideoAllCallBack; +import com.shuyu.gsyvideoplayer.video.base.GSYVideoView; import java.util.List; @@ -22,16 +29,23 @@ import java.util.List; * @since: 10/26/21 */ public class NoticeTrafficDialog extends BaseFloatDialog { + private String TAG = "AINotice"; private Context mContext; private RecyclerView mRecyclerView; private SimpleVideoPlayer mVideoPlayer; private NoticeTrafficStylePushData mPushData; private ImageView close; + private ImageView playImageView; + private ImageView thumbnailImage; + private GSYVideoOptionBuilder gsyVideoOptionBuilder = new GSYVideoOptionBuilder(); + public NoticeTrafficDialog(@NonNull Context context, NoticeTrafficStylePushData pushData) { super(context); mContext = context; mPushData = pushData; + mPushData.setPoiImgUrl("https://vd2.bdstatic.com/mda-mk1347dzxdmcre0y/sc/cae_h264/1635819498112313003/mda-mk1347dzxdmcre0y.mp4?v_from_s=hkapp-haokan-tucheng&auth_key=1635837585-0-0-5295f6658c7711ba7b4d3ef478a7fbaa&bcevod_channel=searchbox_feed&pd=1&pt=3&abtest="); + mPushData.setIsVideo(true); initView(); } @@ -42,6 +56,8 @@ public class NoticeTrafficDialog extends BaseFloatDialog { public void initView() { setContentView(R.layout.notice_dialog_traffic_police); mVideoPlayer = findViewById(R.id.video_player); + thumbnailImage = findViewById(R.id.thumbnail_image); + playImageView = this.findViewById(R.id.window_video_play); close = findViewById(R.id.notice_traffic_dialog_close); close.setOnClickListener(v -> { dismiss(); @@ -61,18 +77,185 @@ public class NoticeTrafficDialog extends BaseFloatDialog { } NoticeTrafficAdapter adapter = new NoticeTrafficAdapter(mContext); mRecyclerView.setAdapter(adapter); - startLive(); + + mVideoPlayer.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mVideoPlayer.getCurrentState() == GSYVideoView.CURRENT_STATE_PAUSE) {/*播放中*/ + resume(); + } else { + pause(); + } + } + }); +// startLive(); } + /** + * 暂停 + */ + private void pause() { + playImageView.setVisibility(View.VISIBLE); + thumbnailImage.setVisibility(View.GONE); + playImageView.setOnClickListener(v -> { + mVideoPlayer.onVideoResume(); + }); + thumbnailImage.setOnClickListener(v -> { + mVideoPlayer.onVideoResume(); + }); + } + + /** + * 继续 + */ + private void resume() { + playImageView.setImageResource(R.drawable.video_pause); + playImageView.setVisibility(View.GONE); + thumbnailImage.setVisibility(View.GONE); + } + + /** + * 播放结束后 + */ + private void complete(Bitmap firstbitmap, String path) { + thumbnailImage.setVisibility(View.VISIBLE); + thumbnailImage.setImageBitmap(firstbitmap); + playImageView.setImageResource(R.drawable.video_play); + playImageView.setVisibility(View.VISIBLE); + playImageView.setOnClickListener(v -> { + startLive(); + }); + thumbnailImage.setOnClickListener(v -> { + startLive(); + }); + } + + /** * 视频播放 */ private void startLive() { if (mPushData != null && mPushData.getIsVideo() == true) { - + try { + Log.d(TAG, "交警事故开始播放视频startLive"); + String videoUrl = mPushData.getPoiImgUrl(); + gsyVideoOptionBuilder.setUrl(videoUrl).setCacheWithPlay(false).setPlayTag("NoticeTrafficDialog") + .build(mVideoPlayer); + mVideoPlayer.getStartButton().performClick(); + thumbnailImage.setVisibility(View.GONE); + playImageView.setVisibility(View.GONE); + startVideoCallBack(videoUrl); + } catch (Exception e) { + e.printStackTrace(); + } } } + private void startVideoCallBack(String path) { + new Thread(new Runnable() { + @Override + public void run() { + Bitmap firstBitmap = BitmapHelper.getVideoThumbnail(path);/*获取第一帧图*/ + mVideoPlayer.setVideoAllCallBack(new VideoAllCallBack() { + @Override + public void onAutoComplete(String url, Object... objects) { + complete(firstBitmap, path); + } + + @Override + public void onClickResume(String url, Object... objects) { + thumbnailImage.setVisibility(View.GONE); + playImageView.setVisibility(View.GONE); + } + + @Override + public void onClickStop(String url, Object... objects) { + Log.d(TAG, "onClickStop"); + } + + @Override + public void onStartPrepared(String url, Object... objects) { + Log.d(TAG, "onStartPrepared"); + } + + @Override + public void onPrepared(String url, Object... objects) { + } + + @Override + public void onClickStartIcon(String url, Object... objects) { + } + + @Override + public void onClickStartError(String url, Object... objects) { + } + + @Override + public void onClickStopFullscreen(String url, Object... objects) { + } + + @Override + public void onClickResumeFullscreen(String url, Object... objects) { + } + + @Override + public void onClickSeekbar(String url, Object... objects) { + } + + @Override + public void onClickSeekbarFullscreen(String url, Object... objects) { + } + + @Override + public void onEnterFullscreen(String url, Object... objects) { + } + + @Override + public void onQuitFullscreen(String url, Object... objects) { + } + + @Override + public void onQuitSmallWidget(String url, Object... objects) { + } + + @Override + public void onEnterSmallWidget(String url, Object... objects) { + } + + @Override + public void onTouchScreenSeekVolume(String url, Object... objects) { + } + + @Override + public void onTouchScreenSeekPosition(String url, Object... objects) { + } + + @Override + public void onTouchScreenSeekLight(String url, Object... objects) { + } + + @Override + public void onPlayError(String url, Object... objects) { + } + + @Override + public void onClickStartThumb(String url, Object... objects) { + } + + @Override + public void onClickBlank(String url, Object... objects) { + } + + @Override + public void onClickBlankFullscreen(String url, Object... objects) { + Log.d(TAG, "onClickBlankFullscreen"); + + } + }); + } + }).start(); + } + public void cancel() { } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/utils/FileUtils.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/utils/FileUtils.java new file mode 100644 index 0000000000..e558fa7a58 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/utils/FileUtils.java @@ -0,0 +1,29 @@ +package com.mogo.eagle.core.function.hmi.ui.utils; + +import java.util.regex.Pattern; + +/** + * @author Jing + * @description 文件工具类 + * @since: 11/2/21 + */ +public class FileUtils { + + /** + * @param path 文件链接 + * @return 视频文件 + */ + boolean isVideo(String path) { + String reg = "(mp4|flv|avi|rm|rmvb|wmv|mov)"; + Pattern p = Pattern.compile(reg); + boolean boo = p.matcher("url").find(); + return boo; + } + + boolean isImage(String path) { + String reg = "(jpg|png|jpeg|gif|bmp)"; + Pattern p = Pattern.compile(reg); + boolean boo = p.matcher("url").find(); + return boo; + } +} diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/video_pause.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/video_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..2bc83b4e41ec612d163b4391e0cb25750b77ba8b GIT binary patch literal 6164 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 F{sV=E);|CM literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/video_play.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/video_play.png new file mode 100644 index 0000000000000000000000000000000000000000..4c733621b615f90a4e67a98d998d88cf1c5e72b6 GIT binary patch literal 7096 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 S5Bu-0nX;m~LZuum + + + + - +