前段时间做项目的时候,有几个底部弹出框,当时因为忙着赶进度所有就单独写了好几个popupwindow.后来就想着怎么实现一个通用的PopupWindow工具类
就是在要用到的时候创建该工具类的对象,并传入相应的框体布局,就可以实现了.
先看看效果,下面的两是调用同一个PopupWindowUtils创建的:
ok,先看看popupWindow的具体实现
importandroid.app.Activity;importandroid.graphics.drawable.ColorDrawable;importandroid.view.Gravity;importandroid.view.LayoutInflater;importandroid.view.MotionEvent;importandroid.view.View;importandroid.view.ViewGroup;importandroid.view.WindowManager;importandroid.widget.PopupWindow;/*** Created by 95 on 2017/8/22.*/
public class PopupWindowUtils extends View implementsView.OnTouchListener{privateActivity mContext;private intmXml;publicView mMenuView;publicPopupWindow popupWindow;public PopupWindowUtils(Activity mContext, intmXml) {super(mContext);this.mContext =mContext;this.mXml =mXml;
newPopu();
}//创建popupWinow对象
private voidnewPopu() {
LayoutInflater inflater=LayoutInflater.from(mContext);
mMenuView= inflater.inflate(mXml, null);
popupWindow= new PopupWindow(mMenuView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);
popupWindow.setAnimationStyle(R.style.popwin_anim_style);//弹出,关闭动画
ColorDrawable dw = new ColorDrawable(mContext.getResources().getColor(R.color.btn));//popupWindow的背景设置为透明
popupWindow.setBackgroundDrawable(dw);//popupWindow 的取消监听当dismiss()被调用的时候发生
popupWindow.setOnDismissListener(newPopupWindow.OnDismissListener() {
@Overridepublic voidonDismiss() {
background(1f);
}
});//触摸监听
mMenuView.setOnTouchListener(this);
}//popupWindow状态改变的时候修改整体背景
private void background(floatmfloat) {
WindowManager.LayoutParams lp=mContext.getWindow().getAttributes();
lp.alpha=mfloat;
mContext.getWindow().setAttributes(lp);
mContext.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
}//触摸关闭
@Overridepublic booleanonTouch(View v, MotionEvent event) {int height =mMenuView.getHeight();int y = (int) event.getY();if (event.getAction() ==MotionEvent.ACTION_UP) {if (y
popupWindow.dismiss();
}
}return true;
}//弹出
public voidshow() {
background(0.5f);
View rootView= ((ViewGroup) mContext.findViewById(android.R.id.content)).getChildAt(0);
popupWindow.showAtLocation(rootView, Gravity.BOTTOM| Gravity.CENTER_HORIZONTAL, 0, 0);
}//外部调用关闭
public voiddismiss() {
popupWindow.dismiss();
}
}
弹出,关闭的动画
在style.xml添加
@anim/ppwindow_show_anim
@anim/ppwindow_hide_anim
并创建anim文件和动画
1.开启
android:duration="300"android:fromXDelta="0"android:toXDelta="0"android:fromYDelta="200"android:toYDelta="0"
/>
android:duration="300"android:fromAlpha="0"android:toAlpha="1"
/>
2.关闭
android:duration="300"android:fromXDelta="0"android:toXDelta="0"android:fromYDelta="0"android:toYDelta="200"
/>
android:duration="300"android:fromAlpha="1"android:toAlpha="0"
/>
popupWindow的背景设置为透明
ok,popupWindowUtils就完成了,现在就该调用了
importandroid.os.Bundle;importandroid.support.v7.app.AppCompatActivity;importandroid.view.View;importandroid.widget.Toast;public class MainActivity extends AppCompatActivity implementsView.OnClickListener{privatePopupWindowUtils popup;privatePopupWindowUtils popup2;
@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button1).setOnClickListener(this);
findViewById(R.id.button2).setOnClickListener(this);
}
@Overridepublic voidonClick(View v) {switch(v.getId()) {case R.id.button1://创建第一个
popup = new PopupWindowUtils(this, R.layout.activity_popu1);
popup.mMenuView.findViewById(R.id.popupbtn1).setOnClickListener(this);
popup.mMenuView.findViewById(R.id.popupbtn2).setOnClickListener(this);
popup.mMenuView.findViewById(R.id.popupbtn3).setOnClickListener(this);
popup.show();//弹出
break;case R.id.button2://创建第二个
popup2 = new PopupWindowUtils(this, R.layout.activity_popu2);
popup2.mMenuView.findViewById(R.id.popup2btn1).setOnClickListener(this);
popup2.mMenuView.findViewById(R.id.popup2btn2).setOnClickListener(this);
popup2.mMenuView.findViewById(R.id.popup2btn3).setOnClickListener(this);
popup2.mMenuView.findViewById(R.id.popup2btn4).setOnClickListener(this);
popup2.show();//弹出
break;//------------------第一个的使用-----------------
caseR.id.popupbtn1:
Toast.makeText(MainActivity.this, "相机", Toast.LENGTH_LONG).show();break;caseR.id.popupbtn2:
Toast.makeText(MainActivity.this, "相册", Toast.LENGTH_LONG).show();break;caseR.id.popupbtn3:
Toast.makeText(MainActivity.this, "退出", Toast.LENGTH_LONG).show();
popup.dismiss();//关闭
break;//--------------------第二个的使用-----------------
caseR.id.popup2btn1:
Toast.makeText(MainActivity.this,"popup2打电话",Toast.LENGTH_LONG).show();break;caseR.id.popup2btn2:
Toast.makeText(MainActivity.this,"popup2发短信",Toast.LENGTH_LONG).show();break;caseR.id.popup2btn3:
Toast.makeText(MainActivity.this,"popup2发邮件",Toast.LENGTH_LONG).show();break;caseR.id.popup2btn4:
Toast.makeText(MainActivity.this,"popup2退出",Toast.LENGTH_LONG).show();
popup2.dismiss();//关闭
break;
}
}
}
MainActivity的布局文件
popup1布局
popup2布局
ok.所有代码都在这了,
使用的话直接使用popupWindowUtils就可以了