自定义PopWindow

时间:2022-03-31 07:42:22

一、运行效果图

二、工程结构

三、自定义PopWindow

代码:

package com.example.custompopdemo; import android.app.Activity; import android.content.Context; import android.graphics.drawable.ColorDrawable; import android.util.DisplayMetrics; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.PopupWindow; /** * Created by 袁磊 on 2017/3/11. */ public class MyPopWindow extends PopupWindow { private View contentView; public MyPopWindow(Activity activity) { //获得LayoutInfalter实例 LayoutInflater inflater = (LayoutInflater) activity .getSystemService(Context.LAYOUT_INFLATER_SERVICE); contentView = inflater.inflate(R.layout.pop_layout, null); /** * 获取屏幕的宽高 */ DisplayMetrics dm = new DisplayMetrics(); activity.getWindowManager().getDefaultDisplay().getMetrics(dm); int w = dm.widthPixels; int h = dm.heightPixels; this.setContentView(contentView);//设置Pop的View this.setWidth(w / 2 + 50);//设置Pop的宽 this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);//设置Pop的高 this.setFocusable(true);//设置Pop可点击 this.setOutsideTouchable(true); this.update();//刷新状态 ColorDrawable dw = new ColorDrawable(0000000000); //实例化一个ColorDrawable颜色为半透明 // 点back键和其他地方使其消失,设置了这个才能触发OnDismisslistener ,,设置其他控件变化等操作 this.setBackgroundDrawable(dw); this.setAnimationStyle(R.style.AnimationPreview);//设置Pop动画效果 LinearLayout first = (LinearLayout) contentView.findViewById(R.id.lin_first); LinearLayout second = (LinearLayout) contentView.findViewById(R.id.lin_second); first.setOnClickListener(my); second.setOnClickListener(my); } private View.OnClickListener my = new View.OnClickListener() { @Override public void onClick(View v) { //通过自定义接口将回调方法公布出去 if (popOnclickListener != null) { popOnclickListener.onClick(v); } } }; /** * 显示Pop * * @param parent */ public void showPopupWindow(View parent) { if (!this.isShowing()) { //以下拉方式显示Pop /** * showAsDropDown 的对齐方式是v控件的左下角与popupWindow的控件左上角对齐 * 而popupWindow不会超出屏幕,所以显示效果是紧贴右边框 * 先除去控件的宽度,这样popupWindow的控件右上角和v控件的左下角是对齐的, * 然后在设置偏移量就可以正常显示了 * 此方法亦适用于右下角弹出 */ this.showAsDropDown(parent, -this.getWidth() + parent.getWidth() - 20, 0); } else { this.dismiss(); } } /** * 自定义接口 * 复制源代码中的三个抽象方法 */ public interface PopOnclickListener { void onClick(View v); } private PopOnclickListener popOnclickListener; public void setPopOnclickListener(PopOnclickListener popOnclickListener) { this.popOnclickListener = popOnclickListener; } }

MyPopWindow

布局(根据需求改动):