1. 程式人生 > >Android PopupWindow怎麼合理控制彈出位置

Android PopupWindow怎麼合理控制彈出位置

說到PopupWindow,應該都會有種熟悉的感覺,使用起來也很簡單

複製程式碼
// 一個自定義的佈局,作為顯示的內容
Context context = null;  // 真實環境中要賦值
int layoutId = 0;      // 佈局ID
View contentView = LayoutInflater.from(context).inflate(layoutId, null);
      
final PopupWindow popupWindow = new PopupWindow(contentView,
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 
true); popupWindow.setTouchable(true); // 如果不設定PopupWindow的背景,有些版本就會出現一個問題:無論是點選外部區域還是Back鍵都無法dismiss彈框 // 這裡單獨寫一篇文章來分析 popupWindow.setBackgroundDrawable(new ColorDrawable()); // 設定好引數之後再show popupWindow.showAsDropDown(contentView);
複製程式碼

如果建立PopupWindow的時候沒有指定高寬,那麼showAsDropDown預設只會向下彈出顯示,這種情況有個最明顯的缺點就是:彈視窗可能被螢幕截斷,顯示不全,

所以需要使用到另外一個方法showAtLocation,這個的座標是相對於整個螢幕的,所以需要我們自己計算位置。

如下圖所示,我們可以根據螢幕左上角的座標A螢幕高寬,點選View的左上角的座標C點選View的大小以及PopupWindow佈局的大小計算出PopupWindow的顯示位置B

計算方法原始碼如下:

複製程式碼
    /**
     * 計算出來的位置,y方向就在anchorView的上面和下面對齊顯示,x方向就是與螢幕右邊對齊顯示
     * 如果anchorView的位置有變化,就可以適當自己額外加入偏移來修正
     * @param anchorView  撥出window的view
*
@param contentView window的內容佈局 * @return window顯示的左上角的xOff,yOff座標 */ private static 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 = ScreenUtils.getScreenHeight(anchorView.getContext()); final int screenWidth = ScreenUtils.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); if (isNeedShowUp) { windowPos[0] = screenWidth - windowWidth; windowPos[1] = anchorLoc[1] - windowHeight; } else { windowPos[0] = screenWidth - windowWidth; windowPos[1] = anchorLoc[1] + anchorHeight; } return windowPos; }
複製程式碼

接下來呼叫showAtLoaction顯示:

複製程式碼
View windowContentViewRoot = 我們要設定給PopupWindow進行顯示的View
int
windowPos[] = calculatePopWindowPos(view, windowContentViewRoot); int xOff = 20// 可以自己調整偏移 windowPos[0] -= xOff; popupwindow.showAtLocation(view, Gravity.TOP | Gravity.START, windowPos[0], windowPos[1]);
// windowContentViewRoot是根佈局View
複製程式碼

上面的例子只是提供了一種計算方式,在實際開發中可以根據需求自己計算,比如anchorView在左邊的情況,在中間的情況,可以根據實際需求寫一個彈出位置能夠自適應的PopupWindow。

補充上獲取螢幕高寬的程式碼ScreenUtils.java:

複製程式碼
    /**
     * 獲取螢幕高度(px)
     */
    public static int getScreenHeight(Context context) {
        return context.getResources().getDisplayMetrics().heightPixels;
    }
    /**
     * 獲取螢幕寬度(px)
     */
    public static int getScreenWidth(Context context) {
        return context.getResources().getDisplayMetrics().widthPixels;
    }
複製程式碼

Demo截圖展示:

  

看完覺得有用記得點選推薦支援一下,謝謝

相關推薦

Android PopupWindow怎麼合理控制位置

說到PopupWindow,應該都會有種熟悉的感覺,使用起來也很簡單 // 一個自定義的佈局,作為顯示的內容 Context context = null;  // 真實環境中要賦值 int layoutId = 0;      // 佈局ID View conten

android popupwindow從下,顯示在某控制元件上方

popupwindow彈出時從下往上,隱藏時從上往下,並且顯示在指定控制元件上方View inflate = LayoutInflater.from(getContext()).inflate(R.layout.popupwindow_shop, null);

Android PopupWindow 的方法 & 視窗方法

本人小菜一個。目前只見過兩種彈出框的實現方式,第一種是最常見的PopupWindow,第二種也就是Activity的方式是前幾天才見識過。感覺很霸氣哦。沒想到,activity也可以做偽視窗。  先貼上最常見的方法,主要講activity的方法。  一、彈出PopupWindow  複製程式碼程式碼如下:

Android 7.0 PopupWindow位置的適配問題

近期需求是需要在頁面標題欄中title的下方彈出PopupWindow進而做一些操作,當寫完之後發現在7.0- 手機上彈出的位置是正確的但是執行在7.0系統的手機上時出現了彈出位置將穿進去的控制元件給覆蓋了起來(這是就是7.0popupWindow位置的適配)查了許多資料進

自定義popupwindow相容7.0 (解決位置問題)

import android.os.Build; import android.view.Gravity; import android.view.View; import android.widget.PopupWindow; public class MyPopupWindow ex

Android開發】動畫PopupWindow並使背景變暗

我們在平常的android應用開發過程中,當應用資料太多太繁雜時,通常都會通過分類篩選讓使用者更好的找到自己想要的資訊。因此利用PopupWindow或Dialog讓使用者快速選擇定位是一個很好的選擇。如我們想在美團上查詢附近有什麼電影院時: 點選按鈕彈出

toolbar 設定、顏色、popupwindow位置

借鑑部落格:http://blog.csdn.net/u013971754/article/details/47320097 http://blog.csdn.net/zhyh1986/article/details/51810803等等哈哈 學習了很多大神的部落格,發現開

android開發popupwindow判斷是否

btn_pop.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (

解決Android設備不調試授權提醒

anroid解決Android設備不彈出調試授權提醒1、安裝Android SDK,設置系統環境變量 %ANDRIOD_SDK_HOME%,設置完後檢查:C:\Users\leizm>echo %ANDRIOD_SDK_HOME%G:\adt-bundle-windows-x86-20131030\sd

Mint-ui 中 Popup 作為組件引入,控制框的顯示與隱藏遇到的問題。

cli bubuko 方式 解決 pro 傳遞 顯示與隱藏 gin ott Popup組件的結構: <template> <div> <!--分享彈出窗 begin--> <mt-popup class="sha

Android 多種簡單的框樣式設定

簡介 這是一個基於AlertDialog和Dialog這兩個類封裝的多種彈出框樣式,其中提供各種簡單樣式的彈出框使用說明。同時也可自定義彈出框。 專案地址:https://github.com/Liumce/jjdxm_dialogui 特性 1.使用鏈式開發程式碼簡潔明瞭2.所有的彈出

android 判斷鍵盤是否

需求:在鍵盤彈出時需要相應操作 解決:監聽鍵盤是否彈出,同時還可以獲取到鍵盤的高度 實現: edittext.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListe

android中常用的提示框

首先是一個最簡單的應用,就是彈出一個訊息框,在android中可以這樣實現 view plain copy to clipboard print ? 1 new AlertDialog.Builder

Android中簡單的選單

<resources> <array name="ItemArray"> <item>第一項</item> <item>第二項</item> <item>第

layer位置不在瀏覽器視窗居中的問題的解決方法

問題描述: layer彈窗的彈出位置不在瀏覽器視口居中,而是根據頁面內容居中了,導致頁面內容很長時,看不到彈窗,滾動滾動條才能看到,通常情況下,這並不滿足需求。 解決方法: 使用parent.layer來呼叫彈窗,這樣,彈窗的位置就會相對於上一級的window定位,而不是當前所在的win

android EditText 的鍵盤(不)坑爹

需求:如果想要不彈出鍵盤並且失去游標, 在layout佈局檔案裡,在EditText的父佈局中加上兩個屬性(我是直接載入頂層控制元件上) android:focusable="true" android:focusableInTouchMode="true" 缺點:當你點選 EditTex

QML虛擬鍵盤控制隱藏

import QtQuick 2.0 import QtQuick.Controls 1.3 import QtQuick.Window 2.2 import QtQuick.Controls.Styles 1.2 import "../qml/common" import QtQuick.

Android仿ios底部框效果

準備: public class ActionSheet { public interface OnActionSheetSelected { void onClick(int whichButton); } private ActionShee

Android ListView長按對話方塊

ListView長按彈出對話方塊可以用PopupWindow實現 今天記錄的是重寫onCreateContextMenu和onContextItemSelected實現彈出對話方塊,比前者簡單很多

Android實現從底部Dialog(和PopWindow實現的效果一樣)

上菜,不,上圖:       相信上圖的效果,大家在android 裝置中經常碰到.有時候進行分享操作的時候-----要求從從底部自下而上彈出.上圖中的效果**既可以通過自定義Dialog實現也可以通過自定義PopWindow來實現.**關於popWindow