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

知信行發表於2017-04-24

轉載請註明出處:http //blog.csdn.net/hmyang314/article/details/70613478

PopWindow

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

GitHub:https//github.com/HMY314/PopWindow

 


一,介紹

主要是用於在彈窗中顯示一些有限的選單項,也支援新增自定義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;
}

}

相關文章