opt videoplayer

This commit is contained in:
lixiaopeng
2021-11-03 18:33:34 +08:00
parent f5f7cc6c9c
commit fe4bcbe2d8
13 changed files with 524 additions and 56 deletions

View File

@@ -1,32 +1,28 @@
package com.mogo.eagle.core.function.hmi.ui.notice
import android.content.Context
import android.graphics.Bitmap
import android.text.TextUtils
import android.util.Log
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import com.mogo.eagle.core.data.notice.NoticeNormalData
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.widget.media.video.SimpleVideoPlayer
import com.mogo.eagle.core.widget.media.video.NoticeSimpleVideoPlayer
import com.mogo.module.common.dialog.BaseFloatDialog
import com.mogo.utils.BitmapHelper
import com.mogo.utils.glide.GlideApp
import com.mogo.utils.logger.Logger
import com.shuyu.gsyvideoplayer.GSYVideoManager
import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder
import com.shuyu.gsyvideoplayer.cache.CacheFactory
import com.shuyu.gsyvideoplayer.cache.ProxyCacheManager
import com.shuyu.gsyvideoplayer.listener.GSYMediaPlayerListener
import com.shuyu.gsyvideoplayer.model.VideoOptionModel
import com.shuyu.gsyvideoplayer.player.IjkPlayerManager
import com.shuyu.gsyvideoplayer.player.PlayerFactory
import com.shuyu.gsyvideoplayer.utils.GSYVideoType
import tv.danmaku.ijk.media.player.IjkMediaPlayer
import java.util.*
import com.shuyu.gsyvideoplayer.listener.VideoAllCallBack
import com.shuyu.gsyvideoplayer.video.base.GSYVideoView
/**
* 点击查看对话框,需要做接口的请求
*
* @brief 点击查看对话框
* @author lixiaopeng
*/
class NoticeCheckDialog(context: Context) : BaseFloatDialog(context) {
@@ -35,9 +31,11 @@ class NoticeCheckDialog(context: Context) : BaseFloatDialog(context) {
private var pushCheckTitle: TextView? = null
private var pushCheckContent: TextView? = null
private var pushImageView: ImageView? = null
private var pushVideo: SimpleVideoPlayer? = null
private var pushVideo: NoticeSimpleVideoPlayer? = null
private val gsyVideoOptionBuilder = GSYVideoOptionBuilder()
// private var mLoading: ProgressBar? = null
private var playImageView: ImageView? = null
private var thumbnailImageView: ImageView? = null
private var mVideoUrl: String = ""
init {
setContentView(R.layout.notice_dialog_check_with_accessory)
@@ -47,19 +45,28 @@ class NoticeCheckDialog(context: Context) : BaseFloatDialog(context) {
pushCheckContent = findViewById(R.id.module_push_dialog_bottom_title)
pushImageView = findViewById(R.id.notice_image)
pushVideo = findViewById(R.id.notice_video_layout)
// mLoading = findViewById(R.id.loading)
// mLoading!!.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(context, R.color.notice_video_progressbar_loading_color), PorterDuff.Mode.MULTIPLY)
playImageView = findViewById(R.id.notice_video_play)
thumbnailImageView = findViewById(R.id.thumbnail_image)
pushCheckClose?.setOnClickListener {
stopLive()
dismiss()
}
playImageView!!.setOnClickListener {
if (pushVideo!!.currentState == GSYVideoView.CURRENT_STATE_PAUSE) { /*播放中*/
resume()
} else {
pause()
}
}
}
/**
* 展示详情页面
*/
fun showCheckDialog(noticeNormal: NoticeNormalData) {
Logger.d("liyz", "------1--------")
if (isShowing || noticeNormal == null) {
return
}
@@ -72,18 +79,17 @@ class NoticeCheckDialog(context: Context) : BaseFloatDialog(context) {
pushCheckContent?.text = noticeNormal.content
if (!TextUtils.isEmpty(noticeNormal.imageUrl) && noticeNormal.fileType == 1) {
Logger.d("liyz", "------2--------")
pushVideo?.visibility = View.GONE
pushImageView?.visibility = View.VISIBLE
pushImageView?.let { GlideApp.with(context!!).load(noticeNormal.imageUrl).into(it) }
}
if (!TextUtils.isEmpty(noticeNormal.videoUrl) && noticeNormal.fileType == 2) {
Logger.d("liyz", "------3--------")
pushImageView?.visibility = View.GONE
pushVideo?.visibility = View.VISIBLE
//加载视频播放
playLiveVideo(noticeNormal.videoUrl)
playVideo(noticeNormal.videoUrl)
mVideoUrl = noticeNormal.videoUrl
}
show()
@@ -91,26 +97,19 @@ class NoticeCheckDialog(context: Context) : BaseFloatDialog(context) {
/**
* 播放直播流,且开始心跳
* 播放视频
*/
private fun playLiveVideo(videoUrl: String) {
// pushVideo?.setPlayListener(object : PlayListener {
// override fun onPlayEvent(event: Int) {
// Logger.d("liyz", "event ----- $event")
// if (event == SimpleVideoPlayer.PLAY_EVT_PLAY_LOADING) {
//// mLoading!!.visibility = View.VISIBLE
// } else if (event == SimpleVideoPlayer.PLAY_EVT_PLAY_BEGIN) {
//// mLoading!!.visibility = View.GONE
// } else if (event < 0) {
// stopLive()
//// mLoading!!.visibility = View.GONE
// }
// }
// })
gsyVideoOptionBuilder.setUrl(videoUrl).setCacheWithPlay(false).setPlayTag(TAG)
.build(pushVideo)
pushVideo!!.startButton.performClick()
private fun playVideo(videoUrl: String) {
try {
gsyVideoOptionBuilder.setUrl(videoUrl).setCacheWithPlay(false).setPlayTag(TAG)
.build(pushVideo)
pushVideo!!.startButton.performClick()
playImageView!!.visibility = View.GONE
thumbnailImageView!!.visibility = View.GONE
startVideoCallBack(videoUrl)
} catch (e: Exception) {
e.printStackTrace()
}
}
fun stopLive() {
@@ -121,7 +120,78 @@ class NoticeCheckDialog(context: Context) : BaseFloatDialog(context) {
}
}
//播放完成的回调 TODO
/**
* 暂停
*/
private fun pause() {
playImageView!!.visibility = View.VISIBLE
playImageView!!.setImageResource(R.drawable.notice_video_play)
thumbnailImageView!!.visibility = View.GONE
}
/**
* 继续
*/
private fun resume() {
playImageView!!.visibility = View.VISIBLE
playImageView!!.setImageResource(R.drawable.notice_video_pause)
thumbnailImageView!!.visibility = View.GONE
}
/**
* 播放结束后
*/
private fun complete(firstbitmap: Bitmap, path: String) {
thumbnailImageView!!.visibility = View.VISIBLE
thumbnailImageView!!.setImageBitmap(firstbitmap)
playImageView!!.setImageResource(R.drawable.notice_video_play)
playImageView!!.visibility = View.VISIBLE
}
private fun startVideoCallBack(path: String) {
Thread(Runnable {
val firstBitmap = BitmapHelper.getVideoThumbnail(path) /*获取第一帧图*/
pushVideo!!.setVideoAllCallBack(object : VideoAllCallBack {
override fun onAutoComplete(url: String, vararg objects: Any) {
complete(firstBitmap, path)
}
override fun onClickResume(url: String, vararg objects: Any) {
thumbnailImageView!!.visibility = View.GONE
playImageView!!.visibility = View.GONE
}
override fun onClickStop(url: String, vararg objects: Any) {
Log.d(TAG, "onClickStop")
}
override fun onStartPrepared(url: String, vararg objects: Any) {
Log.d(TAG, "onStartPrepared")
}
override fun onPrepared(url: String, vararg objects: Any) {}
override fun onClickStartIcon(url: String, vararg objects: Any) {}
override fun onClickStartError(url: String, vararg objects: Any) {}
override fun onClickStopFullscreen(url: String, vararg objects: Any) {}
override fun onClickResumeFullscreen(url: String, vararg objects: Any) {}
override fun onClickSeekbar(url: String, vararg objects: Any) {}
override fun onClickSeekbarFullscreen(url: String, vararg objects: Any) {}
override fun onEnterFullscreen(url: String, vararg objects: Any) {}
override fun onQuitFullscreen(url: String, vararg objects: Any) {}
override fun onQuitSmallWidget(url: String, vararg objects: Any) {}
override fun onEnterSmallWidget(url: String, vararg objects: Any) {}
override fun onTouchScreenSeekVolume(url: String, vararg objects: Any) {}
override fun onTouchScreenSeekPosition(url: String, vararg objects: Any) {}
override fun onTouchScreenSeekLight(url: String, vararg objects: Any) {}
override fun onPlayError(url: String, vararg objects: Any) {}
override fun onClickStartThumb(url: String, vararg objects: Any) {}
override fun onClickBlank(url: String, vararg objects: Any) {}
override fun onClickBlankFullscreen(url: String, vararg objects: Any) {
Log.d(TAG, "onClickBlankFullscreen")
}
})
}).start()
}
}

View File

@@ -14,15 +14,11 @@ import com.mogo.eagle.core.data.notice.NoticeTrafficStylePushData;
import com.mogo.eagle.core.function.hmi.R;
import com.mogo.eagle.core.widget.media.video.SimpleVideoPlayer;
import com.mogo.module.common.dialog.BaseFloatDialog;
import com.mogo.module.common.view.SpacesItemDecoration;
import com.mogo.utils.BitmapHelper;
import com.mogo.utils.ResourcesHelper;
import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder;
import com.shuyu.gsyvideoplayer.listener.VideoAllCallBack;
import com.shuyu.gsyvideoplayer.video.base.GSYVideoView;
import java.util.List;
/**
* @author liujing
* @description 描述
@@ -109,7 +105,7 @@ public class NoticeTrafficDialog extends BaseFloatDialog {
* 继续
*/
private void resume() {
playImageView.setImageResource(R.drawable.video_pause);
playImageView.setImageResource(R.drawable.notice_video_pause);
playImageView.setVisibility(View.GONE);
thumbnailImage.setVisibility(View.GONE);
}
@@ -120,7 +116,7 @@ public class NoticeTrafficDialog extends BaseFloatDialog {
private void complete(Bitmap firstbitmap, String path) {
thumbnailImage.setVisibility(View.VISIBLE);
thumbnailImage.setImageBitmap(firstbitmap);
playImageView.setImageResource(R.drawable.video_play);
playImageView.setImageResource(R.drawable.notice_video_play);
playImageView.setVisibility(View.VISIBLE);
playImageView.setOnClickListener(v -> {
startLive();

View File

@@ -38,6 +38,7 @@
android:layout_marginLeft="@dimen/dp_150"
android:layout_marginRight="@dimen/dp_150"
android:layout_marginBottom="@dimen/dp_56"
android:layout_marginTop="@dimen/dp_6"
android:ellipsize="end"
android:gravity="left"
android:maxLines="2"
@@ -63,7 +64,7 @@
app:layout_constraintTop_toBottomOf="@+id/module_push_dialog_acc_title" />
<!--中间视频-->
<com.mogo.eagle.core.widget.media.video.SimpleVideoPlayer
<com.mogo.eagle.core.widget.media.video.NoticeSimpleVideoPlayer
android:id="@+id/notice_video_layout"
android:layout_width="@dimen/module_push_dialog_check_acc_image_width"
android:layout_height="@dimen/module_push_dialog_check_acc_image__height"
@@ -71,20 +72,39 @@
android:layout_marginTop="@dimen/dp_52"
android:layout_marginRight="@dimen/dp_150"
android:gravity="center"
android:visibility="visible"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@+id/module_push_dialog_bottom_title"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/module_push_dialog_acc_title" />
<androidx.core.widget.ContentLoadingProgressBar
android:id="@+id/loading"
style="?android:attr/progressBarStyleSmall"
android:layout_width="36dp"
android:layout_height="36dp"
<!--缩略图-->
<com.mogo.service.imageloader.MogoImageView
android:id="@+id/thumbnail_image"
android:layout_width="@dimen/module_push_dialog_check_acc_image_width"
android:layout_height="@dimen/module_push_dialog_check_acc_image__height"
android:layout_marginLeft="@dimen/dp_200"
android:layout_marginTop="@dimen/dp_50"
android:layout_marginRight="@dimen/dp_200"
android:background="@drawable/notice_unsuccess_image"
android:scaleType="fitXY"
android:visibility="gone"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" />
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!--播放按钮-->
<ImageView
android:id="@+id/notice_video_play"
android:layout_width="@dimen/dp_100"
android:layout_height="@dimen/dp_100"
app:layout_constraintBottom_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="parent" />
android:src="@drawable/video_play"
android:visibility="gone" />
<!--加载失败默认图-->
<ImageView

View File

@@ -64,7 +64,7 @@
android:layout_width="@dimen/dp_100"
android:layout_height="@dimen/dp_100"
android:layout_centerInParent="true"
android:src="@drawable/video_play"
android:src="@drawable/notice_video_play"
android:visibility="gone" />
<!--事故来源等事故详情-->
<androidx.recyclerview.widget.RecyclerView

View File

@@ -0,0 +1,213 @@
package com.mogo.eagle.core.widget.media.video
import android.content.Context
import android.util.AttributeSet
import android.util.Log
import android.view.Surface
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import com.mogo.eagle.core.utilcode.util.TimeTransformUtils
import com.mogo.eagle.core.widget.R
import com.shuyu.gsyvideoplayer.GSYVideoManager
import com.shuyu.gsyvideoplayer.utils.GSYVideoType
import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer
import com.shuyu.gsyvideoplayer.video.base.GSYVideoView
import com.shuyu.gsyvideoplayer.video.base.GSYVideoViewBridge
/**
* @author lixiaopeng
* @since 2021/11/3
*
* 视频播放器ui定制
*/
class NoticeSimpleVideoPlayer : StandardGSYVideoPlayer {
companion object {
const val PLAY_EVT_PLAY_LOADING = 1000
const val PLAY_EVT_PLAY_BEGIN = 2000
const val PLAY_EVT_PLAY_ERROR = 3000
}
private var playListener: PlayListener? = null
private lateinit var start: ImageView
private lateinit var coverImage: ImageView
private lateinit var fullscreen: ImageView
private lateinit var currentTimeTextView: TextView
private lateinit var totalTimeTextView: TextView
interface PlayListener {
fun onPlayEvent(event: Int)
}
constructor(context: Context?) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context?, fullFlag: Boolean?) : super(context, fullFlag)
override fun init(context: Context) {
super.init(context)
start = findViewById(R.id.start)
coverImage = findViewById(R.id.thumbImage)
fullscreen = findViewById(R.id.fullscreen)
currentTimeTextView = findViewById(R.id.current)
totalTimeTextView = findViewById(R.id.total)
if (mThumbImageViewLayout != null
&& (mCurrentState == -1 || mCurrentState == CURRENT_STATE_NORMAL || mCurrentState == CURRENT_STATE_ERROR)
) {
mThumbImageViewLayout.visibility = View.VISIBLE
}
}
override fun getLayoutId(): Int {
return R.layout.item_notice_video
}
override fun getGSYVideoManager(): GSYVideoViewBridge {
GSYVideoManager.instance().initContext(context.applicationContext)
return GSYVideoManager.instance()
}
override fun updateStartImage() {
when (mCurrentState) {
GSYVideoView.CURRENT_STATE_PLAYING ->
start.setImageResource(R.drawable.notice_video_pause)
GSYVideoView.CURRENT_STATE_ERROR ->
start.setImageResource(R.drawable.notice_video_pause)
else -> start.setImageResource(R.drawable.notice_video_play)
}
}
override fun setProgressAndTime(
progress: Int,
secProgress: Int,
currentTime: Int,
totalTime: Int,
forceChange: Boolean
) {
super.setProgressAndTime(progress, secProgress, currentTime, totalTime, forceChange)
mBottomContainer?.visibility = View.VISIBLE
mProgressBar?.visibility = View.VISIBLE
start?.visibility = View.VISIBLE
fullscreen?.visibility = View.GONE
//时间显示
currentTimeTextView?.text = TimeTransformUtils.stringForTime(currentTime)
totalTimeTextView?.text = TimeTransformUtils.stringForTime(totalTime)
if (progress != 0) {
mProgressBar?.progress = progress
}
}
fun setPlayListener(listener: PlayListener) {
this.playListener = listener
}
override fun changeUiToCompleteShow() {
super.changeUiToCompleteShow()
Log.d("liyz", "changeUiToCompleteShow ------> ")
mBottomContainer?.visibility = View.INVISIBLE
mProgressBar?.visibility = View.GONE
}
override fun hideAllWidget() {
super.hideAllWidget()
Log.d("liyz", "hideAllWidget ------> ")
mBottomContainer?.visibility = View.INVISIBLE
mProgressBar?.visibility = View.GONE
}
override fun changeUiToPrepareingClear() {
super.changeUiToPrepareingClear()
mBottomContainer?.visibility = View.INVISIBLE
mProgressBar?.visibility = View.GONE
}
override fun changeUiToPlayingBufferingClear() {
super.changeUiToPlayingBufferingClear()
mBottomContainer?.visibility = View.INVISIBLE
mProgressBar?.visibility = View.GONE
}
override fun changeUiToClear() {
super.changeUiToClear()
mBottomContainer?.visibility = View.INVISIBLE
mProgressBar?.visibility = View.GONE
}
override fun changeUiToCompleteClear() {
super.changeUiToCompleteClear()
mBottomContainer?.visibility = View.INVISIBLE
mProgressBar?.visibility = View.GONE
}
override fun onAutoCompletion() {
super.onAutoCompletion()
mProgressBar?.progress = 0
}
override fun showWifiDialog() {
//直接播放不显示WIFI对话框
startPlayLogic()
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
mProgressBar?.progress = 0
mFullPauseBitmap = null
}
override fun onClick(v: View?) {
super.onClick(v)
}
override fun onCompletion() {
isPostBufferUpdate = false
}
override fun onSurfaceUpdated(surface: Surface) {
super.onSurfaceUpdated(surface)
if (mThumbImageViewLayout != null && mThumbImageViewLayout.visibility == View.VISIBLE) {
mThumbImageViewLayout.visibility = View.INVISIBLE
}
}
override fun onPrepared() {
super.onPrepared()
playListener?.onPlayEvent(PLAY_EVT_PLAY_LOADING)
}
private var isPostBufferUpdate = false
override fun onBufferingUpdate(percent: Int) {
super.onBufferingUpdate(percent)
if (!isPostBufferUpdate && percent == 0) {
isPostBufferUpdate = true
playListener?.onPlayEvent(PLAY_EVT_PLAY_BEGIN)
}
}
override fun onError(what: Int, extra: Int) {
super.onError(what, extra)
playListener?.onPlayEvent(PLAY_EVT_PLAY_ERROR)
isPostBufferUpdate = false
}
override fun setViewShowState(view: View?, visibility: Int) {
if (view === mThumbImageViewLayout && visibility != View.VISIBLE) {
return
}
super.setViewShowState(view, visibility)
}
override fun onSurfaceAvailable(surface: Surface) {
super.onSurfaceAvailable(surface)
mProgressBar?.visibility = View.GONE
if (GSYVideoType.getRenderType() != GSYVideoType.TEXTURE) {
if (mThumbImageViewLayout != null && mThumbImageViewLayout.visibility == View.VISIBLE) {
mThumbImageViewLayout.visibility = View.INVISIBLE
}
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 315 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<corners android:radius="5dp" />
<solid android:color="#80ffffff" />
</shape>
</item>
<!-- <item android:id="@android:id/secondaryProgress">-->
<!-- <clip>-->
<!-- <shape>-->
<!-- <solid android:color="#ff51495e" />-->
<!-- </shape>-->
<!-- </clip>-->
<!-- </item>-->
<item android:id="@android:id/background">
<shape>
<corners android:radius="5dp" />
<gradient
android:angle="0"
android:endColor="#53C7F8"
android:startColor="#2972EE" />
</shape>
</item>
</layer-list>

View File

@@ -0,0 +1,112 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/item_video_cover"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/surface_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
</RelativeLayout>
<RelativeLayout
android:id="@+id/thumb"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<!-- android:layout_alignParentStart="true"-->
<!-- android:layout_alignParentLeft="true"-->
<!-- android:layout_alignParentTop="true"-->
<!-- android:layout_alignParentEnd="true"-->
<!-- android:layout_alignParentRight="true"-->
<!-- android:layout_alignParentBottom="true"-->
<ImageView
android:id="@+id/thumbImage"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:scaleType="fitXY" />
</RelativeLayout>
<!--局部播放器-->
<LinearLayout
android:id="@+id/layout_bottom"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentBottom="true"
android:layout_marginBottom="20px"
android:orientation="horizontal">
<ImageView
android:id="@+id/start"
android:layout_width="52px"
android:layout_height="52px"
android:layout_marginLeft="56px"
android:layout_marginRight="50px"
android:src="@drawable/notice_video_pause"
android:layout_gravity="bottom" />
<TextView
android:id="@+id/current"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginRight="30px"
android:layout_marginBottom="5px"
android:gravity="center_vertical"
android:text="02:23"
android:textColor="@android:color/white"
android:textSize="26px" />
<SeekBar
android:id="@+id/progress"
android:layout_width="990px"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="@null"
android:max="100"
android:maxHeight="8px"
android:minHeight="8px"
android:thumb="@drawable/notice_player_ic_circle_nor"
android:visibility="visible" />
<TextView
android:id="@+id/total"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginLeft="30px"
android:layout_marginBottom="5px"
android:text="08:66"
android:textColor="@android:color/white"
android:textSize="26px" />
<ImageView
android:id="@+id/fullscreen"
android:layout_width="60px"
android:layout_height="60px"
android:scaleType="centerInside" />
</LinearLayout>
<!-- <ImageView-->
<!-- android:id="@+id/start"-->
<!-- android:layout_width="100px"-->
<!-- android:layout_height="100px"-->
<!-- android:layout_centerHorizontal="true"-->
<!-- android:layout_centerVertical="true"-->
<!-- android:layout_gravity="center_vertical"-->
<!-- android:visibility="gone" />-->
<ProgressBar
android:id="@+id/loading"
android:layout_width="56px"
android:layout_height="56px"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:indeterminateTint="#256BFF"
android:visibility="gone" />
</RelativeLayout>

View File

@@ -0,0 +1,30 @@
package com.mogo.eagle.core.utilcode.util;
import java.util.Formatter;
import java.util.Locale;
/**
* author: lixiaopeng
* desc : 时间转换
*/
public final class TimeTransformUtils {
public static String stringForTime(int timeMs) {
if (timeMs <= 0 || timeMs >= 24 * 60 * 60 * 1000) {
return "00:00";
}
int totalSeconds = timeMs / 1000;
int seconds = totalSeconds % 60;
int minutes = (totalSeconds / 60) % 60;
int hours = totalSeconds / 3600;
StringBuilder stringBuilder = new StringBuilder();
Formatter mFormatter = new Formatter(stringBuilder, Locale.getDefault());
if (hours > 0) {
return mFormatter.format("%d:%02d:%02d", hours, minutes, seconds).toString();
} else {
return mFormatter.format("%02d:%02d", minutes, seconds).toString();
}
}
}