diff --git a/README-ZH.md b/README-ZH.md index ef42b3dc4..cc4a2806f 100644 --- a/README-ZH.md +++ b/README-ZH.md @@ -2,12 +2,14 @@ --

- +

-真正实现Android的全屏功能,立志成为Android平台使用最广泛的视频播放控件 +真正实现Android的全屏功能,立志成为Android平台使用最广泛的视频播放控件 Q群:490442439 + +正在全力研究 头条视频 和 天天快报 那样的用android.media.MediaPlayer小窗播放的功能,重点是在切换SurfaceView的时候或removeView的时候视频能连续播放. ##主要特点 1. 全屏时启动新`Activity`实现播放器真正的全屏功能 @@ -22,28 +24,28 @@ ##效果 -**[jiecaovideoplayer-3.6.2-demo.apk](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.2-demo.apk)** +**[jiecaovideoplayer-3.6.3-demo.apk](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.3-demo.apk)** ![Demo Screenshot][1] ##使用 1.添加类库 ```gradle -compile 'fm.jiecao:jiecaovideoplayer:3.6.2' +compile 'fm.jiecao:jiecaovideoplayer:3.6.3' ``` 或直接下载 -* [jiecaovideoplayer-3.6.2.aar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.2.aar) -* [jiecaovideoplayer-3.6.2-javadoc.jar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.2-javadoc.jar) -* [jiecaovideoplayer-3.6.2-sources.jar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.2-sources.jar) +* [jiecaovideoplayer-3.6.3.aar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.3.aar) +* [jiecaovideoplayer-3.6.3-javadoc.jar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.3-javadoc.jar) +* [jiecaovideoplayer-3.6.3-sources.jar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.3-sources.jar) 2.添加布局 ```xml + android:lay3.6.3out_height="200dp"/> ``` 3.设置视频地址、缩略图地址、标题 diff --git a/README.md b/README.md index dbf1e39f8..c1310b1b2 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,16 @@ --

- +

-This project need translators, mother language is english, you can change everything edit readme, release note, formate variable and annotation. +* This project need translators, mother language is english, you can change everything edit readme, release note, formate variable and annotation. +* Now the research target is android.media.MediaPlayer setSurface by more surfaces the video is always continuous. + +Android truly full-screen capabilities, the Android platform to become the most widely used video playback controls. Q Group:490442439 -Android truly full-screen capabilities, the Android platform to become the most widely used video playback controls [中文文档](README-ZH.md) @@ -26,21 +28,21 @@ Android truly full-screen capabilities, the Android platform to become the most ## Effect -**[jiecaovideoplayer-3.6.2-demo.apk](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.2-demo.apk)** +**[jiecaovideoplayer-3.6.3-demo.apk](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.3-demo.apk)** ![Demo Screenshot][1] ## Usage 1.Import library ```gradle -compile 'fm.jiecao:jiecaovideoplayer:3.6.2' +compile 'fm.jiecao:jiecaovideoplayer:3.6.3' ``` Or download lib -* [jiecaovideoplayer-3.6.2.aar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.2.aar) -* [jiecaovideoplayer-3.6.2-javadoc.jar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.2-javadoc.jar) -* [jiecaovideoplayer-3.6.2-sources.jar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.2-sources.jar) +* [jiecaovideoplayer-3.6.3.aar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.3.aar) +* [jiecaovideoplayer-3.6.3-javadoc.jar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.3-javadoc.jar) +* [jiecaovideoplayer-3.6.3-sources.jar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.3-sources.jar) 2.Add JCVideoPlayer in your layout ```xml diff --git a/app/build.gradle b/app/build.gradle index f1b343a47..f10cb18e3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "fm.jiecao.jiecaovideoplayer" minSdkVersion 16 targetSdkVersion 23 - versionCode 30 - versionName "3.6.2" + versionCode 31 + versionName "3.6.3" } buildTypes { release { diff --git a/app/src/main/java/fm/jiecao/jiecaovideoplayer/LoadImageActivity.java b/app/src/main/java/fm/jiecao/jiecaovideoplayer/LoadImageActivity.java index 1aa40984a..bd7ed0431 100644 --- a/app/src/main/java/fm/jiecao/jiecaovideoplayer/LoadImageActivity.java +++ b/app/src/main/java/fm/jiecao/jiecaovideoplayer/LoadImageActivity.java @@ -74,7 +74,7 @@ protected void onCreate(Bundle savedInstanceState) { videoController5.setUp("http://2449.vod.myqcloud.com/2449_22ca37a6ea9011e5acaaf51d105342e3.f20.mp4", "嫂子洗澡没"); Uri uri = Uri.parse("http://cos.myqcloud.com/1000264/qcloud_video_attachment/842646334/vod_cover/cover1458036374.jpg"); - videoController5.ivThumb.setImageURI(uri); + videoController5.thumbImageView.setImageURI(uri); } public class BitmapCache implements com.android.volley.toolbox.ImageLoader.ImageCache { diff --git a/app/src/main/java/fm/jiecao/jiecaovideoplayer/View/JCVideoPlayerStandardFresco.java b/app/src/main/java/fm/jiecao/jiecaovideoplayer/View/JCVideoPlayerStandardFresco.java index 55c1b0a2b..d1b672640 100644 --- a/app/src/main/java/fm/jiecao/jiecaovideoplayer/View/JCVideoPlayerStandardFresco.java +++ b/app/src/main/java/fm/jiecao/jiecaovideoplayer/View/JCVideoPlayerStandardFresco.java @@ -1,13 +1,21 @@ package fm.jiecao.jiecaovideoplayer.View; import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; import android.content.Context; +import android.content.DialogInterface; +import android.text.TextUtils; import android.util.AttributeSet; +import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; +import android.view.Window; +import android.view.WindowManager; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; +import android.widget.Toast; import com.facebook.drawee.view.SimpleDraweeView; @@ -16,6 +24,7 @@ import fm.jiecao.jcvideoplayer_lib.JCBuriedPointStandard; import fm.jiecao.jcvideoplayer_lib.JCMediaManager; +import fm.jiecao.jcvideoplayer_lib.Utils; import fm.jiecao.jcvideoplayer_lib.JCVideoPlayer; import fm.jiecao.jiecaovideoplayer.R; @@ -25,14 +34,16 @@ */ public class JCVideoPlayerStandardFresco extends JCVideoPlayer { - protected ImageView ivBack; - protected ProgressBar pbBottom, pbLoading; - protected TextView tvTitle; - public SimpleDraweeView ivThumb; - protected ImageView ivCover; + public ImageView backButton; + public ProgressBar bottomProgressBar, loadingProgressBar; + public TextView titleTextView; + public SimpleDraweeView thumbImageView; + public ImageView coverImageView; - private static Timer mDismissControlViewTimer; - private static JCBuriedPointStandard jc_BuriedPointStandard; + protected static Timer DISSMISS_CONTROL_VIEW_TIMER; + protected DismissControlViewTimerTask mDismissControlViewTimerTask; + + protected static JCBuriedPointStandard JC_BURIED_POINT_STANDARD; public JCVideoPlayerStandardFresco(Context context) { super(context); @@ -45,27 +56,28 @@ public JCVideoPlayerStandardFresco(Context context, AttributeSet attrs) { @Override protected void init(Context context) { super.init(context); - pbBottom = (ProgressBar) findViewById(R.id.bottom_progressbar); - tvTitle = (TextView) findViewById(R.id.title); - ivBack = (ImageView) findViewById(R.id.back); - ivThumb = (SimpleDraweeView) findViewById(R.id.thumb); - ivCover = (ImageView) findViewById(R.id.cover); - pbLoading = (ProgressBar) findViewById(R.id.loading); + bottomProgressBar = (ProgressBar) findViewById(R.id.bottom_progressbar); + titleTextView = (TextView) findViewById(R.id.title); + backButton = (ImageView) findViewById(R.id.back); + thumbImageView = (SimpleDraweeView) findViewById(R.id.thumb); + coverImageView = (ImageView) findViewById(R.id.cover); + loadingProgressBar = (ProgressBar) findViewById(R.id.loading); - ivThumb.setOnClickListener(this); - ivBack.setOnClickListener(this); + thumbImageView.setOnClickListener(this); + backButton.setOnClickListener(this); } @Override public boolean setUp(String url, Object... objects) { + if (objects.length == 0) return false; if (super.setUp(url, objects)) { - tvTitle.setText(objects[0].toString()); + titleTextView.setText(objects[0].toString()); if (mIfCurrentIsFullscreen) { - fullscreenButton.setImageResource(R.drawable.jc_shrink); + fullscreenButton.setImageResource(fm.jiecao.jcvideoplayer_lib.R.drawable.jc_shrink); } else { - fullscreenButton.setImageResource(R.drawable.jc_enlarge); - ivBack.setVisibility(View.GONE); + fullscreenButton.setImageResource(fm.jiecao.jcvideoplayer_lib.R.drawable.jc_enlarge); + backButton.setVisibility(View.GONE); } return true; } @@ -83,35 +95,63 @@ protected void setStateAndUi(int state) { switch (mCurrentState) { case CURRENT_STATE_NORMAL: changeUiToNormal(); - cancelDismissControlViewTimer(); break; case CURRENT_STATE_PREPAREING: - changeUiToShowUiPrepareing(); + changeUiToPrepareingShow(); startDismissControlViewTimer(); break; case CURRENT_STATE_PLAYING: - changeUiToShowUiPlaying(); + changeUiToPlayingShow(); startDismissControlViewTimer(); break; case CURRENT_STATE_PAUSE: - changeUiToShowUiPause(); + changeUiToPauseShow(); cancelDismissControlViewTimer(); break; case CURRENT_STATE_ERROR: changeUiToError(); break; + case CURRENT_STATE_AUTO_COMPLETE: + changeUiToCompleteShow(); + cancelDismissControlViewTimer(); + bottomProgressBar.setProgress(100); + break; + case CURRENT_STATE_PLAYING_BUFFERING_START: + changeUiToPlayingBufferingShow(); + break; } } @Override public boolean onTouch(View v, MotionEvent event) { - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - cancelDismissControlViewTimer(); - break; - case MotionEvent.ACTION_UP: - startDismissControlViewTimer(); - break; + int id = v.getId(); + if (id == R.id.surface_container) { + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + break; + case MotionEvent.ACTION_MOVE: + break; + case MotionEvent.ACTION_UP: + startDismissControlViewTimer(); + if (mChangePosition) { + int duration = getDuration(); + int progress = mSeekTimePosition * 100 / (duration == 0 ? 1 : duration); + bottomProgressBar.setProgress(progress); + } + if (!mChangePosition && !mChangeVolume) { + onClickUiToggle(); + } + break; + } + } else if (id == R.id.progress) { + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + cancelDismissControlViewTimer(); + break; + case MotionEvent.ACTION_UP: + startDismissControlViewTimer(); + break; + } } return super.onTouch(v, event); } @@ -121,46 +161,87 @@ public void onClick(View v) { super.onClick(v); int i = v.getId(); if (i == R.id.thumb) { + if (TextUtils.isEmpty(mUrl)) { + Toast.makeText(getContext(), getResources().getString(fm.jiecao.jcvideoplayer_lib.R.string.no_url), Toast.LENGTH_SHORT).show(); + return; + } if (mCurrentState == CURRENT_STATE_NORMAL) { - if (jc_BuriedPointStandard != null) { - jc_BuriedPointStandard.onClickStartThumb(mUrl, mObjects); + if (!Utils.isWifiConnected(getContext()) && !WIFI_TIP_DIALOG_SHOWED) { + AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); + builder.setMessage(getResources().getString(fm.jiecao.jcvideoplayer_lib.R.string.tips_not_wifi)); + builder.setPositiveButton(getResources().getString(fm.jiecao.jcvideoplayer_lib.R.string.tips_not_wifi_confirm), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + startPlayLocic(); + WIFI_TIP_DIALOG_SHOWED = true; + } + }); + builder.setNegativeButton(getResources().getString(fm.jiecao.jcvideoplayer_lib.R.string.tips_not_wifi_cancel), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + return; } - prepareVideo(); - startDismissControlViewTimer(); + startPlayLocic(); + } else if (mCurrentState == CURRENT_STATE_AUTO_COMPLETE) { + onClickUiToggle(); } } else if (i == R.id.surface_container) { - if (jc_BuriedPointStandard != null && JCMediaManager.instance().listener == this) { + if (JC_BURIED_POINT_STANDARD != null && JCMediaManager.instance().listener == this) { if (mIfCurrentIsFullscreen) { - jc_BuriedPointStandard.onClickBlankFullscreen(mUrl, mObjects); + JC_BURIED_POINT_STANDARD.onClickBlankFullscreen(mUrl, mObjects); } else { - jc_BuriedPointStandard.onClickBlank(mUrl, mObjects); + JC_BURIED_POINT_STANDARD.onClickBlank(mUrl, mObjects); } } - onClickUiToggle(); startDismissControlViewTimer(); } else if (i == R.id.back) { backFullscreen(); } } + private void startPlayLocic() { + if (JC_BURIED_POINT_STANDARD != null) { + JC_BURIED_POINT_STANDARD.onClickStartThumb(mUrl, mObjects); + } + prepareVideo(); + startDismissControlViewTimer(); + } + private void onClickUiToggle() { if (mCurrentState == CURRENT_STATE_PREPAREING) { if (bottomContainer.getVisibility() == View.VISIBLE) { - changeUiToClearUiPrepareing(); + changeUiToPrepareingClear(); } else { - changeUiToShowUiPrepareing(); + changeUiToPrepareingShow(); } } else if (mCurrentState == CURRENT_STATE_PLAYING) { if (bottomContainer.getVisibility() == View.VISIBLE) { - changeUiToClearUiPlaying(); + changeUiToPlayingClear(); } else { - changeUiToShowUiPlaying(); + changeUiToPlayingShow(); } } else if (mCurrentState == CURRENT_STATE_PAUSE) { if (bottomContainer.getVisibility() == View.VISIBLE) { - changeUiToClearUiPause(); + changeUiToPauseClear(); } else { - changeUiToShowUiPause(); + changeUiToPauseShow(); + } + } else if (mCurrentState == CURRENT_STATE_AUTO_COMPLETE) { + if (bottomContainer.getVisibility() == View.VISIBLE) { + changeUiToCompleteClear(); + } else { + changeUiToCompleteShow(); + } + } else if (mCurrentState == CURRENT_STATE_PLAYING_BUFFERING_START) { + if (bottomContainer.getVisibility() == View.VISIBLE) { + changeUiToPlayingBufferingClear(); + } else { + changeUiToPlayingBufferingShow(); } } } @@ -168,15 +249,15 @@ private void onClickUiToggle() { @Override protected void setProgressAndTime(int progress, int secProgress, int currentTime, int totalTime) { super.setProgressAndTime(progress, secProgress, currentTime, totalTime); - if (progress != 0) pbBottom.setProgress(progress); - if (secProgress != 0) pbBottom.setSecondaryProgress(secProgress); + if (progress != 0) bottomProgressBar.setProgress(progress); + if (secProgress != 0) bottomProgressBar.setSecondaryProgress(secProgress); } @Override protected void resetProgressAndTime() { super.resetProgressAndTime(); - pbBottom.setProgress(0); - pbBottom.setSecondaryProgress(0); + bottomProgressBar.setProgress(0); + bottomProgressBar.setSecondaryProgress(0); } //Unified management Ui @@ -184,129 +265,264 @@ private void changeUiToNormal() { topContainer.setVisibility(View.VISIBLE); bottomContainer.setVisibility(View.INVISIBLE); startButton.setVisibility(View.VISIBLE); - pbLoading.setVisibility(View.INVISIBLE); - ivThumb.setVisibility(View.VISIBLE); - ivCover.setVisibility(View.VISIBLE); - pbBottom.setVisibility(View.INVISIBLE); + loadingProgressBar.setVisibility(View.INVISIBLE); + thumbImageView.setVisibility(View.VISIBLE); + coverImageView.setVisibility(View.VISIBLE); + bottomProgressBar.setVisibility(View.INVISIBLE); updateStartImage(); } - private void changeUiToShowUiPrepareing() { + private void changeUiToPrepareingShow() { topContainer.setVisibility(View.VISIBLE); bottomContainer.setVisibility(View.VISIBLE); startButton.setVisibility(View.INVISIBLE); - pbLoading.setVisibility(View.VISIBLE); - ivThumb.setVisibility(View.INVISIBLE); - ivCover.setVisibility(View.VISIBLE); - pbBottom.setVisibility(View.INVISIBLE); + loadingProgressBar.setVisibility(View.VISIBLE); + thumbImageView.setVisibility(View.INVISIBLE); + coverImageView.setVisibility(View.VISIBLE); + bottomProgressBar.setVisibility(View.INVISIBLE); } - private void changeUiToClearUiPrepareing() { -// changeUiToClearUi(); + private void changeUiToPrepareingClear() { topContainer.setVisibility(View.INVISIBLE); bottomContainer.setVisibility(View.INVISIBLE); startButton.setVisibility(View.INVISIBLE); - ivThumb.setVisibility(View.INVISIBLE); - pbBottom.setVisibility(View.INVISIBLE); -// loadingProgressBar.setVisibility(View.VISIBLE); - ivCover.setVisibility(View.VISIBLE); + thumbImageView.setVisibility(View.INVISIBLE); + bottomProgressBar.setVisibility(View.INVISIBLE); + coverImageView.setVisibility(View.VISIBLE); } - private void changeUiToShowUiPlaying() { + private void changeUiToPlayingShow() { topContainer.setVisibility(View.VISIBLE); bottomContainer.setVisibility(View.VISIBLE); startButton.setVisibility(View.VISIBLE); - pbLoading.setVisibility(View.INVISIBLE); - ivThumb.setVisibility(View.INVISIBLE); - ivCover.setVisibility(View.INVISIBLE); - pbBottom.setVisibility(View.INVISIBLE); + loadingProgressBar.setVisibility(View.INVISIBLE); + thumbImageView.setVisibility(View.INVISIBLE); + coverImageView.setVisibility(View.INVISIBLE); + bottomProgressBar.setVisibility(View.INVISIBLE); updateStartImage(); } - private void changeUiToClearUiPlaying() { - changeUiToClearUi(); - pbBottom.setVisibility(View.VISIBLE); + private void changeUiToPlayingClear() { + changeUiToClear(); + bottomProgressBar.setVisibility(View.VISIBLE); } - private void changeUiToShowUiPause() { + private void changeUiToPauseShow() { topContainer.setVisibility(View.VISIBLE); bottomContainer.setVisibility(View.VISIBLE); startButton.setVisibility(View.VISIBLE); - pbLoading.setVisibility(View.INVISIBLE); - ivThumb.setVisibility(View.INVISIBLE); - ivCover.setVisibility(View.INVISIBLE); - pbBottom.setVisibility(View.INVISIBLE); + loadingProgressBar.setVisibility(View.INVISIBLE); + thumbImageView.setVisibility(View.INVISIBLE); + coverImageView.setVisibility(View.INVISIBLE); + bottomProgressBar.setVisibility(View.INVISIBLE); updateStartImage(); } - private void changeUiToClearUiPause() { - changeUiToClearUi(); - pbBottom.setVisibility(View.VISIBLE); + private void changeUiToPauseClear() { + changeUiToClear(); + bottomProgressBar.setVisibility(View.VISIBLE); + } + + private void changeUiToPlayingBufferingShow() { + topContainer.setVisibility(View.VISIBLE); + bottomContainer.setVisibility(View.VISIBLE); + startButton.setVisibility(View.INVISIBLE); + loadingProgressBar.setVisibility(View.VISIBLE); + thumbImageView.setVisibility(View.INVISIBLE); + coverImageView.setVisibility(View.INVISIBLE); + bottomProgressBar.setVisibility(View.INVISIBLE); + } + + private void changeUiToPlayingBufferingClear() { + topContainer.setVisibility(View.INVISIBLE); + bottomContainer.setVisibility(View.INVISIBLE); + startButton.setVisibility(View.INVISIBLE); + loadingProgressBar.setVisibility(View.VISIBLE); + thumbImageView.setVisibility(View.INVISIBLE); + coverImageView.setVisibility(View.INVISIBLE); + bottomProgressBar.setVisibility(View.VISIBLE); + updateStartImage(); } - private void changeUiToClearUi() { + private void changeUiToClear() { topContainer.setVisibility(View.INVISIBLE); bottomContainer.setVisibility(View.INVISIBLE); startButton.setVisibility(View.INVISIBLE); - pbLoading.setVisibility(View.INVISIBLE); - ivThumb.setVisibility(View.INVISIBLE); - ivCover.setVisibility(View.INVISIBLE); - pbBottom.setVisibility(View.INVISIBLE); + loadingProgressBar.setVisibility(View.INVISIBLE); + thumbImageView.setVisibility(View.INVISIBLE); + coverImageView.setVisibility(View.INVISIBLE); + bottomProgressBar.setVisibility(View.INVISIBLE); + } + + private void changeUiToCompleteShow() { + topContainer.setVisibility(View.VISIBLE); + bottomContainer.setVisibility(View.VISIBLE); + startButton.setVisibility(View.VISIBLE); + loadingProgressBar.setVisibility(View.INVISIBLE); + thumbImageView.setVisibility(View.VISIBLE); + coverImageView.setVisibility(View.INVISIBLE); + bottomProgressBar.setVisibility(View.INVISIBLE); + updateStartImage(); + } + + private void changeUiToCompleteClear() { + topContainer.setVisibility(View.INVISIBLE); + bottomContainer.setVisibility(View.INVISIBLE); + startButton.setVisibility(View.VISIBLE); + loadingProgressBar.setVisibility(View.INVISIBLE); + thumbImageView.setVisibility(View.VISIBLE); + coverImageView.setVisibility(View.INVISIBLE); + bottomProgressBar.setVisibility(View.VISIBLE); + updateStartImage(); } private void changeUiToError() { topContainer.setVisibility(View.INVISIBLE); bottomContainer.setVisibility(View.INVISIBLE); startButton.setVisibility(View.VISIBLE); - pbLoading.setVisibility(View.INVISIBLE); - ivThumb.setVisibility(View.INVISIBLE); - ivCover.setVisibility(View.VISIBLE); - pbBottom.setVisibility(View.INVISIBLE); + loadingProgressBar.setVisibility(View.INVISIBLE); + thumbImageView.setVisibility(View.INVISIBLE); + coverImageView.setVisibility(View.VISIBLE); + bottomProgressBar.setVisibility(View.INVISIBLE); updateStartImage(); } private void updateStartImage() { if (mCurrentState == CURRENT_STATE_PLAYING) { - startButton.setImageResource(R.drawable.jc_click_pause_selector); + startButton.setImageResource(fm.jiecao.jcvideoplayer_lib.R.drawable.jc_click_pause_selector); } else if (mCurrentState == CURRENT_STATE_ERROR) { - startButton.setImageResource(R.drawable.jc_click_error_selector); + startButton.setImageResource(fm.jiecao.jcvideoplayer_lib.R.drawable.jc_click_error_selector); + } else { + startButton.setImageResource(fm.jiecao.jcvideoplayer_lib.R.drawable.jc_click_play_selector); + } + } + + protected Dialog mProgressDialog; + protected ProgressBar mDialogProgressBar; + protected TextView mDialogSeekTime; + protected TextView mDialogTotalTime; + protected ImageView mDialogIcon; + + @Override + protected void showProgressDialog(float deltaX, String seekTime, int seekTimePosition, String totalTime, int totalTimeDuration) { + super.showProgressDialog(deltaX, seekTime, seekTimePosition, totalTime, totalTimeDuration); + if (mProgressDialog == null) { + View localView = LayoutInflater.from(getContext()).inflate(fm.jiecao.jcvideoplayer_lib.R.layout.jc_progress_dialog, null); + mDialogProgressBar = ((ProgressBar) localView.findViewById(R.id.duration_progressbar)); + mDialogSeekTime = ((TextView) localView.findViewById(R.id.tv_current)); + mDialogTotalTime = ((TextView) localView.findViewById(R.id.tv_duration)); + mDialogIcon = ((ImageView) localView.findViewById(R.id.duration_image_tip)); + mProgressDialog = new Dialog(getContext(), fm.jiecao.jcvideoplayer_lib.R.style.jc_style_dialog_progress); + mProgressDialog.setContentView(localView); + mProgressDialog.getWindow().addFlags(Window.FEATURE_ACTION_BAR); + mProgressDialog.getWindow().addFlags(32); + mProgressDialog.getWindow().addFlags(16); + mProgressDialog.getWindow().setLayout(-2, -2); + WindowManager.LayoutParams localLayoutParams = mProgressDialog.getWindow().getAttributes(); + localLayoutParams.gravity = 49; + localLayoutParams.y = getResources().getDimensionPixelOffset(fm.jiecao.jcvideoplayer_lib.R.dimen.jc_progress_dialog_margin_top); + mProgressDialog.getWindow().setAttributes(localLayoutParams); + } + if (!mProgressDialog.isShowing()) { + mProgressDialog.show(); + } + + mDialogSeekTime.setText(seekTime); + mDialogTotalTime.setText(" / " + totalTime); + mDialogProgressBar.setProgress(seekTimePosition * 100 / totalTimeDuration); + if (deltaX > 0) { + mDialogIcon.setBackgroundResource(fm.jiecao.jcvideoplayer_lib.R.drawable.jc_forward_icon); } else { - startButton.setImageResource(R.drawable.jc_click_play_selector); + mDialogIcon.setBackgroundResource(fm.jiecao.jcvideoplayer_lib.R.drawable.jc_backward_icon); + } + + } + + @Override + protected void dismissProgressDialog() { + super.dismissProgressDialog(); + if (mProgressDialog != null) { + mProgressDialog.dismiss(); + } + } + + + protected Dialog mVolumeDialog; + protected ProgressBar mDialogVolumeProgressBar; + + @Override + protected void showVolumDialog(float deltaY, int volumePercent) { + super.showVolumDialog(deltaY, volumePercent); + if (mVolumeDialog == null) { + View localView = LayoutInflater.from(getContext()).inflate(fm.jiecao.jcvideoplayer_lib.R.layout.jc_volume_dialog, null); + mDialogVolumeProgressBar = ((ProgressBar) localView.findViewById(R.id.volume_progressbar)); + mVolumeDialog = new Dialog(getContext(), fm.jiecao.jcvideoplayer_lib.R.style.jc_style_dialog_progress); + mVolumeDialog.setContentView(localView); + mVolumeDialog.getWindow().addFlags(8); + mVolumeDialog.getWindow().addFlags(32); + mVolumeDialog.getWindow().addFlags(16); + mVolumeDialog.getWindow().setLayout(-2, -2); + WindowManager.LayoutParams localLayoutParams = mVolumeDialog.getWindow().getAttributes(); + localLayoutParams.gravity = 19; + localLayoutParams.x = getContext().getResources().getDimensionPixelOffset(fm.jiecao.jcvideoplayer_lib.R.dimen.jc_volume_dialog_margin_left); + mVolumeDialog.getWindow().setAttributes(localLayoutParams); + } + if (!mVolumeDialog.isShowing()) { + mVolumeDialog.show(); + } + + mDialogVolumeProgressBar.setProgress(volumePercent); + } + + @Override + protected void dismissVolumDialog() { + super.dismissVolumDialog(); + if (mVolumeDialog != null) { + mVolumeDialog.dismiss(); } } private void startDismissControlViewTimer() { cancelDismissControlViewTimer(); - mDismissControlViewTimer = new Timer(); - mDismissControlViewTimer.schedule(new TimerTask() { - @Override - public void run() { + DISSMISS_CONTROL_VIEW_TIMER = new Timer(); + mDismissControlViewTimerTask = new DismissControlViewTimerTask(); + DISSMISS_CONTROL_VIEW_TIMER.schedule(mDismissControlViewTimerTask, 2500); + } + + private void cancelDismissControlViewTimer() { + if (DISSMISS_CONTROL_VIEW_TIMER != null) { + DISSMISS_CONTROL_VIEW_TIMER.cancel(); + } + if (mDismissControlViewTimerTask != null) { + mDismissControlViewTimerTask.cancel(); + } + + } + + protected class DismissControlViewTimerTask extends TimerTask { + + @Override + public void run() { + if (mCurrentState != CURRENT_STATE_NORMAL + && mCurrentState != CURRENT_STATE_ERROR + && mCurrentState != CURRENT_STATE_AUTO_COMPLETE) { if (getContext() != null && getContext() instanceof Activity) { ((Activity) getContext()).runOnUiThread(new Runnable() { @Override public void run() { - if (mCurrentState != CURRENT_STATE_NORMAL - && mCurrentState != CURRENT_STATE_ERROR) { - bottomContainer.setVisibility(View.INVISIBLE); - topContainer.setVisibility(View.INVISIBLE); - pbBottom.setVisibility(View.VISIBLE); - startButton.setVisibility(View.INVISIBLE); - } + bottomContainer.setVisibility(View.INVISIBLE); + topContainer.setVisibility(View.INVISIBLE); + bottomProgressBar.setVisibility(View.VISIBLE); + startButton.setVisibility(View.INVISIBLE); } }); } } - }, 2500); - } - - private void cancelDismissControlViewTimer() { - if (mDismissControlViewTimer != null) { - mDismissControlViewTimer.cancel(); } } public static void setJcBuriedPointStandard(JCBuriedPointStandard jcBuriedPointStandard) { - jc_BuriedPointStandard = jcBuriedPointStandard; + JC_BURIED_POINT_STANDARD = jcBuriedPointStandard; JCVideoPlayer.setJcBuriedPoint(jcBuriedPointStandard); } diff --git a/downloads/jiecaovideoplayer-3.6.2-javadoc.jar b/downloads/jiecaovideoplayer-3.6.2-javadoc.jar deleted file mode 100644 index 9e6dfb7ea..000000000 Binary files a/downloads/jiecaovideoplayer-3.6.2-javadoc.jar and /dev/null differ diff --git a/downloads/jiecaovideoplayer-3.6.2-sources.jar b/downloads/jiecaovideoplayer-3.6.2-sources.jar deleted file mode 100644 index 767f3c248..000000000 Binary files a/downloads/jiecaovideoplayer-3.6.2-sources.jar and /dev/null differ diff --git a/downloads/jiecaovideoplayer-3.6.2.aar b/downloads/jiecaovideoplayer-3.6.2.aar deleted file mode 100644 index e8b5ee390..000000000 Binary files a/downloads/jiecaovideoplayer-3.6.2.aar and /dev/null differ diff --git a/downloads/jiecaovideoplayer-3.6.2-demo.apk b/downloads/jiecaovideoplayer-3.6.3-demo.apk similarity index 72% rename from downloads/jiecaovideoplayer-3.6.2-demo.apk rename to downloads/jiecaovideoplayer-3.6.3-demo.apk index 8f610f74d..be50b1431 100644 Binary files a/downloads/jiecaovideoplayer-3.6.2-demo.apk and b/downloads/jiecaovideoplayer-3.6.3-demo.apk differ diff --git a/downloads/jiecaovideoplayer-3.6.3-javadoc.jar b/downloads/jiecaovideoplayer-3.6.3-javadoc.jar new file mode 100644 index 000000000..03b4ca393 Binary files /dev/null and b/downloads/jiecaovideoplayer-3.6.3-javadoc.jar differ diff --git a/downloads/jiecaovideoplayer-3.6.3-sources.jar b/downloads/jiecaovideoplayer-3.6.3-sources.jar new file mode 100644 index 000000000..a5ff693d4 Binary files /dev/null and b/downloads/jiecaovideoplayer-3.6.3-sources.jar differ diff --git a/downloads/jiecaovideoplayer-3.6.3.aar b/downloads/jiecaovideoplayer-3.6.3.aar new file mode 100644 index 000000000..06f25cba1 Binary files /dev/null and b/downloads/jiecaovideoplayer-3.6.3.aar differ diff --git a/gradle/maven_push.gradle b/gradle/maven_push.gradle index 416be3110..553e9e5e9 100644 --- a/gradle/maven_push.gradle +++ b/gradle/maven_push.gradle @@ -22,7 +22,7 @@ signing { group = "fm.jiecao" archivesBaseName = "jiecaovideoplayer" -version = "3.6.2" +version = "3.6.3" uploadArchives { repositories { diff --git a/jcvideoplayer-lib/build.gradle b/jcvideoplayer-lib/build.gradle index 3bab724b0..9e17980e5 100644 --- a/jcvideoplayer-lib/build.gradle +++ b/jcvideoplayer-lib/build.gradle @@ -7,8 +7,8 @@ android { defaultConfig { minSdkVersion 14 targetSdkVersion 23 - versionCode 30 - versionName "3.6.2" + versionCode 31 + versionName "3.6.3" } buildTypes { release { diff --git a/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayer.java b/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayer.java index 7c64da08a..253b935ca 100644 --- a/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayer.java +++ b/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayer.java @@ -7,6 +7,7 @@ import android.graphics.SurfaceTexture; import android.media.AudioManager; import android.media.MediaPlayer; +import android.os.Handler; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; @@ -90,6 +91,8 @@ public abstract class JCVideoPlayer extends FrameLayout implements View.OnClickL public static boolean WIFI_TIP_DIALOG_SHOWED = false; + protected Handler mHandler = new Handler(); + public JCVideoPlayer(Context context) { super(context); init(context); @@ -196,7 +199,7 @@ public void onClick(View v) { return; } if (mCurrentState == CURRENT_STATE_NORMAL || mCurrentState == CURRENT_STATE_ERROR) { - if (!JCUtils.isWifiConnected(getContext()) && !WIFI_TIP_DIALOG_SHOWED) { + if (!Utils.isWifiConnected(getContext()) && !WIFI_TIP_DIALOG_SHOWED) { AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); builder.setMessage(getResources().getString(R.string.tips_not_wifi)); builder.setPositiveButton(getResources().getString(R.string.tips_not_wifi_confirm), new DialogInterface.OnClickListener() { @@ -398,8 +401,8 @@ public boolean onTouch(View v, MotionEvent event) { mSeekTimePosition = (int) (mDownPosition + deltaX * totalTimeDuration / mScreenWidth); if (mSeekTimePosition > totalTimeDuration) mSeekTimePosition = totalTimeDuration; - String seekTime = JCUtils.stringForTime(mSeekTimePosition); - String totalTime = JCUtils.stringForTime(totalTimeDuration); + String seekTime = Utils.stringForTime(mSeekTimePosition); + String totalTime = Utils.stringForTime(totalTimeDuration); showProgressDialog(deltaX, seekTime, mSeekTimePosition, totalTime, totalTimeDuration); } @@ -561,6 +564,7 @@ public void onCompletion() { @Override public void onBufferingUpdate(int percent) { if (mCurrentState != CURRENT_STATE_NORMAL && mCurrentState != CURRENT_STATE_PREPAREING) { + Log.v(TAG, "onBufferingUpdate " + percent + " [" + this.hashCode() + "] "); setTextAndProgress(percent); } } @@ -631,14 +635,15 @@ protected class ProgressTimerTask extends TimerTask { @Override public void run() { if (mCurrentState == CURRENT_STATE_PLAYING || mCurrentState == CURRENT_STATE_PAUSE) { - if (getContext() != null && getContext() instanceof Activity) { - ((Activity) getContext()).runOnUiThread(new Runnable() { - @Override - public void run() { - setTextAndProgress(0); - } - }); - } + int position = getCurrentPositionWhenPlaying(); + int duration = getDuration(); + Log.v(TAG, "onProgressUpdate " + position + "/" + duration + " [" + this.hashCode() + "] "); + mHandler.post(new Runnable() { + @Override + public void run() { + setTextAndProgress(0); + } + }); } } } @@ -680,15 +685,15 @@ protected void setProgressAndTime(int progress, int secProgress, int currentTime if (progress != 0) progressBar.setProgress(progress); } if (secProgress != 0) progressBar.setSecondaryProgress(secProgress); - currentTimeTextView.setText(JCUtils.stringForTime(currentTime)); - totalTimeTextView.setText(JCUtils.stringForTime(totalTime)); + currentTimeTextView.setText(Utils.stringForTime(currentTime)); + totalTimeTextView.setText(Utils.stringForTime(totalTime)); } protected void resetProgressAndTime() { progressBar.setProgress(0); progressBar.setSecondaryProgress(0); - currentTimeTextView.setText(JCUtils.stringForTime(0)); - totalTimeTextView.setText(JCUtils.stringForTime(0)); + currentTimeTextView.setText(Utils.stringForTime(0)); + totalTimeTextView.setText(Utils.stringForTime(0)); } protected void quitFullScreenGoToNormal() { diff --git a/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayerStandard.java b/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayerStandard.java index ea9658f1d..af1ccdeb3 100644 --- a/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayerStandard.java +++ b/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayerStandard.java @@ -158,7 +158,7 @@ public void onClick(View v) { return; } if (mCurrentState == CURRENT_STATE_NORMAL) { - if (!JCUtils.isWifiConnected(getContext()) && !WIFI_TIP_DIALOG_SHOWED) { + if (!Utils.isWifiConnected(getContext()) && !WIFI_TIP_DIALOG_SHOWED) { AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); builder.setMessage(getResources().getString(R.string.tips_not_wifi)); builder.setPositiveButton(getResources().getString(R.string.tips_not_wifi_confirm), new DialogInterface.OnClickListener() { @@ -518,10 +518,4 @@ public static void setJcBuriedPointStandard(JCBuriedPointStandard jcBuriedPointS JCVideoPlayer.setJcBuriedPoint(jcBuriedPointStandard); } -// @Override -// public void onCompletion() { -// super.onCompletion(); -// cancelDismissControlViewTimer(); -// } - } diff --git a/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCUtils.java b/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/Utils.java similarity index 98% rename from jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCUtils.java rename to jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/Utils.java index b3b1e2f1f..94c8bdbea 100644 --- a/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCUtils.java +++ b/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/Utils.java @@ -11,7 +11,7 @@ * Created by Nathen * On 2016/02/21 12:25 */ -class JCUtils { +public class Utils { public static String stringForTime(int timeMs) { if (timeMs <= 0 || timeMs >= 24 * 60 * 60 * 1000) {