Kotlin实现Android项目中通用loading对话框

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/true100/article/details/86304514

在安卓项目中,都会有耗时操作,用户进行操作后,都会给一个诸如正在加载的提示框,例如:
提示用户正在加载
实现代码如下:

  • 第一步:编写通用加载框的布局
<?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>

猜你喜欢

转载自blog.csdn.net/true100/article/details/86304514