使用builder模式设置popupwindow的显示属性
import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import android.widget.PopupWindow;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* Created by Administrator on 2018/4/9.
*/
public class CustomWindow {
/**
*设置popwindow显示的位置
*/
public static final int SHOW_TOP=0;
public static final int SHOW_BOTTOM=1;
public static final int SHOW_LEFT=2;
public static final int SHOW_RIGHT=3;
public static final int SHOW_CENTER=4;
public static final int SHOW_ANCHOR_VIEW=5;
public static View getViewByLayout(Context context,int layoutId){
return ((Activity) context).getLayoutInflater().inflate(layoutId,null);
}
public final static class Build{
public PopupWindow build( PopupWindowBuilder builder){
return builder.getMyPopWindow();
}
}
public final static class PopupWindowBuilder {
private PopupWindow mYPopupWindow;
private Context mContext;
//popwindow锚定控件
private View mAnchor;
//基于锚定点pop在x轴 y轴的偏移量
private int offsetX,offsetY;
private int w,h;
public PopupWindowBuilder(Context context,View layout_pop,View anchor){
this.mContext=context;
this.mAnchor=anchor;
mYPopupWindow =new PopupWindow(layout_pop);
w=getScreenHeight(mContext)/2;
h=getScreenWidth(mContext);
mYPopupWindow.setHeight(h);
mYPopupWindow.setWidth(w);
}
PopupWindow getMyPopWindow(){
if (mYPopupWindow==null)
mYPopupWindow=new PopupWindow();
return mYPopupWindow;
}
/**
<p>
设置popwindown宽高
</p>
*/
public PopupWindowBuilder builderWidth(int w) {
this.w=w;
mYPopupWindow.setWidth(w);
return this;
}
public PopupWindowBuilder builderHeight(int h) {
this.h=h;
mYPopupWindow.setHeight(h);
return this;
}
public PopupWindowBuilder builderFocusable(boolean f) {
mYPopupWindow.setFocusable(f);
return this;
}
public PopupWindowBuilder builderOutsideTouchable(boolean f) {
mYPopupWindow.setOutsideTouchable(f);
return this;
}
/**
* ctrl+t 查看当前类的子类
<p>
设置背景,在外部点击消失必须的属性
Drawable drawable=new ColorDrawable(Color.parseColor("#00ff00"));
Drawable drawable=new ShapeDrawable();
</p>
*/
public PopupWindowBuilder builderBackgroundDrawable(Drawable background) {
mYPopupWindow.setBackgroundDrawable(background);
return this;
}
/**
<p>是否允滑出屏幕外部</p>
*/
public PopupWindowBuilder builderClippingEnabled(boolean f) {
mYPopupWindow.setClippingEnabled(f);
return this;
}
/**
* 设置显示与消失动画
<p>
<style name="AnimHorizontal" parent="@android:style/Animation">
<item name="android:windowEnterAnimation">@anim/push_tran_bottom_in</item>
<item name="android:windowExitAnimation">@anim/push_tran_top_out</item>
</style>
</p>
*/
public PopupWindowBuilder builderAnimationStyle(int style) {
mYPopupWindow.setAnimationStyle(style);
return this;
}
/**
<p>有edittext的时候弹起软键盘控件自动上移</p>
*/
public PopupWindowBuilder builderSoftInputMode() {
mYPopupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
return this;
}
/**
* @param a 背景透明度
*/
public PopupWindowBuilder builderShowBackgroundAlpha(float a) {
setBackgroundAlpha(a,mContext);
return this;
}
public PopupWindowBuilder builderDismissBackgroundAlpha(final float a) {
mYPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
setBackgroundAlpha(a,mContext);
}
});
return this;
}
public PopupWindowBuilder builderDismiss(){
if (mYPopupWindow!=null&&mYPopupWindow.isShowing()){
mYPopupWindow.dismiss();
}
return this;
}
public PopupWindowBuilder builderXoffset(int offsetX){
this.offsetX=offsetX;
return this;
}
public PopupWindowBuilder builderYoffset(int offsetY){
this.offsetY=offsetY;
return this;
}
/**
<p>
默认x轴y轴的偏移量是0,如果需要设置便宜,需要提前调用偏移构建
</p>
*/
public PopupWindowBuilder builderLocation(int location) {
if (location==SHOW_BOTTOM){
mYPopupWindow.showAtLocation(mAnchor, Gravity.BOTTOM,offsetX,offsetY);
}else if(location==SHOW_TOP){
mYPopupWindow.showAtLocation(mAnchor,Gravity.TOP,offsetX,offsetY);
}else if(location==SHOW_LEFT){
mYPopupWindow.showAtLocation(mAnchor,Gravity.LEFT,offsetX,offsetY);
}else if(location==SHOW_RIGHT){
mYPopupWindow.showAtLocation(mAnchor,Gravity.RIGHT,offsetX,offsetY);
}else if(location==SHOW_CENTER){
mYPopupWindow.showAtLocation(mAnchor,Gravity.CENTER,offsetX,offsetY);
} else if(location==SHOW_ANCHOR_VIEW){
mYPopupWindow.showAsDropDown(mAnchor,offsetX,offsetY);
}
return this;
}
}
/**
<p>设置屏幕的透明度</p>
*/
private static void setBackgroundAlpha(float bgAlpha, Context context) {
WindowManager.LayoutParams lp = ((Activity) context).getWindow().getAttributes();
lp.alpha = bgAlpha;
((Activity) context).getWindow().setAttributes(lp);
}
public static int getScreenWidth(Context context) {
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics metrics = new DisplayMetrics();
assert manager != null;
Display defaultDisplay = manager.getDefaultDisplay();
defaultDisplay.getMetrics(metrics);
return metrics.widthPixels;
}
public static int getScreenHeight(Context context) {
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics metrics = new DisplayMetrics();
assert manager != null;
manager.getDefaultDisplay().getMetrics(metrics);
return metrics.heightPixels;
}
}
使用方法:
private void showPop(){
View viewByLayout = CustomWindow.getViewByLayout(this, R.layout.pop_layout);
CustomWindow.PopupWindowBuilder builder=new CustomWindow.PopupWindowBuilder(this,viewByLayout,linearLayout);
builder.builderLocation(CustomWindow.SHOW_BOTTOM);
}