android弹窗使用总结,高仿QQ空间操作弹窗

来源:互联网 发布:模糊算法的c语言实现 编辑:程序博客网 时间:2024/06/10 23:28

android弹窗一共有两种方式,一种是dialog及其子类,另一种是popupwindow;Dialog及其子类尤其AlertDialog是最常用的,也是最自由的一种。

**Popupwindow与Dialog的区别:**AlertDialog是非阻塞线程的,AlertDialog弹出的时候,后台可是还可以做其他事情的哦。
而PopupWindow是阻塞线程的, 这就意味着在我们退出这个弹出框之前,程序会一直等待。

PopupWindow的位置按照有无偏移分,可以分为偏移和无偏移两种;按照参照物的不同,可以分为相对于某个控件(Anchor锚)和相对于父控件。具体如下
showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移
showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移
showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移。其实Popupwindow是自己提供了偏移的设置,但使用AlertDialog获取window对其进行相关设置也能达到弹窗位置随意显示的效果,接下来的高仿QQ空间弹窗就是使用AlertDialog实现任意位置显示弹窗效果的。

——————————————–分割线————————————————–

接下来就要讲高仿QQ空间弹窗的实现
PS:有人喜欢继承Dialog自定义Dialog,但我还是喜欢子在用的到的地方自己写,除非这个dialog会被用多次.
现在讲一下高仿QQ空间弹窗的需求,QQ空间每天说说的右上角会有一个小三角,点击会弹出一个弹窗,同时弹窗会随着Listview中item的小三角的位置变化。不清楚的话用手Q体验一下就好了。

核心代码:

@SuppressLint("NewApi")public void showDialog(View v) {    int[] coo = new int[2];// 获取小三角view位置,用来设置dialog的显示位置    v.getLocationInWindow(coo);    /* 先实例化dialog并进行相关设置 */    final AlertDialog dialog = new AlertDialog.Builder(MainActivity.this)            .create();    dialog.show();    dialog.setCanceledOnTouchOutside(true);    LinearLayout ll = (LinearLayout) getLayoutInflater().inflate(            R.layout.dialog_content, null);    dialog.setContentView(ll);    /*//计算dialog显示的view的高度    ll.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),             MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));    int ch = ll.getMeasuredHeight();*/    /* 获取window并进行相关设置 */    Window window = dialog.getWindow();    if (coo[1] > sh * 0.65) {//sh指屏幕高度,sw指屏幕宽度,但小三角的位置超过屏幕的65%时,弹窗就变为在小三角上面显示        window.setWindowAnimations(R.style.mydialog2); // 添加动画        coo[1] -= sh*0.2;//y轴减去sh*0.2是因为dialog的高度为sh*0.2    } else {        window.setWindowAnimations(R.style.mydialog); // 添加动画    }    window.setGravity(Gravity.TOP);/*一定要设置为TOP,因为lp中的设置的x,y都是基于这个位置的    ,如果为TOP,lp设置的y为0时,就在最上面显示,如果为CENTER,y为0时,dialog就在中间显示*/    /* window的宽高,为window的一部分 */    WindowManager.LayoutParams lp = window.getAttributes();    lp.width = (int) (sw * 0.8);    lp.height = (int) (sh * 0.2);    lp.y = coo[1];    window.setAttributes(lp);}

上面是核心代码,全部代码下载链接:http://download.csdn.net/detail/u013592964/9606680
效果图:这里写图片描述
PS:没有美工,界面丑了点

0 0
原创粉丝点击