Android PopupWindow弹窗动态显示在View的上下方,

序、周末不加班,

效果图如下。

我们要弹出的PopupWindow在View的下方,如果下方区域不够,则弹出在上方。

实现方案思路

我们在显示的时候,首先去计算一下弹窗高度。使用屏幕的高 - popupwind的高并且和popup的高做对比,如果大于的话,则显示在下方,如果小于的话,则显示在上方。

java 复制代码
 /**
     *
     * @param anchorView 锚点View
     * @param contentView 弹出的View
     * @return
     */
    private int[] calculatePopWindowPos(final View anchorView, final View contentView) {
        final int[] windowPos = new int[2];
        final int[] anchorLoc = new int[2];
        // 获取锚点View在屏幕上的左上角坐标位置
        anchorView.getLocationOnScreen(anchorLoc);
        final int anchorHeight = anchorView.getHeight();
        // 获取屏幕的高宽
        final int screenHeight = getScreenHeight(anchorView.getContext());
        final int screenWidth = getScreenWidth(anchorView.getContext());
        contentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
        // 计算contentView的高宽
        final int windowHeight = contentView.getMeasuredHeight();
        final int windowWidth = contentView.getMeasuredWidth();
        // 判断需要向上弹出还是向下弹出显示
        final boolean isNeedShowUp = (screenHeight - anchorLoc[1] - anchorHeight < windowHeight);
        Log.i("AAAA", "screenWidth = "+screenWidth+"---"+"windowWidth="+windowWidth);
        if (isNeedShowUp) {
            windowPos[0] = (screenWidth - windowWidth)/2;
            windowPos[1] = anchorLoc[1] - windowHeight;
        } else {
            windowPos[0] = (screenWidth - windowWidth)/2;
            windowPos[1] = anchorLoc[1] + anchorHeight;
        }
        return windowPos;
    }

显示popupwindow如下

java 复制代码
 Button btn1 = findViewById(R.id.btn1);
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                View contentView = LayoutInflater.from(ListActivity.this).inflate(R.layout.layout_window, null);
                PopupWindow popupWindow = new PopupWindow(contentView,ViewGroup.LayoutParams.WRAP_CONTENT , ViewGroup.LayoutParams.WRAP_CONTENT);
                // 设置PopupWindow可以获得焦点,否则无法响应点击事件
                popupWindow.setFocusable(true);
//                popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

                int[] windowPos = calculatePopWindowPos(view, contentView);
                // 3. 显示PopupWindow
           
                popupWindow.showAtLocation(view,Gravity.TOP|Gravity.START, windowPos[0], windowPos[1]);
            }
        });

完毕。

相关推荐
恋猫de小郭2 小时前
Meta 宣布加入 Kotlin 基金会,将为 Kotlin 和 Android 生态提供全新支持
android·开发语言·ios·kotlin
aqi002 小时前
FFmpeg开发笔记(七十七)Android的开源音视频剪辑框架RxFFmpeg
android·ffmpeg·音视频·流媒体
androidwork4 小时前
深入解析内存抖动:定位与修复实战(Kotlin版)
android·kotlin
梦天20154 小时前
android核心技术摘要
android
szhangbiao6 小时前
“开发板”类APP如果做屏幕适配
android
高林雨露7 小时前
RecyclerView中跳转到最后一条item并确保它在可视区域内显示
android
移动开发者1号9 小时前
ReLinker优化So库加载指南
android·kotlin
山野万里__10 小时前
C++与Java内存共享技术:跨平台与跨语言实现指南
android·java·c++·笔记
Huckings10 小时前
Android 性能问题
android
移动开发者1号10 小时前
剖析 Systrace:定位 UI 线程阻塞的终极指南
android·kotlin