Android dialog的显示位置、弹出效果、返回键控制、外部点击事件控制


       最近总结了一下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





















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值