Android中PopupWindow自定義坐標實現

jopen 12年前發布 | 82K 次閱讀 Android Android開發 移動開發

Android中PopupWindow位置的確定一般通過showAsDropDown函數來實現,該函數有兩個重載函數,分別定義如下:

    public void showAsDropDown(View anchor) {  
        showAsDropDown(anchor, 0, 0);  
    }  

    public void showAsDropDown(View anchor, int xoff, int yoff) {  
        if (isShowing() || mContentView == null) {  
            return;  
        }  

        registerForScrollChanged(anchor, xoff, yoff);  

        mIsShowing = true;  
        mIsDropdown = true;  

        WindowManager.LayoutParams p = createPopupLayout(anchor.getWindowToken());  
        preparePopup(p);  

        updateAboveAnchor(findDropDownPosition(anchor, p, xoff, yoff));  

        if (mHeightMode < 0) p.height = mLastHeight = mHeightMode;  
        if (mWidthMode < 0) p.width = mLastWidth = mWidthMode;  

        p.windowAnimations = computeAnimationResource();  

        invokePopup(p);  
    }  

也就是說,調用第一 個函數時,x和y坐標偏移量默認是0,此時PopupWindow顯示的結果如下中圖所示。而要實現PopupWindow顯示在wenwen的正下方 時,就需要程序員自己進行坐標偏移量的計算,下右圖所示,當點擊wenwen時,PopupWindow顯示在正下方,這正是我們所需要的,對稱是一種美 啊。


Android中PopupWindow自定義坐標實現 Android中PopupWindow自定義坐標實現 Android中PopupWindow自定義坐標實現


代碼實現的關鍵是點擊wenwen后的響應函數,此處直接上代碼,不廢話了:

    public void onClick(View v) {  
        LayoutInflater mLayoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);  
        ViewGroup menuView = (ViewGroup) mLayoutInflater.inflate(  
                R.layout.tips, null, true);  
        pw = new PopupWindow(menuView, LayoutParams.WRAP_CONTENT,  
                LayoutParams.WRAP_CONTENT, true);    
        // 設置點擊返回鍵使其消失,且不影響背景,此時setOutsideTouchable函數即使設置為false  
        // 點擊PopupWindow 外的屏幕,PopupWindow依然會消失;相反,如果不設置BackgroundDrawable  
        // 則點擊返回鍵PopupWindow不會消失,同時,即時setOutsideTouchable設置為true  
        // 點擊PopupWindow 外的屏幕,PopupWindow依然不會消失  
        pw.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));   
        pw.setOutsideTouchable(false); // 設置是否允許在外點擊使其消失,到底有用沒?  
        pw.setAnimationStyle(R.style.PopupAnimation); // 設置動畫  

        // 計算x軸方向的偏移量,使得PopupWindow在Title的正下方顯示,此處的單位是pixels  
        int xoffInPixels = ScreenTools.getInstance(PopDemoActivity.this).getWidth() / 2 - titleName.getWidth() / 2;  
        // 將pixels轉為dip  
        int xoffInDip = ScreenTools.getInstance(PopDemoActivity.this).px2dip(xoffInPixels);  
        pw.showAsDropDown(titleName, -xoffInDip, 0);  
        //pw.showAsDropDown(titleName);  
        pw.update();  

        TextView tv = (TextView) menuView.findViewById(R.id.tips_ok);  
        tv.setOnClickListener(new View.OnClickListener() {  

            public void onClick(View v) {  
                pw.dismiss();  
            }  

        });  

    }  
轉自:http://blog.csdn.net/ace1985/article/details/7626819

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!