使用Lottie动画做的LoadingDialog
添加依赖
implementation('com.airbnb.android:lottie:3.0.7')
/**
* @describe 加載Dialog
*/
class LoadingDialog(private val mContext: Context) {
private lateinit var dialog: Dialog
private var mBackgroundLayout: LinearLayout? = null
/***
* tip 提示
*/
private var tvTip: TextView? = null
/**
* 是否显示提示文字
*/
private var showTip = false
/**
* dialog 宽度
*/
private var dialogWidth = 0.7f
private val mDisplay: Display
init {
val windowManager = mContext.getSystemService(Context.WINDOW_SERVICE) as WindowManager
mDisplay = windowManager.defaultDisplay
}
fun builder(): LoadingDialog {
val view = LayoutInflater.from(mContext).inflate(R.layout.layout_loading_dialog, null)
mBackgroundLayout = view.findViewById(R.id.ll_background)
tvTip = view.findViewById(R.id.tvTip)
dialog = Dialog(mContext, R.style.AlertDialogStyle)
dialog.setContentView(view)
@Suppress("DEPRECATION")
mBackgroundLayout?.layoutParams =
FrameLayout.LayoutParams(
(mDisplay.width * dialogWidth).toInt(),
LinearLayout.LayoutParams.WRAP_CONTENT
)
return this
}
fun setTip(tip: String?): LoadingDialog {
if (tip.isNullOrEmpty()) {
return this
}
showTip = true
tvTip?.text = tip
return this
}
/***
* 是否点击返回能够取消
* @param cancel
* @return
*/
fun setCancelable(cancel: Boolean): LoadingDialog {
dialog.setCancelable(cancel)
return this
}
/**
* 设置是否可以取消
*
* @param isCancelOutside
* @return
*/
fun setCancelOutside(isCancelOutside: Boolean): LoadingDialog {
dialog.setCanceledOnTouchOutside(isCancelOutside)
return this
}
fun setLayoutBackgroundColor(@ColorRes color: Int): LoadingDialog {
mBackgroundLayout?.setBackgroundColor(ContextCompat.getColor(mContext, color))
return this
}
fun show() {
setLayout()
dialog.show()
}
fun dismiss() {
dialog.dismiss()
}
private fun setLayout() {
if (showTip) {
tvTip?.visibility = View.VISIBLE
}
if (!showTip) {
tvTip?.visibility = View.GONE
}
}
/**
* 设置dialog 宽度
*
* @param dialogWidth
* @return
*/
fun setDialogWidth(dialogWidth: Float): LoadingDialog {
if (mBackgroundLayout != null) {
@Suppress("DEPRECATION")
mBackgroundLayout?.layoutParams =
FrameLayout.LayoutParams(
(mDisplay.width * dialogWidth).toInt(),
LinearLayout.LayoutParams.WRAP_CONTENT
)
}
this.dialogWidth = dialogWidth
return this
}
}
自定义样式
<!-- 自定义AlertDialog的样式 -->
<style name="AlertDialogStyle" parent="@android:style/Theme.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowFrame">@null</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsTranslucent">true</item>
</style>
layout_loading_dialog布局样式
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/ll_background"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape_bg_white"
android:orientation="vertical"
android:padding="@dimen/dimen_15_dp">
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/animationView"
android:layout_width="@dimen/dimen_80_dp"
android:layout_height="@dimen/dimen_80_dp"
app:layout_constraintBottom_toTopOf="@+id/tvMessage"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/ivNoData"
app:lottie_repeatMode="restart"
app:lottie_autoPlay="true"
app:lottie_loop="true"
android:layout_gravity="center"
app:lottie_fileName="loading.json"/>
<TextView
android:id="@+id/tvTip"
android:layout_width="match_parent"
android:layout_height="@dimen/dimen_40_dp"
android:layout_marginTop="@dimen/dimen_15_dp"
android:gravity="center"
android:textColor="@color/black_34"
android:textSize="@dimen/text_size_16_sp"
android:textStyle="bold"
tools:text="@string/loading"/>
</LinearLayout>