简单的自定义
自定义dialog首先要继承系统的dialog类,要求必须有一个构造方法
我们使用2个参数的构造方法,在源码中一个参数的调用2个参数的构造,3个参数的构造调用3个参数的构造,
在第三个构造方法中,会解析一个系统的样式,我们使用第二个构造方法就是为了让系统解析我们定义的样式
public Mydialog(Context context) { super(context,R.style.MydialogTheme); mContext = context; }
super走父类的构造方法,传进去一个样式,让系统解析我们的样式
系统的dialog构造方法代码,如果有传进来的样式就会解析传进来的样式
Dialog(@NonNull Context context, @StyleRes int themeResId, boolean createContextThemeWrapper) { if (createContextThemeWrapper) { if (themeResId == 0) { final TypedValue outValue = new TypedValue(); context.getTheme().resolveAttribute(R.attr.dialogTheme, outValue, true); themeResId = outValue.resourceId; } mContext = new ContextThemeWrapper(context, themeResId); } else { mContext = context; }
要传什么样式?找到系统的dialog使用的样试,复制过来根据需求修改下就可以用了
<style name="MydialogTheme" parent="Base.Theme.AppCompat.Light"> <!--是否是浮动显示--> <item name="android:windowIsFloating">true</item> <!--背景颜色--> <item name="android:windowBackground">@android:color/black</item> <!--设置动画--> <item name="android:windowAnimationStyle">@style/AnimationDialog</item> </style> <!--自定义dialog的动画--> <style name="AnimationDialog"> <item name="android:windowEnterAnimation">@anim/dialog_enter</item><!--进入动画--> <item name="android:windowExitAnimation">@anim/dialog_exit</item><!--出去动画--> </style>
然后是进出动画
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:fromXDelta="0" android:toXDelta="0" android:fromYDelta="100%p" android:toYDelta="0" android:duration="1000" android:interpolator="@android:anim/anticipate_overshoot_interpolator" /> </set>
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:interpolator="@android:anim/anticipate_overshoot_interpolator" android:fromXDelta="0" android:toXDelta="0" android:fromYDelta="0" android:toYDelta="-100%p" android:duration="1000" /> </set>
最后在要显示的地方显示出来
@Override public void onClick(View v) { Mydialog dialog = new Mydialog(this); dialog.setCanceledOnTouchOutside(true); dialog.show(); }