1. 程式人生 > >Android:PopWindow — 對Android的底部彈窗、頂部彈窗選單及自定義介面的使用封裝

Android:PopWindow — 對Android的底部彈窗、頂部彈窗選單及自定義介面的使用封裝

PopWindow

對Android的底部彈窗,頂部彈窗選單及自定義介面的使用封裝。

 

一,介紹

主要是用於在彈窗中顯示一些有限的選單項,也支援新增自定義View,有如下3中彈出方式:
    1、底部彈出,主要參考預設風格是參考IOS的UIAlertController,可以新增自定義View;
    2、底部彈出,從頂部向下彈出的效果,同時支援控制按鈕執行動畫,預設是旋轉動畫;
    3、螢幕中間彈出

二,核心類PopWindow

PopWindow採用Build模式,可以像AlertDialog一樣方便的使用,通過PopWindowStyle控制彈窗的顯示方式:

public enum PopWindowStyle {
    PopUp, PopDown, PopAlert
}

控制不同的彈窗的主要類是:PopUpWindow、PopDownWindow、PopAlertDialog

三,使用方法

第一種

PopWindow popWindow = new PopWindow.Builder(this)
            .setStyle(PopWindow.PopWindowStyle.PopUp)
            .setTitle("注意")
            .setMessage("今天天氣不錯")
            .addItemAction(new PopItemAction("選項1"))
            .addItemAction(new PopItemAction("選項2", PopItemAction.PopItemStyle.Normal))
            .addItemAction(new PopItemAction("選項3", PopItemAction.PopItemStyle.Normal, new PopItemAction.OnClickListener() {
                @Override
                public void onClick() {
                    Toast.makeText(MainActivity.this, "選項3", Toast.LENGTH_SHORT).show();
                }
            }))
            .addItemAction(new PopItemAction("確定", PopItemAction.PopItemStyle.Warning, new PopItemAction.OnClickListener() {
                @Override
                public void onClick() {
                    Toast.makeText(MainActivity.this, "確定", Toast.LENGTH_SHORT).show();
                }
            }))
            .addItemAction(new PopItemAction("取消", PopItemAction.PopItemStyle.Cancel))
            .create();
    popWindow.show();

效果圖: 

第二種

View customView = View.inflate(this, R.layout.layout_test, null);
    new PopWindow.Builder(this)
            .setStyle(PopWindow.PopWindowStyle.PopDown)
            .setIsShowCircleBackground(false)
            .addItemAction(new PopItemAction("選項1"))
            .addContentView(customView)
            .addItemAction(new PopItemAction("選項2"))
            .addItemAction(new PopItemAction("取消", PopItemAction.PopItemStyle.Cancel, new PopItemAction.OnClickListener() {
                @Override
                public void onClick() {
                    Toast.makeText(MainActivity.this, "取消", Toast.LENGTH_SHORT).show();
                }
            }))
            .setPopWindowMargins(dip2px(10), dip2px(0), dip2px(10), dip2px(0))
            .setControlViewAnim(mArrowIv, R.anim.btn_rotate_anim_1, R.anim.btn_rotate_anim_2, true)
            .show(view);

效果圖: 

更多效果請看程式碼

四,使用封裝

在demo中有個PopWindowController類,是對一些特殊的使用進行了再次封裝,大家可以根據自己的實際使用情況進行封裝。

public class PopWindowController {

public static PopWindow showPopDownList(Activity activity, BaseAdapter adapter, View controlView, View rotateView,
                                        int[] margins, AdapterView.OnItemClickListener listener) {
    return showPopDownList(activity, adapter, controlView, rotateView, true, margins, listener);
}

public static PopWindow showPopDownList(Activity activity, BaseAdapter adapter, View controlView, View rotateView,
                                        boolean rotateViewAnim, int[] margins, AdapterView.OnItemClickListener listener) {
    Animation openAnim = AnimationUtils.loadAnimation(activity, R.anim.btn_rotate_anim_1);
    Animation closeAnim = AnimationUtils.loadAnimation(activity, R.anim.btn_rotate_anim_2);
    return showPopDownList(activity, adapter, controlView, rotateView, openAnim, closeAnim, rotateViewAnim, margins, listener);
}

public static PopWindow showPopDownList(Activity activity, BaseAdapter adapter, View controlView, View rotateView, int openAnimId,
                                        int closeAnimId, boolean rotateViewAnim, int[] margins,
                                        AdapterView.OnItemClickListener listener) {
    Animation openAnim = AnimationUtils.loadAnimation(activity, openAnimId);
    Animation closeAnim = AnimationUtils.loadAnimation(activity, closeAnimId);
    return showPopDownList(activity, adapter, controlView, rotateView, openAnim, closeAnim, rotateViewAnim, margins, listener);
}

/**
 * 以ListView方式向下彈出框
 *
 * @param activity
 * @param adapter
 * @param controlView    操作顯示出彈框的按鈕
 * @param rotateView     要旋轉的按鈕
 * @param openAnim       旋轉按鈕開啟動畫
 * @param closeAnim      旋轉按鈕關閉動畫
 * @param rotateViewAnim 是否顯示旋轉動畫
 * @param margins        margins[0]:leftMargin、margins[1]:topMargin、margins[2]:rightMargin、margins[3]:bottomMargin
 * @param listener
 * @return
 */
public static PopWindow showPopDownList(Activity activity, final BaseAdapter adapter, View controlView, View rotateView,
                                        Animation openAnim, Animation closeAnim, boolean rotateViewAnim, int[] margins,
                                        AdapterView.OnItemClickListener listener) {
    final ListView listView = new ListView(activity);
    listView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
    listView.setDivider(null);
    listView.setOnItemClickListener(listener);
    listView.setAdapter(adapter);

    int leftMargin = 0, topMargin = 0, rightMargin = 0, bottomMargin = 0;
    if (margins != null) {
        for (int i = 0; i < margins.length; i++) {
            if (i == 0) {
                leftMargin = margins[i];
            } else if (i == 1) {
                topMargin = margins[i];
            } else if (i == 2) {
                rightMargin = margins[i];
            } else if (i == 3) {
                bottomMargin = margins[i];
            }
        }
    }

    PopWindow popWindow = new PopWindow.Builder(activity)
            .setStyle(PopWindow.PopWindowStyle.PopDown)
            .setView(listView)
            .setControlViewAnim(rotateView, openAnim, closeAnim, rotateViewAnim)
            .setPopWindowMargins(leftMargin, topMargin, rightMargin, bottomMargin)
            .create();
    popWindow.show(controlView);
    return popWindow;
}

}

相關推薦

AndroidPopWindowAndroid底部頂部選單定義介面的使用封裝

PopWindow 對Android的底部彈窗,頂部彈窗選單及自定義介面的使用封裝。   一,介紹 主要是用於在彈窗中顯示一些有限的選單項,也支援新增自定義View,有如下3中彈出方式: 1、底部彈出,主要參考預設風格是參考IOS的UIAlertContro

Android Studio 必備技巧TODO 用法定義 TODO

在開始之前,我們先來看看開發過程中常會碰到的一些問題: 這塊程式碼好幾次用到了,應該抽出去; 這個演算法可以換個更高效的寫法; 這段邏輯繞來繞去,其實可以換個思路。 …… 相信許多人都遇到過這些情況,那麼,此時我們該怎麼做呢? 呵,這還用問?

Android實際運用Zxing整合二維碼掃描 定義掃碼介面(demo原始碼)

二維碼掃描,各大主流App必不可少的功能,而且google已將輪子替我們造好,直接拿來使用即可。以下是教學如何將Zxing開源庫整合到自己專案中,並且自定義掃碼介面,後期可根據自己的業務需求進行修改,最後補充了一點由此延伸的學習技能點。 一. 整合Zing

AndroidToast,android studio提供的一種很好的提醒方式

Toast:android studio提供的一種非常好的提醒方式,即提示資訊,以短小資訊的形式通知給使用者,在一段時間之後會自動消失。 下面我們通過一個示例進行解釋它的用法 示例:設定一個按鈕,點選按鈕的時候顯示提示資訊。 步驟: 第一步:在layout的檔案中加入

Android 定義介面出框(可輸入資料)

    上午寫了一篇博文,介紹瞭如何定義從螢幕底部彈出PopupWindow,寫完之後,突然想起之前寫過自定義內容顯示的彈出框,就隨手寫了兩個例項,分享出來: 第一種實現方式:繼承Dialog  1.1 線定義彈出框要顯示的內容:create_user_dialog.xm

android開發】使用PopupWindow實現頁面點選頂部出下拉選單

沒有太多花樣,也沒有很複雜的技術,就是簡單的PopupWindow的使用,可以實現點選彈出一個自定義的view,view裡可以隨便設計,常用的可以放一個listview。 demo中我只是一個點選展示,簡單的使用了fade in out的動畫效果,也沒有精美的圖片資源,

Android進階十二最簡單的方式實現定義陰影效果

clas new round war port scale dimens tro hdr 網話說UI設計有三寶 :透明,陰影,加圓角。很多UI在做設計的時候都喜歡做卡片形式,然後添加陰影。卡片UI確實挺好看,但是對Android開發者來說,顯示陰影卻並不那麽手到擒來,因為A

python之旅面向象之多態多態性

進一步 外觀 call() 使用實例 是我 tex methods 綁定 操作 一 多態 多態指的是一類事物有多種形態 eg:動物有多種形態:貓,狗,豬 class Animal: #動物類 def eat(self): #吃

Android圖片載入框架最全解析(六),探究Glide的定義模組功能(筆記)

參考原文:Android圖片載入框架最全解析(六),探究Glide的自定義模組功能 自定義模組的基本用法 自定義模組功能可以將更改Glide配置,替換Glide元件等操作獨立出來,使得我們能輕鬆地對Glide的各種配置進行自定義,並且又和Glide的圖片載入邏輯沒有任何交集,

ChainDesk:鏈碼如何使用實現鏈碼的安裝例項化呼叫

  作者:ChainDesk韓小東,ChainDesk區塊鏈行業分析師, ChainDesk區塊鏈工程師 目標 1、鏈碼的安裝及例項化 2、呼叫鏈碼實現交易處理   任務實現 我們對鏈碼已經有了一個基礎的認識,下面我們利用 fa

Android 高仿 QQ5.0 側滑選單效果 定義控制元件來襲

上一篇部落格帶大家實現了:Android 自定義控制元件打造史上最簡單的側滑選單 ,有兄弟看了以後說,你這滑動選單過時了呀~QQ5.0的效果還不錯~~嗯,的確,上一篇也承諾過,稍微修改上一篇的程式碼,實現QQ5.0側滑選單~~好了,下面就開始為大家展示寫一個類QQ的側滑有多e

Android新增使用者組定義App許可權

Android:4.4.4 一、應用場景 在Android裝置上,現在我們外接了一個USB轉串列埠的裝置,裝置節點是/dev/ttyUSB0: # ls -l /dev/ttyUSB0 crw-rw---- 1 root root 188, 0 /dev/ttyUSB0 資

Android ListView 下拉重新整理,上拉載入更多,帶動畫 定義控制元件

之前每次 專案中用到ListView 的 下拉重新整理 以及上拉分頁載入 都是 用的 網上 下載 的 類庫, 使用起來 諸多不便 ,於是 趁著有空 ,自己封裝了ListView 讓其 實現 下拉重新整理,以及分頁載入功能。 以下是 效果圖: 當 滑動到 ListView 頂

Android-如何給View新增邊框,邊框顏色和線的粗細可以定義

一、使用場景 有時在開發中,遇到向表格形式的佈局,這時該怎麼辦? 如果只是簡單的一條橫線或者豎線,直接使用TextView控制元件,寬或者高固定1dp或者2dp,高或者寬match parent,在定義一個background="#FF0000",這樣就實現了單一的線條功能

Android ProgressBar分析定義ProgressBar

轉:http://www.cnblogs.com/glimpse/p/5273046.html rogressBar是在執行耗時操作時的一種人性化設計。分為兩種形式:轉圈的,能顯示進度的。 而能取決於是什麼樣式的PregressBar,當然就是PregressBar的

android 系統帶主題樣式定義主題樣式

From: http://blog.csdn.net/dawanganban/article/details/17732701 http://www.cnblogs.com/bluestorm/archive/2012/07/12/2588724.html

Android 主題定義視窗

用主題自定義視窗屬性 使用Android系統主題: R.styles.xml中包含了系統的一些主題; 我們常見的系統主題有: Theme.Light : 該主題的背景和使用者元素使用一個相反的顏色主題. 為Android3.0以前的預設推薦基礎主題; <style

Android入門——AlertDialogProgressDialog定義Dialog總結

引言 在我們程式開發中,使用者體驗始終是一項十分重要的指標,通常為了良好的使用者體驗,在確認一些敏感或者資料操作更新之前允許客戶反悔即讓使用者擁有更多的自主性,而Android開發中是藉助對話方塊Dialog系、Popupwindow和Dialog樣式的Act

android EditText,textview顯示 特殊字元定義字型

在開發的時候,我們經常有碰到需要顯示特殊字元的情況,例如如下面的 特殊字元 當然特殊字元不僅僅是這些,要根據自己的業務而定。android 特殊字元 比較全的 :http://www.ztxz.c

android 通知欄NotificationManager定義通知欄Notification的使用

在Android作業系統中,狀態列通知Notification的運用是很常見的,比如我們收到簡訊,QQ訊息等,在手機頂端通知欄就會顯示一條圖文訊息來提示我們。Notification有很多的用法,比如最基本的即時訊息的提示,更新應用或下載檔案的進度條式的提示,用