最近总结了一下dialog相关的细节,一些用的比较多的功能感觉应该也分享一下。网上很多例子都是转载的,搜来搜去也只是那几篇,尤其是关于dialog动画效果的,重复率更 高。废话不多说,下面依次说下今天的重点。
1、关于显示位置
根据需求不一样,有的dialog需要某个组件的下方或下方弹出,具体实施的时候,要巧用ManagerParams中的gravity设置,其中如果分别是上、下、左、右,就依次用 Gravity.top,Gravity.bottom,Gravity.left,Gravity.Right。还有一个细节需要注意下,就是getWindow()时的上下文,比如以下代码示例中是CustomDialog;下面获取statusBar高度则是 以当前的Activity作为上下文
Window window = CustomDialog.this.getWindow();
LayoutParams params = window.getAttributes();
params.gravity = Gravity.TOP;
因为本例是以top作为测试,故需要这是y坐标的起始位置
Rect outRect = new Rect();
MainActivity.this.getWindow().getDecorView()
.getWindowVisibleDisplayFrame(outRect);
int statusHeight = outRect.top;
// dialog显示的起始位置也是从(屏幕除去状态栏高度)左上角开始计算
params.y = btn.getHeight() + location[1] - statusHeight;
最后把属性设置
window.setAttributes(params);
2、关于弹出动画效果
网上比较多的是给整个window设置动画
window.setWindowAnimations(resId);这样写的最明显的问题就是直接从最上层弹出而不是某个组件的下方或上方;更改思路是 对dialog的容器(RelativeLayout)设置动 画
进入动画
mAnimationFront = AnimationUtils.loadAnimation(MainActivity.this,
R.anim.dialog_enter_top);
mAnimationFront.setDuration(1000);
退出动画
mAnimationExit = AnimationUtils.loadAnimation(MainActivity.this,
R.anim.dialog_exit_top);
mAnimationExit.setDuration(1000);
layout.startAnimation(mAnimationFront);
3、关于返回键控制和外部点击事件
// 设置外部标志
Window window = CustomDialog.this.getWindow();
window.setFlags(LayoutParams.FLAG_NOT_TOUCH_MODAL,
LayoutParams.FLAG_NOT_TOUCH_MODAL);
window.setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
// 必须写,否则仍然监控不到返回键的操作
setCancelable(false);
// 必须写上该方法才能监测back事件
dialog.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialo, int keyCode,
KeyEvent event) {
// TODO Auto-generated method stub
if (keyCode == KeyEvent.KEYCODE_BACK
&& event.getRepeatCount() == 0 && isShowing) {
dialog.layout.performClick();
isShowing = false;
// dialog.dismiss();
}
return false;
}
});
源码地址 http://download.csdn.net/download/zhangyaobin_1989/8690359