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();
}