第1节 Dialog 对话框
1.1 Dialog布局设置
Dialog 常用Style设置
<style name="dialog" parent="@android:style/Theme.Holo.Dialog">
<!-- 是否有边框 -->
<item name="android:windowFrame">@null</item>
<!--是否在悬浮Activity之上 -->
<item name="android:windowIsFloating">true</item>
<!--标题 -->
<item name="android:windowNoTitle">true</item>
<!--阴影 -->
<item name="android:windowIsTranslucent">true</item>
<!--透明背景-->
<item name="android:background">@android:color/transparent</item>
<!--窗口背景透明-->
<item name="android:windowBackground">@android:color/transparent</item>
<!--弹窗背景是否变暗-->
<item name="android:backgroundDimEnabled">false</item>
</style>
补充:
<!-- 是否全屏 -->
<item name="android:windowFullscreen">true</item>
Java代码设置
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置属性
setStyle(DialogFragment.STYLE_NO_FRAME, R.style.dialog);
}
@Override
public void onStart() {
super.onStart();
Window window = getDialog().getWindow();
View decorView = window.getDecorView();
decorView.measure(0,0);
window.setGravity(Gravity.BOTTOM);
//设置动画
window.setWindowAnimations(R.style.dialog_bottom_to_top_style);
WindowManager.LayoutParams params = window.getAttributes();
params.x = 0;
params.y = -20;
params.height = WindowManager.LayoutParams.MATCH_PARENT;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
window.setAttributes(params);
getDialog().setCanceledOnTouchOutside(true);
}
- 重点: window.setDimAmount(0); 去掉dialog外部灰色背景
1.2 动画设置
style
<!--控制dialog进出动画-->
<style name="dialog_animation" parent="android:Animation">
<item name="android:windowEnterAnimation">@anim/dialog_enter</item>
<!-- 进入时的动画 -->
<item name="android:windowExitAnimation">@anim/dialog_exit</item>
<!-- 退出时的动画 -->
</style>
增加动画
dialog.getWindow().setWindowAnimations(R.style.dialog_animation); // 添加动画
第2节 动画xml属性
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="800"
android:fromYDelta="115%"
android:interpolator="@android:interpolator/accelerate_cubic"
android:toYDelta="100%"></translate>
<alpha
android:duration="@android:integer/config_mediumAnimTime"
android:fromAlpha="0.0"
android:toAlpha="1.0" />
</set>
注意: 没有指定,默认是以自己为相对参照物
- fromYDelta 属性为动画起始时 Y坐标上的位置
- toYDelta 属性为动画结束时 Y坐标上的位置
- %和%p: %自己的位置开始, p父层View为参照的
- android:toXDelta=”100%”,表示自身的100%,也就是从View自己的位置开始。
- android:toXDelta=”80%p”,表示父层View的80%,是以它父层View为参照的。
2.1 进入/退出 案例
dialog_enter.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--顶部 进入-->
<!--<translate-->
<!--android:duration="1000"-->
<!--android:fromYDelta="-100%p"-->
<!--android:toYDelta="0%p"-->
<!--/>-->
<!--底部 进入-->
<translate
android:duration="1000"
android:fromYDelta="100%p"
android:toYDelta="0%p"
/>
</set>
dialog_exit.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<!--顶部 退出-->
<!--<translate-->
<!--android:duration="1000"-->
<!--android:fromYDelta="0%p"-->
<!--android:toYDelta="-100%p"-->
<!--/>-->
<!--底部 退出-->
<translate
android:duration="1000"
android:fromYDelta="0%p"
android:toYDelta="100%p"
/>
</set>