安卓:自定义CustomDialog加载控件

393 阅读3分钟

前言

在我们的日常App开发中,随处可见登录注册的场景。设想一下,如果在网络状况不好的情况下,你注册完点击登录按钮进行登录的时候界面没有任何的反应,这时候你的第一感觉是什么?反正我会以为是不是操作没成功?又或者是程序出bug了?然后这时候保不齐就会连续点击登录,甚者还有可能砸手机!妈的,神马玩意!想想都可怕。。这时候我们就应该设计一下,在用户点击登录的时候给一个加载动画,让用户能清楚的知道:“噢 开始登录了” ,同时也提高了App的友好交互能力。废话不多说,开始造轮子!

实现步骤

1.自定义组件CustomDialog

public class CustomDialog extends Dialog {

    /**
     * 重写Dialog构造方法,定义模板
     * @param context
     * @param layout
     * @param style
     */
    public CustomDialog(Context context, int layout, int style) {
        this(context, WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT, layout, style, Gravity.CENTER);
    }


    /**
     * 重写Dialog构造方法,定义属性
     * @param context
     * @param width 宽
     * @param height 高
     * @param layout 布局,哪个布局xml里使用
     * @param style 样式
     * @param gravity 方向
     * @param anim 动画
     */
    public CustomDialog(Context context, int width, int height, int layout, int style, int gravity, int anim){
        super(context, style);
        //设置属性
        setContentView(layout);
        Window window = getWindow();
        WindowManager.LayoutParams layoutParams = window.getAttributes();
        layoutParams.width = width;
        layoutParams.height = height;
        layoutParams.gravity = gravity;
        window.setAttributes(layoutParams);

        //设置动画
        window.setWindowAnimations(anim);
    }

    /**
     * 实例
     */
    public CustomDialog(Context context, int width, int height, int layout, int style, int gravity){
        this(context, width, height, layout, style, gravity, R.style.pop_anim_style);
    }

}

首先自定义Dialog继承Dialog;重写Dialog构造方法,定义模板、属性;创建实例。

pop_anim_style

style.xml中自定义加载控件显示动画

<!--自定义Dialog动画-->
<style name="pop_anim_style">
    <!--进来的动画-->
    <item name="android:windowEnterAnimation">@anim/pop_in</item>
    <!--出去的动画-->
    <item name="android:windowExitAnimation">@anim/pop_out</item>
</style>

两个动画文件:

pop_in

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate
        android:duration="@android:integer/config_shortAnimTime"
        android:fromXDelta="0"
        android:fromYDelta="100%"
        android:toXDelta="0"
        android:toYDelta="0"/>
</set>

pop_out

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate
            android:duration="@android:integer/config_shortAnimTime"
            android:fromXDelta="0"
            android:fromYDelta="0"
            android:toXDelta="0"
            android:toYDelta="100%"/>
</set>

2.使用CustomDialog

Activity中

private CustomDialog dialog;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    //初始化
    dialog = new CustomDialog(this, 300, 300,
                R.layout.dialog_loading, R.style.Theme_dialog, Gravity.CENTER, R.style.pop_anim_style);
}

调用时使用dialog.show()

//显示加载控件
dialog.show();

当请求服务端结束后,或从服务端拿到数据以后使用dialog.dismiss()隐藏加载控件

//隐藏加载控件
dialog.dismiss();

dialog_loading

加载控件布局文件,使用线性布局,两个控件:ProgressBar(进度条,主要是旋转的loading条)、TextView(显示加载文字,如:请稍后...)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <LinearLayout android:layout_width="100dp" android:layout_height="100dp"
                  android:background="@drawable/bmob_update_dialog_bg"
                  android:gravity="center"
                  android:orientation="vertical">

        <ProgressBar
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
        />

        <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
                  android:textColor="@color/colorAccent"
                  android:layout_marginTop="10dp"
                  android:text="@string/dialog_loading_text"
        />

    </LinearLayout>

</LinearLayout>

Theme_dialog

设置加载控件主题

<!--自定义Dialog主题-->
<style name="Theme_dialog" parent="@android:style/Theme.Dialog">
    <!--背景全透明-->
    <item name="android:windowBackground">@android:color/transparent</item>
    <!--不要标题-->
    <item name="android:windowNoTitle">true</item>
</style>

3.效果图

至此,一个简单的自定义加载控件就完成了,也可以将它封装起来,方便以后调用。什么?背景眼熟?没错!熟悉健身的童鞋应该看出来了,背景使用的是keep的视频,这不是重点!只因为实在找不到好看的视频了。。这里也感谢Keep的贡献(手动斜眼笑)。。本人安卓小白,大神们如果有什么疑问或者更好的建议,欢迎交流学习!