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) {