PopUpWindow 的使用笔记

PopUpWindow 的使用笔记,第1张

概述最接做需求的时候,碰到了 PopUpWindow,但是也没做过多了解,就是照搬别人的代码改改逻辑。后面视觉看了之后,说让我加一些动画效果,使用起来更加舒服。可是我看别人以前也没有写,于是就开始捣鼓 P

最接做需求的时候,碰到了 PopUpWindow,但是也没做过多了解,就是照搬别人的代码改改逻辑。后面视觉看了之后,说让我加一些动画效果,使用起来更加舒服。可是我看别人以前也没有写,于是就开始捣鼓 PopUpWindow。同时也写一篇文章记录下,后续忘了也可以查看。

 

相关方法解读1)几个常用的构造方法

我们在文档中可以看到,提供给我们的PopupWindow的构造方法有九种之多,这里只贴实际 开发中用得较多的几个构造方法:

public PopupWindow (Context context)

public PopupWindow(VIEw contentVIEw,int wIDth,int height)

public PopupWindow(VIEw contentVIEw)

public PopupWindow(VIEw contentVIEw,int height,boolean focusable)

参数就不用多解释了吧,contentVIEw是PopupWindow显示的VIEw,focusable是否显示焦点

2)常用的一些方法

下面介绍几个用得较多的一些方法,其他的可自行查阅文档:

setContentVIEw(VIEw contentVIEw):设置PopupWindow显示的VIEw

getContentVIEw():获得PopupWindow显示的VIEw

showAsDropDown(VIEw anchor):相对某个控件的位置(正左下方),无偏移

showAsDropDown(VIEw anchor,int xoff,int yoff):相对某个控件的位置,有偏移

showAtLocation(VIEw parent,int gravity,int x,int y): 相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BottOM等),可以设置偏移或无偏移 PS:parent这个参数只要是activity中的vIEw就可以了!

setWIDth/setHeight:设置宽高,也可以在构造方法那里指定好宽高, 除了可以写具体的值,还可以用WRAP_CONTENT或MATCH_PARENT, popupWindow的wIDth和height属性直接和第一层VIEw相对应。

setFocusable(true):设置焦点,PopupWindowd出后,所有的触屏和物理按键都由Popupwindows 处理。其他任何事件的响应都必须发生在PopupWindow消失之后,(home 等系统层面的事件除外)。 比如这样一个PopupWindow出现的时候,按back键首先是让PopupWindow消失,第二次按才是退出 activity,准确的说是想退出activity你得首先让PopupWindow消失,因为不并是任何情况下按back PopupWindow都会消失,必须在PopupWindow设置了背景的情况下 。

setAnimationStyle(int):设置动画效果

创建布局

PopUpWindow 就是一个容器,是需要编写对应的布局文件,布局比较简单具体如下:

<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"    androID:layout_wIDth="match_parent"    androID:layout_height    androID:clipChildren="false"    androID:orIEntation="vertical">    VIEw        androID:ID="@+ID/empty_vIEw"        androID:layout_wIDth        androID:layout_height="100dp"        androID:layout_weight="1"        />    linearLayout        ="@+ID/container"="200dp"        androID:background="@color/colorPrimary"        androID:orIEntation="vertical"        androID:gravity="center_vertical">        TextVIEw            ="@+ID/Title"            androID:layout_wIDth            androID:layout_height="60dp"            androID:text="test" />            </linearLayout>>

注意其中这行代码:

androID:layout_weight="1"

由于其他 vIEw 没有使用这个属性,默认为0,使用该属性的vIEw将剩余的空间铺满。这样就相当于为我们设置了一个蒙层了。

写好布局后,需要将布局文件传到容器中去。

 

PopUpWindow 使用

由于相关代码比较长,直接附上完整代码,方便大家查看。

完整代码如下:

public class TestActivity extends AppCompatActivity implements VIEw.OnClickListener {    private PopupWindow mPopupWindow;     VIEwGroup mContentVIEw;     button mBtn;    @OverrIDe    protected voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentVIEw(R.layout.activity_test);        mBtn = (button) findVIEwByID(R.ID.result);        mPopupWindow = new PopupWindow(this);        mPopupWindow.setContentVIEw(getContentVIEw());        mPopupWindow.setHeight(VIEwGroup.LayoutParams.MATCH_PARENT);        mPopupWindow.setWIDth(VIEwGroup.LayoutParams.MATCH_PARENT);        mPopupWindow.setClipPingEnabled(false);        // 如果不设置PopupWindow的背景,有些版本就会出现一个问题:无论是点击外部区域还是Back键都无法dismissd框        mPopupWindow.setBackgroundDrawable(new colorDrawable(getResources().getcolor(R.color                .empty_vIEw_background)));        mPopupWindow.setoutsIDetouchable(true);        mPopupWindow.setFocusable();        mPopupWindow.update();        mBtn.setonClickListener();    }    /**     * popup window vIEw 初始化     *     * @return VIEw     */     VIEw getContentVIEw(Context ctx) {        mContentVIEw = (VIEwGroup) LayoutInflater.from(ctx)                .inflate(R.layout.popup,null);        VIEw emptyVIEwAbovePanel = mContentVIEw.findVIEwByID(R.ID.empty_vIEw);        emptyVIEwAbovePanel.setonClickListener(return mContentVIEw;    }    @OverrIDe     onClick(VIEw v) {        int i = v.getID();        if (i == R.ID.empty_vIEw) {            Animation animation = AnimationUtils.loadAnimation(,R.anim.pop_gone);            mContentVIEw.startAnimation(animation);            animation.setAnimationListener( Animation.AnimationListener() {                @OverrIDe                 onAnimationStart(Animation animation) {                }                @OverrIDe                 onAnimationEnd(Animation animation) {                    mPopupWindow.dismiss();                }                @OverrIDe                 onAnimationRepeat(Animation animation) {                }            });        } else  R.ID.result) {            mContentVIEw.startAnimation(AnimationUtils.loadAnimation();        }    }}

 上面的代码设置了蒙层,出场入场的动画效果。

 

动画设置

出场动画文件xml:

set ="http://schemas.androID.com/apk/res/androID"translate        androID:duration="400"        androID:fromXDelta="0"        androID:fromYDelta        androID:toXDelta        androID:toYDelta="100%" />set>

进场动画文件xml:

="100%"="0" >

 为什么出场动画不用 PopUpWindow 默认动画设置呢。这是因为视觉只希望下面蓝色部分有动画效果,蒙层不需要这个动画效果。因此我们就必须添加额外的处理逻辑。如果采用默认的动画设置效果,将会使得蒙层也有动画效果。

在资源文件的values的style.xml中添加如下代码

style name="pop_animation" parent="androID:Animation"item ="androID:windowEnteranimation">@anim/pop_initem="androID:windowExitAnimation">@anim/pop_gonestyle>

androID:windowEnteranimation:为窗体进入时执行;
androID:windowExitAnimation:为窗体退出时执行;

将其使用到PopupWindow中:

mPopupWindow.setAnimationStyle(R.style.pop_animation);mPopupWindow.showAtLocation(vIEw,Gravity.CENTER,0,0);

setAnimationStyle() 即是为 PopupWindow 添加动画的方法,由于 PopupWindow 不能像其他的 VIEw 一样使用 ObjectAnimator,所以使用动画需要在 style 中定义,并且使用 PopupWindow 的 setAnimationStyle() 方法。这样的话就可以使用。

 

蒙层的处理

除了上面的我的蒙层方法,还有其他添加蒙层的方法:

1)添加一层vIEw
private  addMaskVIEw(IBinder token) {    WindowManager.LayoutParams p =  WindowManager.LayoutParams();    p.wIDth = WindowManager.LayoutParams.MATCH_PARENT;    p.height = WindowManager.LayoutParams.MATCH_PARENT;    p.format = PixelFormat.TRANSLUCENT;    p.type = WindowManager.LayoutParams.TYPE_APPliCATION_PANEL;    p.token = token;    p.windowAnimations = androID.R.style.Animation_Toast;    maskVIEw =  VIEw(context);    maskVIEw.setBackgroundcolor(0x7f000000);    maskVIEw.setFitsSystemwindows();    maskVIEw.setonKeyListener( OnKeyListener() {        @OverrIDe        boolean onKey(VIEw v,int keyCode,KeyEvent event) {            if (keyCode == KeyEvent.KEYCODE_BACK) {                removeMaskVIEw();                return ;            }            ;        }    });    wm.addVIEw(maskVIEw,p);}

然后在消失的时候进行移除:

 dismiss() {    if (maskVIEw != ) {        wm.removeVIEwImmediate(maskVIEw);        maskVIEw = ;    }    .dismiss();}
2) 透明度

还有人是直接使用透明度来实现的。

voID bgAlpha(float Alpha) {    WindowManager.LayoutParams lp = ((Activity)context).getwindow().getAttributes();    lp.Alpha = Alpha; 0.0-1.0    ((Activity)context).getwindow().setAttributes(lp);}

 

总结

以上是内存溢出为你收集整理的PopUpWindow 的使用笔记全部内容,希望文章能够帮你解决PopUpWindow 的使用笔记所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1121315.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存