PopupWindow 封装详解

话不多说,直接上代码:

普通写法

    public AddAddressBookPop(Context context) {
        super(context);
        view = LayoutInflater.from(context).inflate(R.layout.addressbook_add,null);
        this.setContentView(view);
        ButterKnife.inject(this,view);
//        view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
        this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
        //设置可点击
        this.setFocusable(true);
        this.setOutsideTouchable(true);
        //实例个半透明的颜色
        ColorDrawable colorDrawable = new ColorDrawable(0xb0000000);

        //点back键和其他地方使其消息,设置这个才能触发ondismisslistener,设置其他空间变化等
        this.setBackgroundDrawable(colorDrawable);
        //设置动画效果
//        this.setAnimationStyle(android.R.style.Animation_Dialog);
        this.setAnimationStyle(R.style.addbooks_style);
        //设置背景变暗
        WindowManager.LayoutParams layoutParams = ((Activity)context).getWindow().getAttributes();
        layoutParams.alpha = 0.5f;
        ((Activity)context).getWindow().setAttributes(layoutParams);
    }

    public void showPopupWindow(View parent){
        if (!this.isShowing()){
//            this.showAsDropDown(parent,0,0);
            this.showAtLocation(parent, Gravity.CENTER,0,0);
        }else {
            this.dismiss();
        }
    }
动画代码

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:duration="500">

    <translate
        android:fromXDelta="-100%"
        android:toXDelta="0"
        android:fromYDelta="0"
        android:toYDelta="0"
       />

    <alpha android:fromAlpha="0" android:toAlpha="1.0"></alpha>

</set>

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:duration="500">

    <translate
        android:fromXDelta="0"
        android:toXDelta="-100%"
        android:fromYDelta="0"
        android:toYDelta="0"
         />

    <alpha android:fromAlpha="1.0" android:toAlpha="0"></alpha>
</set>


封装之后的两个类

第一个Popup类,第二个Util类,直接上代码:

package com.yz.demo.mykotlin;

import android.content.Context;
import android.view.View;
import android.widget.PopupWindow;


/**
 * Created by Administrator on 2017/6/16.
 */


public class CommonPopupWindow extends PopupWindow {
        final PopupController controller;

        @Override
        public int getWidth() {
            return controller.mPopupView.getMeasuredWidth();
        }

        @Override
        public int getHeight() {
            return controller.mPopupView.getMeasuredHeight();
        }

        public interface ViewInterface {
            void getChildView(View view, int layoutResId);
        }

        private CommonPopupWindow(Context context) {
            controller = new PopupController(context, this);
        }

        @Override
        public void dismiss() {
            super.dismiss();
            controller.setBackGroundLevel(1.0f);
        }

        public static class Builder {
            private final PopupController.PopupParams params;
            private ViewInterface listener;

            public Builder(Context context) {
                params = new PopupController.PopupParams(context);
            }

            /**
             * @param layoutResId 设置PopupWindow 布局ID
             * @return Builder
             */
            public Builder setView(int layoutResId) {
                params.mView = null;
                params.layoutResId = layoutResId;
                return this;
            }

            /**
             * @param view 设置PopupWindow布局
             * @return Builder
             */
            public Builder setView(View view) {
                params.mView = view;
                params.layoutResId = 0;
                return this;
            }

            /**
             * 设置子View
             *
             * @param listener ViewInterface
             * @return Builder
             */
            public Builder setViewOnclickListener(ViewInterface listener) {
                this.listener = listener;
                return this;
            }

            /**
             * 设置宽度和高度 如果不设置 默认是wrap_content
             *
             * @param width 宽
             * @return Builder
             */
            public Builder setWidthAndHeight(int width, int height) {
                params.mWidth = width;
                params.mHeight = height;
                return this;
            }

            /**
             * 设置背景灰色程度
             *
             * @param level 0.0f-1.0f
             * @return Builder
             */
            public Builder setBackGroundLevel(float level) {
                params.isShowBg = true;
                params.bg_level = level;
                return this;
            }

            /**
             * 是否可点击Outside消失
             *
             * @param touchable 是否可点击
             * @return Builder
             */
            public Builder setOutsideTouchable(boolean touchable) {
                params.isTouchable = touchable;
                return this;
            }

            /**
             * 设置动画
             *
             * @return Builder
             */
            public Builder setAnimationStyle(int animationStyle) {
                params.isShowAnim = true;
                params.animationStyle = animationStyle;
                return this;
            }

            public CommonPopupWindow create() {
                final CommonPopupWindow popupWindow = new CommonPopupWindow(params.mContext);
                params.apply(popupWindow.controller);
                if (listener != null && params.layoutResId != 0) {
                    listener.getChildView(popupWindow.controller.mPopupView, params.layoutResId);
                }
                CommonUtil.measureWidthAndHeight(popupWindow.controller.mPopupView);
                return popupWindow;
            }
        }
}


package com.yz.demo.mykotlin;

import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.PopupWindow;

/**
 * Created by Administrator on 2017/6/16.
 */

public class PopupController {
        private int layoutResId;//布局id
        private Context context;
        private PopupWindow popupWindow;
        View mPopupView;//弹窗布局View
        private View mView;
        private Window mWindow;

        PopupController(Context context, PopupWindow popupWindow) {
            this.context = context;
            this.popupWindow = popupWindow;
        }

        public void setView(int layoutResId) {
            mView = null;
            this.layoutResId = layoutResId;
            installContent();
        }

        public void setView(View view) {
            mView = view;
            this.layoutResId = 0;
            installContent();
        }

        private void installContent() {
            if (layoutResId != 0) {
                mPopupView = LayoutInflater.from(context).inflate(layoutResId, null);
            } else if (mView != null) {
                mPopupView = mView;
            }
            popupWindow.setContentView(mPopupView);
        }

        /**
         * 设置宽度
         *
         * @param width  宽
         * @param height 高
         */
        private void setWidthAndHeight(int width, int height) {
            if (width == 0 || height == 0) {
                //如果没设置宽高,默认是WRAP_CONTENT
                popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
                popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
            } else {
                popupWindow.setWidth(width);
                popupWindow.setHeight(height);
            }
        }

        /**
         * 设置背景灰色程度
         *
         * @param level 0.0f-1.0f
         */
        void setBackGroundLevel(float level) {
            mWindow = ((Activity) context).getWindow();
            WindowManager.LayoutParams params = mWindow.getAttributes();
            params.alpha = level;
            mWindow.setAttributes(params);
        }

        /**
         * 设置动画
         */
        private void setAnimationStyle(int animationStyle) {
            popupWindow.setAnimationStyle(animationStyle);
        }

        /**
         * 设置Outside是否可点击
         *
         * @param touchable 是否可点击
         */
        private void setOutsideTouchable(boolean touchable) {
            popupWindow.setBackgroundDrawable(new ColorDrawable(0x00000000));//设置透明背景
            popupWindow.setOutsideTouchable(touchable);//设置outside可点击
            popupWindow.setFocusable(touchable);
        }


        static class PopupParams {
            public int layoutResId;//布局id
            public Context mContext;
            public int mWidth, mHeight;//弹窗的宽和高
            public boolean isShowBg, isShowAnim;
            public float bg_level;//屏幕背景灰色程度
            public int animationStyle;//动画Id
            public View mView;
            public boolean isTouchable = true;

            public PopupParams(Context mContext) {
                this.mContext = mContext;
            }

            public void apply(PopupController controller) {
                if (mView != null) {
                    controller.setView(mView);
                } else if (layoutResId != 0) {
                    controller.setView(layoutResId);
                } else {
                    throw new IllegalArgumentException("PopupView's contentView is null");
                }
                controller.setWidthAndHeight(mWidth, mHeight);
                controller.setOutsideTouchable(isTouchable);//设置outside可点击
                if (isShowBg) {
                    //设置背景
                    controller.setBackGroundLevel(bg_level);
                }
                if (isShowAnim) {
                    controller.setAnimationStyle(animationStyle);
                }
            }
        }
}

public class CommonUtil {

        /**
         * 测量View的宽高
         *
         * @param view View
         */
        public static void measureWidthAndHeight(View view) {
            int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
            int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
            view.measure(w, h);
        }

}

调用方式:

View upView = LayoutInflater.from(this).inflate(R.layout.mypopup, null);
        cancel = (Button) upView.findViewById(R.id.cancel);
        cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                commonPopupWindow.dismiss();
            }
        });

                commonPopupWindow = new CommonPopupWindow.Builder(this)
                        .setView(upView)
                        .setAnimationStyle(R.style.toleft)
                        .setBackGroundLevel(0.5f)
                        .setWidthAndHeight(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
                        .create();

        commonPopupWindow.showAtLocation(lin1,Gravity.CENTER,0,0);
    }



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值