Kotlin实现Android项目中通用loading对话框
在安卓项目中,都会有耗时操作,用户进行操作后,都会给一个诸如正在加载的提示框,例如:
实现代码如下:
- 第一步:编写通用加载框的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/loading_dialog_bg"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="40dp">
//有的APP是在这里直接使用ProgressBar
<ImageView
android:id="@+id/loadingIv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/loading_dialog_anim" />
</LinearLayout>
- 第二步:编写对话框的样式:位于项目main/res/values/styles.xml文件中
<style name="commonDialogStyle" parent="@android:style/Theme.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowFrame">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
<item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
</style>
- 第三步:实现自定义的Dialog
class CommonLoadingDialog private constructor(context: Context, theme: Int) : Dialog(context, theme) {
companion object {
private lateinit var mDialog: CommonLoadingDialog
private lateinit var animDrawable: AnimationDrawable
fun buildDialog(context: Context): CommonLoadingDialog {
//根据指定主题样式创建Dialog
mDialog = CommonLoadingDialog(context, R.style.commonDialogStyle)
//设置Dialog的布局
mDialog.setContentView(R.layout.common_loading)
//点击或按返回键时消失
mDialog.setCancelable(true)
//点击对话框外的部分不消失.
mDialog.setCanceledOnTouchOutside(false)
//设置对话框居中
mDialog.window.attributes.gravity = Gravity.CENTER
val lp = mDialog.window.attributes
lp.dimAmount = 0.2f
//设置属性
mDialog.window.attributes = lp
//获取对话框中的动画
val animView = mDialog.findViewById<ImageView>(R.id.loadingIv)
animDrawable = animView.background as AnimationDrawable
return mDialog
}
}
//显示加载框
fun showLoading() {
super.show()
animDrawable?.start()
}
//关闭加载框
fun hideLoading() {
super.dismiss()
animDrawable?.stop()
}
}
- 最后:在需要的地方使用:
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//布局中就是一个简单的TextView作为点击源
setContentView(R.layout.activity_main)
//项目中都是把CommonLoadingDialog放在基类中初始化,在需要的地方直接使用
val dialog: CommonLoadingDialog = CommonLoadingDialog.buildDialog(this);
dialogTv.setOnClickListener {
dialog.showLoading()
}
}
}
- loading的圆角背景框drawable:
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<solid android:color="#7f000000" />
<corners
android:bottomLeftRadius="5dp"
android:bottomRightRadius="5dp"
android:topLeftRadius="5dp"
android:topRightRadius="5dp" />
</shape>
还有loading时转动的动画效果(最简单的帧动画)
//这里面的图片都是在网上找的
<?xml version="1.0" encoding="utf-8"?>
<animation-list
xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/common_loading1" android:duration="200"/>
<item android:drawable="@drawable/common_loading2" android:duration="200"/>
<item android:drawable="@drawable/common_loading3" android:duration="200"/>
<item android:drawable="@drawable/common_loading4" android:duration="200"/>
<item android:drawable="@drawable/common_loading5" android:duration="200"/>
<item android:drawable="@drawable/common_loading6" android:duration="200"/>
<item android:drawable="@drawable/common_loading7" android:duration="200"/>
<item android:drawable="@drawable/common_loading8" android:duration="200"/>
<item android:drawable="@drawable/common_loading9" android:duration="200"/>
<item android:drawable="@drawable/common_loading10" android:duration="200"/>
</animation-list>