PopupWindow弹出窗体

本文详细介绍了PopupWindow与PopupMenu的区别,重点讲解了PopupWindow的使用方法,包括设置窗体大小、显示位置、自定义布局、背景透明及动画效果的实现,提供了实例代码展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PopupWindow与PopupMenu的区别

PopupWindow弹出窗体可以在任意位置弹出窗体,而PopupMenu弹出菜单只能出现在屏幕的最中间

PopupWindow的方法

显示方法显示位置
showAsDropDown(View anchor,int xoff,int yoff)显示在anchor控件的下方
showAtLocation(View parent,int gravity,int x,int y)显示在parent控件的某个位置

自定义窗体

一. 构造方法:public PopupWindow(Context context); ——context上下文

二. 必须设置的三大要素:
1. setWidth():设置宽度
2. setHeight():设置高度
3. setContentView():设置自定义布局

三.显示窗体:
1.显示在某个指定控件的下方:
showAsDropDown(View anchor);
showAsDropDown(View anchor,int xoff,int yoff); ——xoff和yoff都是偏移量
2.指定父控件,显示在父控件的某个位置:
showAtLocation(View parent, int gravity, int x, int y);
gravity可以是Gravity.TOP,Gravity.BOTTOM,Gravity.LEFT,Gravity.RIGHT

一.显示在指定控件下方的窗体

效果如下:
在这里插入图片描述

首先随意写一个自定义弹出窗体的布局xml文件,然后通过java代码去执行弹出窗体的效果,java代码如下:

 imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//              实例化对象
                PopupWindow popupWindow = new PopupWindow(Main2Activity.this);

//              设置属性
                popupWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
                popupWindow.setHeight(400);
                
//              设置自定义弹出窗体的布局
                View view = LayoutInflater.from(Main2Activity.this).inflate(R.layout.layout, null);
                popupWindow.setContentView(view);
                popupWindow.setOutsideTouchable(true);

//              设置点击外部消失
                popupWindow.setFocusable(true);

//              展示
                popupWindow.showAsDropDown(imageView);
           }
  }

二.底部弹出窗体

效果如下:
在这里插入图片描述
首先随意写一个自定义弹出窗体的布局xml文件,然后通过java代码去执行弹出窗体的效果,java代码如下:

 imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//              实例化对象
                PopupWindow popupWindow = new PopupWindow(Main2Activity.this);

//              设置属性
                popupWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
                popupWindow.setHeight(400);
                
//              设置自定义弹出窗体的布局
                View view = LayoutInflater.from(Main2Activity.this).inflate(R.layout.layout, null);
                popupWindow.setContentView(view);
                popupWindow.setOutsideTouchable(true);

//              设置点击外部消失
                popupWindow.setFocusable(true);

//              展示
                popupWindow.showAtLocation(view, Gravity.BOTTOM,0,0);

三.弹出窗体后背景半透明

效果如下:
在这里插入图片描述
代码如下:

		//		获得当前窗体的属性
             	WindowManager.LayoutParams layoutParams = getWindow().getAttributes();
       	//		设置透明度为0.5f,半透明状态
            	layoutParams.alpha=0.5f;
       	//		为窗体设置新属性
                getWindow().setAttributes(layoutParams);
       	//		当窗体消失的时候,恢复透明度
                popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
                    @Override
                    public void onDismiss() {
                        WindowManager.LayoutParams layoutParams = getWindow().getAttributes();
                        layoutParams.alpha=1f;
                        getWindow().setAttributes(layoutParams);
                    }
                });

四.设置动画

首先需要在res资源文件下新建anim文件,效果如下:
在这里插入图片描述
然后将进场动画和退场动画写入xml文件中并设置在values下styles的xml文件中,代码如下:

  1. 首先是进场动画和退场动画的代码:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="1000"
        android:fromYDelta="100%"
        android:toYDelta="0"/>
</set>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="1000"
        android:fromYDelta="0"
        android:toYDelta="100%"/>
</set>
  1. 然后是设置在styles的代码:
<style name="MyStyle">
        <item name="android:windowEnterAnimation">@anim/popup_in</item>
        <item name="android:windowExitAnimation">@anim/popup_out</item>
    </style>
  1. 最后再java代码中设置动画
imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//              实例化对象
                PopupWindow popupWindow = new PopupWindow(Main2Activity.this);

//              设置属性
                popupWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
                popupWindow.setHeight(400);
                
//              设置自定义弹出窗体的布局
                View view = LayoutInflater.from(Main2Activity.this).inflate(R.layout.layout, null);
                popupWindow.setContentView(view);
                popupWindow.setOutsideTouchable(true);

//              获得当前窗体的属性
                WindowManager.LayoutParams layoutParams = getWindow().getAttributes();
                
//              设置透明度为0.5f,半透明状态
                layoutParams.alpha=0.5f;
                
//              为窗体设置新属性
                getWindow().setAttributes(layoutParams);
                
//              当窗体消失的时候,恢复透明度
                popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
                    @Override
                    public void onDismiss() {
                        WindowManager.LayoutParams layoutParams = getWindow().getAttributes();
                        layoutParams.alpha=1f;
                        getWindow().setAttributes(layoutParams);
                    }
                });

//              设置动画
                popupWindow.setAnimationStyle(R.style.MyStyle);
                
//              设置点击外部消失
                popupWindow.setFocusable(true);

//              展示
                popupWindow.showAtLocation(view, Gravity.BOTTOM,0,0);
            }
        });

以上就是我对弹出窗体所掌握的知识与内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值