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預設只會向下彈出顯示,這種情況有個最明顯的缺點就是:彈視窗可能被螢幕截斷,顯示不全,
如下圖所示,我們可以根據螢幕左上角的座標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