仿今日头条播放——依赖饺子播放器
2018-12-18 本文已影响2人
吃泥巴的猫
先附上饺子播放器github地址
JiaoZiVideoPlayer
如效果图,主要修改为在无wifi网络状态下的提示样式,也就是说需要重写UI,此处参考饺子播放器的JzvdStd重写了UI,UI布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorBlack"
android:descendantFocusability="blocksDescendants">
<!-- 播放器 -->
<FrameLayout
android:id="@+id/surface_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
<!-- 缩略图 -->
<ImageView
android:id="@+id/thumb"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:background="#F6F6F6"
android:scaleType="fitCenter" />
<!-- 标题栏 -->
<RelativeLayout
android:id="@+id/layout_top"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:background="@drawable/jz_title_bg"
android:paddingLeft="10dp"
android:paddingStart="10dp"
android:visibility="gone">
<ImageView
android:id="@+id/back"
android:layout_width="26dp"
android:layout_height="26dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginTop="12dp"
android:padding="3dp"
android:scaleType="centerInside"
android:src="@drawable/jz_click_back_selector" />
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginEnd="12dp"
android:layout_marginRight="12dp"
android:layout_toEndOf="@id/back"
android:layout_toLeftOf="@id/battery_time_layout"
android:layout_toRightOf="@id/back"
android:ellipsize="end"
android:maxLines="2"
android:textColor="#ffffff"
android:textSize="18sp" />
<LinearLayout
android:id="@+id/battery_time_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginEnd="14dp"
android:layout_marginRight="14dp"
android:gravity="center_vertical"
android:orientation="vertical"
android:visibility="invisible">
<ImageView
android:id="@+id/battery_level"
android:layout_width="23dp"
android:layout_height="10dp"
android:layout_gravity="center_horizontal"
android:background="@drawable/jz_battery_level_10" />
<TextView
android:id="@+id/video_current_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:gravity="center_vertical"
android:maxLines="1"
android:textColor="#ffffffff"
android:textSize="12.0sp" />
</LinearLayout>
</RelativeLayout>
<!-- 全屏退出 -->
<ImageView
android:id="@+id/back_tiny"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginLeft="6dp"
android:layout_marginTop="6dp"
android:background="@drawable/jz_click_back_tiny_selector"
android:visibility="gone" />
<!-- 加载菊花 -->
<ProgressBar
android:id="@+id/loading"
android:layout_width="@dimen/jz_start_button_w_h_normal"
android:layout_height="@dimen/jz_start_button_w_h_normal"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:indeterminateDrawable="@drawable/jz_loading"
android:visibility="invisible" />
<!-- 居中播放按钮 -->
<LinearLayout
android:id="@+id/start_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_gravity="center_vertical">
<ImageView
android:id="@+id/start"
android:layout_width="@dimen/jz_start_button_w_h_normal"
android:layout_height="@dimen/jz_start_button_w_h_normal"
android:src="@drawable/video" />
</LinearLayout>
<!-- 再次播放文字提示 -->
<TextView
android:id="@+id/replay_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/start_layout"
android:layout_centerHorizontal="true"
android:layout_marginTop="6dp"
android:text="@string/replay"
android:textColor="#ffffff"
android:textSize="12sp"
android:visibility="invisible" />
<!-- 中间提示框 -->
<RelativeLayout
android:id="@+id/tip_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#aa333333"
android:visibility="invisible">
<!-- 加载失败,重试 -->
<LinearLayout
android:id="@+id/retry_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:gravity="center_horizontal"
android:orientation="vertical"
android:visibility="invisible">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/common_video_erro"
android:textColor="@android:color/white"
android:textSize="14sp" />
<TextView
android:id="@+id/retry_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:background="@drawable/video_btn_bg"
android:paddingBottom="4dp"
android:paddingLeft="9dp"
android:paddingRight="9dp"
android:paddingTop="4dp"
android:text="@string/common_click_try"
android:textColor="@android:color/white"
android:textSize="14sp" />
</LinearLayout>
<!-- 流量状态,继续播放-->
<LinearLayout
android:id="@+id/continue_play_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:gravity="center_horizontal"
android:orientation="vertical"
android:visibility="invisible">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/common_no_wifi"
android:textColor="@android:color/white"
android:textSize="16sp" />
<TextView
android:id="@+id/continue_play_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:background="@drawable/video_btn_bg"
android:paddingBottom="4dp"
android:paddingLeft="9dp"
android:paddingRight="9dp"
android:paddingTop="4dp"
android:text="@string/common_continue_play"
android:textColor="@android:color/white"
android:textSize="14sp" />
</LinearLayout>
</RelativeLayout>
<!-- 底边栏 -->
<LinearLayout
android:id="@+id/layout_bottom"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:background="#4B333333"
android:gravity="center_vertical"
android:orientation="horizontal"
android:visibility="invisible">
<TextView
android:id="@+id/current"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="14dp"
android:text="00:00"
android:textColor="#ffffff"
android:textSize="12sp" />
<SeekBar
android:id="@+id/bottom_seek_progress"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1.0"
android:background="@null"
android:max="100"
android:maxHeight="1dp"
android:minHeight="1dp"
android:paddingBottom="8dp"
android:paddingLeft="12dp"
android:paddingRight="12dp"
android:paddingTop="8dp"
android:progressDrawable="@drawable/jz_bottom_seek_progress"
android:thumb="@drawable/video_bottom_seek_bar" />
<TextView
android:id="@+id/total"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="00:00"
android:textColor="#ffffff"
android:textSize="12sp" />
<TextView
android:id="@+id/clarity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:paddingLeft="20dp"
android:text="clarity"
android:textAlignment="center"
android:textColor="#ffffff" />
<ImageView
android:id="@+id/fullscreen"
android:layout_width="45dp"
android:layout_height="fill_parent"
android:paddingLeft="14dp"
android:paddingRight="14dp"
android:scaleType="centerInside"
android:src="@drawable/common_full_screen" />
</LinearLayout>
<ProgressBar
android:id="@+id/bottom_progress"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="1.5dp"
android:layout_alignParentBottom="true"
android:max="100"
android:progressDrawable="@drawable/jz_bottom_progress" />
</RelativeLayout>
中间提示框部分为加载错误提示,以及流量状态下是否继续播放的提示
一些资源文件懒得上传了。。。就是些图片或者shape
播放器类,需要重写Jzvd,重写方法可参考JzvdStd,此处基本照搬JzvdStd,只是修改了onClick的一部分方法,和修改了showWifiDialog()方法
public class VideoPlayerWidget extends Jzvd {
protected static Timer DISMISS_CONTROL_VIEW_TIMER;
//返回
public ImageView backButton;
//底部进度条,加载菊花
public ProgressBar bottomProgressBar, loadingProgressBar;
//视频标题
public TextView titleTextView;
//缩略图
public ImageView thumbImageView;
//全屏退出
public ImageView tinyBackImageView;
//电量显示
public LinearLayout batteryTimeLayout;
public ImageView batteryLevel;
//系统时间
public TextView videoCurrentTime;
//播放完成再次播放
public TextView replayTextView;
//清晰度
public TextView clarity;
public PopupWindow clarityPopWindow;
//提示蒙图层
public RelativeLayout tipLayout;
//加载失败,点击重试
public LinearLayout mRetryLayout;
public TextView mRetryBtn;
//流量状态,提示继续
public LinearLayout mContinuePlayLayout;
public TextView mContinuePlayBtn;
protected DismissControlViewTimerTask mDismissControlViewTimerTask;
protected Dialog mProgressDialog;
protected ProgressBar mDialogProgressBar;
protected TextView mDialogSeekTime;
protected TextView mDialogTotalTime;
protected ImageView mDialogIcon;
protected Dialog mVolumeDialog;
protected ProgressBar mDialogVolumeProgressBar;
protected TextView mDialogVolumeTextView;
protected ImageView mDialogVolumeImageView;
protected Dialog mBrightnessDialog;
protected ProgressBar mDialogBrightnessProgressBar;
protected TextView mDialogBrightnessTextView;
public static long LAST_GET_BATTERYLEVEL_TIME = 0;
public static int LAST_GET_BATTERYLEVEL_PERCENT = 70;
private BroadcastReceiver battertReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
int level = intent.getIntExtra("level", 0);
int scale = intent.getIntExtra("scale", 100);
int percent = level * 100 / scale;
LAST_GET_BATTERYLEVEL_PERCENT = percent;
setBatteryLevel();
getContext().unregisterReceiver(battertReceiver);
}
}
};
public VideoPlayerWidget(Context context) {
super(context);
}
public VideoPlayerWidget(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void init(Context context) {
super.init(context);
batteryTimeLayout = findViewById(R.id.battery_time_layout);
bottomProgressBar = findViewById(R.id.bottom_progress);
titleTextView = findViewById(R.id.title);
backButton = findViewById(R.id.back);
thumbImageView = findViewById(R.id.thumb);
loadingProgressBar = findViewById(R.id.loading);
batteryLevel = findViewById(R.id.battery_level);
videoCurrentTime = findViewById(R.id.video_current_time);
replayTextView = findViewById(R.id.replay_text);
mRetryBtn = findViewById(R.id.retry_btn);
mRetryLayout = findViewById(R.id.retry_layout);
tinyBackImageView = findViewById(R.id.back_tiny);
clarity = findViewById(R.id.clarity);
tipLayout = findViewById(R.id.tip_layout);
mContinuePlayLayout = findViewById(R.id.continue_play_layout);
mContinuePlayBtn = findViewById(R.id.continue_play_btn);
thumbImageView.setOnClickListener(this);
backButton.setOnClickListener(this);
mRetryBtn.setOnClickListener(this);
mContinuePlayBtn.setOnClickListener(this);
}
public void setUp(JZDataSource jzDataSource, int screen) {
super.setUp(jzDataSource, screen);
titleTextView.setText(jzDataSource.title);
if (currentScreen == SCREEN_WINDOW_FULLSCREEN) {
fullscreenButton.setImageResource(R.drawable.jz_shrink);
backButton.setVisibility(View.VISIBLE);
tinyBackImageView.setVisibility(View.INVISIBLE);
batteryTimeLayout.setVisibility(View.VISIBLE);
if (jzDataSource.urlsMap.size() == 1) {
clarity.setVisibility(GONE);
} else {
clarity.setText(jzDataSource.getCurrentKey().toString());
clarity.setVisibility(View.VISIBLE);
}
changeStartButtonSize((int) getResources().getDimension(R.dimen.jz_start_button_w_h_fullscreen));
} else if (currentScreen == SCREEN_WINDOW_NORMAL
|| currentScreen == SCREEN_WINDOW_LIST) {
fullscreenButton.setImageResource(R.drawable.common_full_screen);
backButton.setVisibility(View.GONE);
tinyBackImageView.setVisibility(View.INVISIBLE);
changeStartButtonSize((int) getResources().getDimension(R.dimen.jz_start_button_w_h_normal));
batteryTimeLayout.setVisibility(View.GONE);
clarity.setVisibility(View.GONE);
} else if (currentScreen == SCREEN_WINDOW_TINY) {
tinyBackImageView.setVisibility(View.VISIBLE);
setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.INVISIBLE,
View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.INVISIBLE);
batteryTimeLayout.setVisibility(View.GONE);
clarity.setVisibility(View.GONE);
}
setSystemTimeAndBattery();
}
@Override
public int getLayoutId() {
return R.layout.layout_video_widget;
}
public void changeStartButtonSize(int size) {
ViewGroup.LayoutParams lp = startButton.getLayoutParams();
lp.height = size;
lp.width = size;
lp = loadingProgressBar.getLayoutParams();
lp.height = size;
lp.width = size;
}
@Override
public void onStateNormal() {
super.onStateNormal();
changeUiToNormal();
}
@Override
public void onStatePreparing() {
super.onStatePreparing();
changeUiToPreparing();
}
@Override
public void changeUrl(int urlMapIndex, long seekToInAdvance) {
super.changeUrl(urlMapIndex, seekToInAdvance);
startButton.setVisibility(INVISIBLE);
replayTextView.setVisibility(View.GONE);
mRetryLayout.setVisibility(View.GONE);
}
@Override
public void changeUrl(JZDataSource jzDataSource, long seekToInAdvance) {
super.changeUrl(jzDataSource, seekToInAdvance);
titleTextView.setText(jzDataSource.title);
startButton.setVisibility(INVISIBLE);
replayTextView.setVisibility(View.GONE);
mRetryLayout.setVisibility(View.GONE);
}
@Override
public void onStatePlaying() {
super.onStatePlaying();
changeUiToPlayingClear();
}
@Override
public void onStatePause() {
super.onStatePause();
changeUiToPauseShow();
cancelDismissControlViewTimer();
}
@Override
public void onStateError() {
super.onStateError();
changeUiToError();
}
@Override
public void onStateAutoComplete() {
super.onStateAutoComplete();
changeUiToComplete();
cancelDismissControlViewTimer();
bottomProgressBar.setProgress(100);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
int id = v.getId();
if (id == cn.jzvd.R.id.surface_container) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
startDismissControlViewTimer();
if (mChangePosition) {
long duration = getDuration();
int progress = (int) (mSeekTimePosition * 100 / (duration == 0 ? 1 : duration));
bottomProgressBar.setProgress(progress);
}
if (!mChangePosition && !mChangeVolume) {
onEvent(JZUserActionStd.ON_CLICK_BLANK);
onClickUiToggle();
}
break;
}
} else if (id == cn.jzvd.R.id.bottom_seek_progress) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
cancelDismissControlViewTimer();
break;
case MotionEvent.ACTION_UP:
startDismissControlViewTimer();
break;
}
}
return super.onTouch(v, event);
}
@Override
public void onClick(View v) {
super.onClick(v);
int i = v.getId();
if (i == R.id.thumb) {
if (jzDataSource == null || jzDataSource.urlsMap.isEmpty() || jzDataSource.getCurrentUrl() == null) {
Toast.makeText(getContext(), getResources().getString(cn.jzvd.R.string.no_url), Toast.LENGTH_SHORT).show();
return;
}
if (currentState == CURRENT_STATE_NORMAL) {
if (!jzDataSource.getCurrentUrl().toString().startsWith("file") &&
!jzDataSource.getCurrentUrl().toString().startsWith("/") &&
!JZUtils.isWifiConnected(getContext()) && !WIFI_TIP_DIALOG_SHOWED) {
showWifiDialog();
return;
}
startVideo();
onEvent(JZUserActionStd.ON_CLICK_START_THUMB);//开始的事件应该在播放之后,此处特殊
} else if (currentState == CURRENT_STATE_AUTO_COMPLETE) {
onClickUiToggle();
}
} else if (i == cn.jzvd.R.id.surface_container) {
startDismissControlViewTimer();
} else if (i == cn.jzvd.R.id.back) {
backPress();
} else if (i == cn.jzvd.R.id.back_tiny) {
if (JzvdMgr.getFirstFloor().currentScreen == Jzvd.SCREEN_WINDOW_LIST) {
quitFullscreenOrTinyWindow();
} else {
backPress();
}
} else if (i == cn.jzvd.R.id.clarity) {
LayoutInflater inflater = (LayoutInflater) getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final LinearLayout layout = (LinearLayout) inflater.inflate(cn.jzvd.R.layout.jz_layout_clarity, null);
OnClickListener mQualityListener = new OnClickListener() {
public void onClick(View v) {
int index = (int) v.getTag();
changeUrl(index, getCurrentPositionWhenPlaying());
clarity.setText(jzDataSource.getCurrentKey().toString());
for (int j = 0; j < layout.getChildCount(); j++) {//设置点击之后的颜色
if (j == jzDataSource.currentUrlIndex) {
((TextView) layout.getChildAt(j)).setTextColor(Color.parseColor("#fff85959"));
} else {
((TextView) layout.getChildAt(j)).setTextColor(Color.parseColor("#ffffff"));
}
}
if (clarityPopWindow != null) {
clarityPopWindow.dismiss();
}
}
};
for (int j = 0; j < jzDataSource.urlsMap.size(); j++) {
String key = jzDataSource.getKeyFromDataSource(j);
TextView clarityItem = (TextView) View.inflate(getContext(), cn.jzvd.R.layout.jz_layout_clarity_item, null);
clarityItem.setText(key);
clarityItem.setTag(j);
layout.addView(clarityItem, j);
clarityItem.setOnClickListener(mQualityListener);
if (j == jzDataSource.currentUrlIndex) {
clarityItem.setTextColor(Color.parseColor("#fff85959"));
}
}
clarityPopWindow = new PopupWindow(layout, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, true);
clarityPopWindow.setContentView(layout);
clarityPopWindow.showAsDropDown(clarity);
layout.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
int offsetX = clarity.getMeasuredWidth() / 3;
int offsetY = clarity.getMeasuredHeight() / 3;
clarityPopWindow.update(clarity, -offsetX, -offsetY, Math.round(layout.getMeasuredWidth() * 2), layout.getMeasuredHeight());
} else if (i == cn.jzvd.R.id.retry_btn) {
if (jzDataSource.urlsMap.isEmpty() || jzDataSource.getCurrentUrl() == null) {
Toast.makeText(getContext(), getResources().getString(cn.jzvd.R.string.no_url), Toast.LENGTH_SHORT).show();
return;
}
if (!jzDataSource.getCurrentUrl().toString().startsWith("file") && !
jzDataSource.getCurrentUrl().toString().startsWith("/") &&
!JZUtils.isWifiConnected(getContext()) && !WIFI_TIP_DIALOG_SHOWED) {
showWifiDialog();
return;
}
initTextureView();//和开始播放的代码重复
addTextureView();
JZMediaManager.setDataSource(jzDataSource);
onStatePreparing();
onEvent(JZUserAction.ON_CLICK_START_ERROR);
} else if (i == R.id.continue_play_btn) {
onEvent(JZUserActionStd.ON_CLICK_START_WIFIDIALOG);
startVideo();
WIFI_TIP_DIALOG_SHOWED = true;
tipLayout.setVisibility(INVISIBLE);
bottomContainer.setVisibility(VISIBLE);
}
}
@Override
public void showWifiDialog() {
super.showWifiDialog();
tipLayout.setVisibility(VISIBLE);
mContinuePlayLayout.setVisibility(VISIBLE);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
super.onStartTrackingTouch(seekBar);
cancelDismissControlViewTimer();
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
super.onStopTrackingTouch(seekBar);
startDismissControlViewTimer();
}
public void onClickUiToggle() {
if (bottomContainer.getVisibility() != View.VISIBLE) {
setSystemTimeAndBattery();
clarity.setText(jzDataSource.getCurrentKey().toString());
}
if (currentState == CURRENT_STATE_PREPARING) {
changeUiToPreparing();
if (bottomContainer.getVisibility() == View.VISIBLE) {
} else {
setSystemTimeAndBattery();
}
} else if (currentState == CURRENT_STATE_PLAYING) {
if (bottomContainer.getVisibility() == View.VISIBLE) {
changeUiToPlayingClear();
} else {
changeUiToPlayingShow();
}
} else if (currentState == CURRENT_STATE_PAUSE) {
if (bottomContainer.getVisibility() == View.VISIBLE) {
changeUiToPauseClear();
} else {
changeUiToPauseShow();
}
}
}
public void setSystemTimeAndBattery() {
SimpleDateFormat dateFormater = new SimpleDateFormat("HH:mm");
Date date = new Date();
videoCurrentTime.setText(dateFormater.format(date));
if ((System.currentTimeMillis() - LAST_GET_BATTERYLEVEL_TIME) > 30000) {
LAST_GET_BATTERYLEVEL_TIME = System.currentTimeMillis();
getContext().registerReceiver(
battertReceiver,
new IntentFilter(Intent.ACTION_BATTERY_CHANGED)
);
} else {
setBatteryLevel();
}
}
public void setBatteryLevel() {
int percent = LAST_GET_BATTERYLEVEL_PERCENT;
if (percent < 15) {
batteryLevel.setBackgroundResource(cn.jzvd.R.drawable.jz_battery_level_10);
} else if (percent >= 15 && percent < 40) {
batteryLevel.setBackgroundResource(cn.jzvd.R.drawable.jz_battery_level_30);
} else if (percent >= 40 && percent < 60) {
batteryLevel.setBackgroundResource(cn.jzvd.R.drawable.jz_battery_level_50);
} else if (percent >= 60 && percent < 80) {
batteryLevel.setBackgroundResource(cn.jzvd.R.drawable.jz_battery_level_70);
} else if (percent >= 80 && percent < 95) {
batteryLevel.setBackgroundResource(cn.jzvd.R.drawable.jz_battery_level_90);
} else if (percent >= 95 && percent <= 100) {
batteryLevel.setBackgroundResource(cn.jzvd.R.drawable.jz_battery_level_100);
}
}
public void onCLickUiToggleToClear() {
if (currentState == CURRENT_STATE_PREPARING) {
if (bottomContainer.getVisibility() == View.VISIBLE) {
changeUiToPreparing();
} else {
}
} else if (currentState == CURRENT_STATE_PLAYING) {
if (bottomContainer.getVisibility() == View.VISIBLE) {
changeUiToPlayingClear();
} else {
}
} else if (currentState == CURRENT_STATE_PAUSE) {
if (bottomContainer.getVisibility() == View.VISIBLE) {
changeUiToPauseClear();
} else {
}
} else if (currentState == CURRENT_STATE_AUTO_COMPLETE) {
if (bottomContainer.getVisibility() == View.VISIBLE) {
changeUiToComplete();
} else {
}
}
}
@Override
public void onProgress(int progress, long position, long duration) {
super.onProgress(progress, position, duration);
if (progress != 0) bottomProgressBar.setProgress(progress);
}
@Override
public void setBufferProgress(int bufferProgress) {
super.setBufferProgress(bufferProgress);
if (bufferProgress != 0) bottomProgressBar.setSecondaryProgress(bufferProgress);
}
@Override
public void resetProgressAndTime() {
super.resetProgressAndTime();
bottomProgressBar.setProgress(0);
bottomProgressBar.setSecondaryProgress(0);
}
public void changeUiToNormal() {
switch (currentScreen) {
case SCREEN_WINDOW_NORMAL:
case SCREEN_WINDOW_LIST:
setAllControlsVisiblity(View.VISIBLE, View.INVISIBLE, View.VISIBLE,
View.INVISIBLE, View.VISIBLE, View.INVISIBLE, View.INVISIBLE);
updateStartImage();
break;
case SCREEN_WINDOW_FULLSCREEN:
setAllControlsVisiblity(View.VISIBLE, View.INVISIBLE, View.VISIBLE,
View.INVISIBLE, View.VISIBLE, View.INVISIBLE, View.INVISIBLE);
updateStartImage();
break;
case SCREEN_WINDOW_TINY:
break;
}
}
public void changeUiToPreparing() {
switch (currentScreen) {
case SCREEN_WINDOW_NORMAL:
case SCREEN_WINDOW_LIST:
case SCREEN_WINDOW_FULLSCREEN:
setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.INVISIBLE,
View.VISIBLE, View.VISIBLE, View.INVISIBLE, View.INVISIBLE);
updateStartImage();
break;
case SCREEN_WINDOW_TINY:
break;
}
}
public void changeUiToPlayingShow() {
switch (currentScreen) {
case SCREEN_WINDOW_NORMAL:
case SCREEN_WINDOW_LIST:
setAllControlsVisiblity(View.VISIBLE, View.VISIBLE, View.VISIBLE,
View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.INVISIBLE);
updateStartImage();
break;
case SCREEN_WINDOW_FULLSCREEN:
setAllControlsVisiblity(View.VISIBLE, View.VISIBLE, View.VISIBLE,
View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.INVISIBLE);
updateStartImage();
break;
case SCREEN_WINDOW_TINY:
break;
}
}
public void changeUiToPlayingClear() {
switch (currentScreen) {
case SCREEN_WINDOW_NORMAL:
case SCREEN_WINDOW_LIST:
setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.INVISIBLE,
View.INVISIBLE, View.INVISIBLE, View.VISIBLE, View.INVISIBLE);
break;
case SCREEN_WINDOW_FULLSCREEN:
setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.INVISIBLE,
View.INVISIBLE, View.INVISIBLE, View.VISIBLE, View.INVISIBLE);
break;
case SCREEN_WINDOW_TINY:
break;
}
}
public void changeUiToPauseShow() {
switch (currentScreen) {
case SCREEN_WINDOW_NORMAL:
case SCREEN_WINDOW_LIST:
setAllControlsVisiblity(View.VISIBLE, View.VISIBLE, View.VISIBLE,
View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.INVISIBLE);
updateStartImage();
break;
case SCREEN_WINDOW_FULLSCREEN:
setAllControlsVisiblity(View.VISIBLE, View.VISIBLE, View.VISIBLE,
View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.INVISIBLE);
updateStartImage();
break;
case SCREEN_WINDOW_TINY:
break;
}
}
public void changeUiToPauseClear() {
switch (currentScreen) {
case SCREEN_WINDOW_NORMAL:
case SCREEN_WINDOW_LIST:
setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.INVISIBLE,
View.INVISIBLE, View.INVISIBLE, View.VISIBLE, View.INVISIBLE);
break;
case SCREEN_WINDOW_FULLSCREEN:
setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.INVISIBLE,
View.INVISIBLE, View.INVISIBLE, View.VISIBLE, View.INVISIBLE);
break;
case SCREEN_WINDOW_TINY:
break;
}
}
public void changeUiToComplete() {
switch (currentScreen) {
case SCREEN_WINDOW_NORMAL:
case SCREEN_WINDOW_LIST:
setAllControlsVisiblity(View.VISIBLE, View.INVISIBLE, View.VISIBLE,
View.INVISIBLE, View.VISIBLE, View.INVISIBLE, View.INVISIBLE);
updateStartImage();
break;
case SCREEN_WINDOW_FULLSCREEN:
setAllControlsVisiblity(View.VISIBLE, View.INVISIBLE, View.VISIBLE,
View.INVISIBLE, View.VISIBLE, View.INVISIBLE, View.INVISIBLE);
updateStartImage();
break;
case SCREEN_WINDOW_TINY:
break;
}
}
public void changeUiToError() {
switch (currentScreen) {
case SCREEN_WINDOW_NORMAL:
case SCREEN_WINDOW_LIST:
setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.VISIBLE,
View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.VISIBLE);
updateStartImage();
break;
case SCREEN_WINDOW_FULLSCREEN:
setAllControlsVisiblity(View.VISIBLE, View.INVISIBLE, View.VISIBLE,
View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.VISIBLE);
updateStartImage();
break;
case SCREEN_WINDOW_TINY:
break;
}
}
public void setAllControlsVisiblity(int topCon, int bottomCon, int startBtn, int loadingPro,
int thumbImg, int bottomPro, int retryLayout) {
topContainer.setVisibility(topCon);
bottomContainer.setVisibility(bottomCon);
startButton.setVisibility(startBtn);
loadingProgressBar.setVisibility(loadingPro);
thumbImageView.setVisibility(thumbImg);
bottomProgressBar.setVisibility(bottomPro);
tipLayout.setVisibility(retryLayout);
mRetryLayout.setVisibility(retryLayout);
}
public void updateStartImage() {
if (currentState == CURRENT_STATE_PLAYING) {
startButton.setVisibility(VISIBLE);
startButton.setImageResource(cn.jzvd.R.drawable.jz_click_pause_selector);
replayTextView.setVisibility(GONE);
} else if (currentState == CURRENT_STATE_ERROR) {
startButton.setVisibility(INVISIBLE);
replayTextView.setVisibility(GONE);
} else if (currentState == CURRENT_STATE_AUTO_COMPLETE) {
startButton.setVisibility(VISIBLE);
startButton.setImageResource(cn.jzvd.R.drawable.jz_click_replay_selector);
replayTextView.setVisibility(VISIBLE);
} else {
startButton.setImageResource(cn.jzvd.R.drawable.jz_click_play_selector);
replayTextView.setVisibility(GONE);
}
}
@Override
public void showProgressDialog(float deltaX, String seekTime, long seekTimePosition, String totalTime, long totalTimeDuration) {
super.showProgressDialog(deltaX, seekTime, seekTimePosition, totalTime, totalTimeDuration);
if (mProgressDialog == null) {
View localView = LayoutInflater.from(getContext()).inflate(cn.jzvd.R.layout.jz_dialog_progress, null);
mDialogProgressBar = localView.findViewById(cn.jzvd.R.id.duration_progressbar);
mDialogSeekTime = localView.findViewById(cn.jzvd.R.id.tv_current);
mDialogTotalTime = localView.findViewById(cn.jzvd.R.id.tv_duration);
mDialogIcon = localView.findViewById(cn.jzvd.R.id.duration_image_tip);
mProgressDialog = createDialogWithView(localView);
}
if (!mProgressDialog.isShowing()) {
mProgressDialog.show();
}
mDialogSeekTime.setText(seekTime);
mDialogTotalTime.setText(" / " + totalTime);
mDialogProgressBar.setProgress(totalTimeDuration <= 0 ? 0 : (int) (seekTimePosition * 100 / totalTimeDuration));
if (deltaX > 0) {
mDialogIcon.setBackgroundResource(cn.jzvd.R.drawable.jz_forward_icon);
} else {
mDialogIcon.setBackgroundResource(cn.jzvd.R.drawable.jz_backward_icon);
}
onCLickUiToggleToClear();
}
@Override
public void dismissProgressDialog() {
super.dismissProgressDialog();
if (mProgressDialog != null) {
mProgressDialog.dismiss();
}
}
@Override
public void showVolumeDialog(float deltaY, int volumePercent) {
super.showVolumeDialog(deltaY, volumePercent);
if (mVolumeDialog == null) {
View localView = LayoutInflater.from(getContext()).inflate(cn.jzvd.R.layout.jz_dialog_volume, null);
mDialogVolumeImageView = localView.findViewById(cn.jzvd.R.id.volume_image_tip);
mDialogVolumeTextView = localView.findViewById(cn.jzvd.R.id.tv_volume);
mDialogVolumeProgressBar = localView.findViewById(cn.jzvd.R.id.volume_progressbar);
mVolumeDialog = createDialogWithView(localView);
}
if (!mVolumeDialog.isShowing()) {
mVolumeDialog.show();
}
if (volumePercent <= 0) {
mDialogVolumeImageView.setBackgroundResource(cn.jzvd.R.drawable.jz_close_volume);
} else {
mDialogVolumeImageView.setBackgroundResource(cn.jzvd.R.drawable.jz_add_volume);
}
if (volumePercent > 100) {
volumePercent = 100;
} else if (volumePercent < 0) {
volumePercent = 0;
}
mDialogVolumeTextView.setText(volumePercent + "%");
mDialogVolumeProgressBar.setProgress(volumePercent);
onCLickUiToggleToClear();
}
@Override
public void dismissVolumeDialog() {
super.dismissVolumeDialog();
if (mVolumeDialog != null) {
mVolumeDialog.dismiss();
}
}
@Override
public void showBrightnessDialog(int brightnessPercent) {
super.showBrightnessDialog(brightnessPercent);
if (mBrightnessDialog == null) {
View localView = LayoutInflater.from(getContext()).inflate(cn.jzvd.R.layout.jz_dialog_brightness, null);
mDialogBrightnessTextView = localView.findViewById(cn.jzvd.R.id.tv_brightness);
mDialogBrightnessProgressBar = localView.findViewById(cn.jzvd.R.id.brightness_progressbar);
mBrightnessDialog = createDialogWithView(localView);
}
if (!mBrightnessDialog.isShowing()) {
mBrightnessDialog.show();
}
if (brightnessPercent > 100) {
brightnessPercent = 100;
} else if (brightnessPercent < 0) {
brightnessPercent = 0;
}
mDialogBrightnessTextView.setText(brightnessPercent + "%");
mDialogBrightnessProgressBar.setProgress(brightnessPercent);
onCLickUiToggleToClear();
}
@Override
public void dismissBrightnessDialog() {
super.dismissBrightnessDialog();
if (mBrightnessDialog != null) {
mBrightnessDialog.dismiss();
}
}
public Dialog createDialogWithView(View localView) {
Dialog dialog = new Dialog(getContext(), cn.jzvd.R.style.jz_style_dialog_progress);
dialog.setContentView(localView);
Window window = dialog.getWindow();
window.addFlags(Window.FEATURE_ACTION_BAR);
window.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
window.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
window.setLayout(-2, -2);
WindowManager.LayoutParams localLayoutParams = window.getAttributes();
localLayoutParams.gravity = Gravity.CENTER;
window.setAttributes(localLayoutParams);
return dialog;
}
public void startDismissControlViewTimer() {
cancelDismissControlViewTimer();
DISMISS_CONTROL_VIEW_TIMER = new Timer();
mDismissControlViewTimerTask = new DismissControlViewTimerTask();
DISMISS_CONTROL_VIEW_TIMER.schedule(mDismissControlViewTimerTask, 2500);
}
public void cancelDismissControlViewTimer() {
if (DISMISS_CONTROL_VIEW_TIMER != null) {
DISMISS_CONTROL_VIEW_TIMER.cancel();
}
if (mDismissControlViewTimerTask != null) {
mDismissControlViewTimerTask.cancel();
}
}
@Override
public void onAutoCompletion() {
super.onAutoCompletion();
cancelDismissControlViewTimer();
}
@Override
public void onCompletion() {
super.onCompletion();
cancelDismissControlViewTimer();
if (clarityPopWindow != null) {
clarityPopWindow.dismiss();
}
}
public void dissmissControlView() {
if (currentState != CURRENT_STATE_NORMAL
&& currentState != CURRENT_STATE_ERROR
&& currentState != CURRENT_STATE_AUTO_COMPLETE) {
post(() -> {
bottomContainer.setVisibility(View.INVISIBLE);
topContainer.setVisibility(View.INVISIBLE);
startButton.setVisibility(View.INVISIBLE);
if (clarityPopWindow != null) {
clarityPopWindow.dismiss();
}
if (currentScreen != SCREEN_WINDOW_TINY) {
bottomProgressBar.setVisibility(View.VISIBLE);
}
});
}
}
public class DismissControlViewTimerTask extends TimerTask {
@Override
public void run() {
dissmissControlView();
}
}
}
一些小屏播放无声音全屏播放有声音,全屏状态播放完成,不退出全屏,可以参考
JiaoZiVideoPlayer使用说明(持续更新中...)
其中将父类JzvdStd更换为当前类即可实现。