前言
在我们的日常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的贡献(手动斜眼笑)。。本人安卓小白,大神们如果有什么疑问或者更好的建议,欢迎交流学习!