百变的PopupWindow

相信很多初学者把Toast、Dialog、menu用的是溜溜的,但有些时候想要华丽,炫酷的显示这些小控件时,感觉就有些麻烦了。积极主义者:麻烦就麻烦吧,自己定义;另一种:这原生的不是挺好的吗,用起来很方便。
其实只要你认识了PopupWindow,你马上就会被他征服,从此迷上了他,功能太强了,哪里都用得到,上手简单。下面就让我们使用PopupWindow定义初自己的炫酷,多彩的小控件吧!

1.使用PopupWindow自定义menu
    特点:神出鬼没,想在哪里显示就在哪里显示,想要什么样式就什么样式。

首先把他的样式定下来,自己写个布局menu_popupmenu_change.xml。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/popuple_window">
<LinearLayout
    android:layout_width="140dp"
    android:layout_height="130dp"
    android:orientation="vertical"
    android:gravity="center">

    <TextView
        android:id="@+id/math"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="数学"
        android:layout_marginTop="15dp"
        android:layout_gravity="center_horizontal"
        android:textSize="15sp"
        android:textColor="#3391e8"/>
    <TextView
        android:id="@+id/physics"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="物理"
        android:layout_marginTop="20dp"
        android:textSize="15sp"
        android:textColor="#3391e8"/>
    <TextView
        android:id="@+id/chemistry"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="化学"
        android:layout_marginTop="20dp"
        android:layout_gravity="center_horizontal"
        android:textSize="15sp"
        android:textColor="#3391e8"/>
    </LinearLayout>
然后就可以把布局添加到PopupWindow,在你要显示的地方写如下
View view = LayoutInflater.from(this).inflate(R.layout.menu_popupmenu_window,null);
        TextView normal= (TextView) view.findViewById(R.id.math);
        TextView plant= (TextView) view.findViewById(R.id.physics);
         TextView frame= (TextView)
         view.findViewById(R.id.chemistry);
        normal.setOnClickListener(this);
        plant.setOnClickListener(this);
        frame.setOnClickListener(this);
popupWindow=new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT, true);
popupWindow.setBackgroundDrawable(new ColorDrawable(Color.WHITE));
popupWindow.showAtLocation(view, Gravity.CENTER,0,0);
    可以看到我们只要把布局加载到view中,在创建PopupWindow,直接把view给他,这样就OK了,当然要显示的话,还要再加上showAtLocation()这个方法,第一个参数表示他相对哪个父控件,第二个参数表示在父控件的什么位置显示(我是显示在居中,其他的大家也都懂了),第三和第四个参数表示X、Y方向偏移,可以为负,方向与手机相对坐标相同(左上(0,0));这样就可以在手机的中间显示出一个menu样式的弹窗了。
    注意:一定要加上setBackgroundDrawable(),不然这个弹窗就不会消失了,即使是按下Back键。

2.让他显示在指定控件的附近
特点:同上
首先还是自定义布局样式,代码就不贴了最后看效果图(样式就是让大家自己定义,没必要贴出来,而且我也是简单定义的,很丑,看看就好)
然后在你要显示的位置写上如下代码

View view = LayoutInflater.from(this).inflate(R.layout.menu_popupmenu_change,null);
        TextView normal= (TextView) view.findViewById(R.id.math);
        TextView plant= (TextView) view.findViewById(R.id.physics);
        TextView frame= (TextView) view.findViewById(R.id.chemistry);
        normal.setOnClickListener(this);
        plant.setOnClickListener(this);
        frame.setOnClickListener(this);
        popupWindow=new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT, true);
        popupWindow.setBackgroundDrawable(new ColorDrawable(Color.WHITE));
        popupWindow.showAsDropDown(bt2,0,30);
    可以看到基本和上面一样一样的,就是在显示方法上不一样了用的是showAsDropDown();意思大家也都懂了,就是在指定控件的下方;当然通过改变第二和第三个参数,就可以在上下左右任意位置显示了。注意点也和上面一样别忘了setBackgroundDrawable();

3.PopupWindow的方法介绍
构造方法:
1. public PopupWindow(View contentView, int width, int height, boolean focusable)
2. public PopupWindow (Context context)
常用第一个构造方法啦,直接可以指定大小;
当然你要用第二种方法也可但是必须要设置宽高setWidth(LayoutParams.WRAP_CONTENT);
setHeight(LayoutParams.WRAP_CONTENT);

显示方法:
1. showAsDropDown(View anchor):相对某个控件正左下方
2. showAsDropDown(View anchor, int xoff, int yoff):相对某个控件,可设置偏移
3. showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可设置偏移

焦点设置:
setFocusable(true);
这个如果设置成false ,PopupWindow就只是显示出来,没有响应事件。默认的是true;

设置动画:setAnimationStyle(R.style.xxxx);

点击空白消失:setOutsideTouchable(true),这个貌似没用,只要设置setBackgroundDrawable()就OK了;当然要点击到PopupWindow后消失,还要配合dismiss()才会消失;

4.介绍这么多,应该可以帮助大家解决大部分问题的。当然了PopupWindow的功能远远不止这些,这就要看大家的脑洞有多大了,就像我上篇定滑动删除时,就用的PopupWindow。当然他还有个兄弟PopupMenu有兴趣的可以看下,功能没有PopupWindow强大,不然也对不起“百变星君”的称号。

看下效果图:本来不想贴的,样式太丑。没办法,你知道有种病叫:自恋综合症。
效果图

大家如果有什么疑问的可以留言,一起探讨学习啊,共同进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值