化繁为简之simplepopupwindow
来源:互联网 发布:淘宝网上图片无法显示 编辑:程序博客网 时间:2024/06/02 11:45
化繁为简之SimplePopupWindow
最近项目里总是用到PopupWindow,功能不是很复杂但是写起来很繁琐、代码很乱,所以就自己封装了一个SimplePopupWindow,基于Builder模式。
功能
- 可点击空白地方或者返回键使PopupWindow消失
- 可设置并调节半透明黑色背景,并且PopupWindow消失后背景色自动恢复
- 可设置是否同时弹出软键盘
- 不会被软键盘覆盖
- 可设置进出动画
一个简单带动画的PopupWindow弹出
只需四行代码加一个接口回调
SimplePopupWindow.with(MainActivity.this) .setView(R.layout.popup_window_main) //设置你的视图资源文件 .setAnimationStyle(R.style.anim_simple_popup_window) //设置你的动画资源文件 .show(new SimplePopupWindow.Callback() { @Override public void getView(View view, PopupWindow popupWindow) { //view是你资源文件生成的视图 } });
NOTE:后面放出动画的资源文件
带半透明灰色背景弹出
SimplePopupWindow.with(MainActivity.this) .setView(R.layout.popup_window_main) .setBackgroundAlpha(0.4f) //设置你的背景透明度 .show(new SimplePopupWindow.Callback() { @Override public void getView(View view, PopupWindow popupWindow) { } });
API文档
Note:
1. 不要在Activity的onCreate()方法中直接show(),因为此时Activity的视图开没有绘制完成。
2. 一定要在show()之前调用setView()。
SimplePopupWindow代码
//直接新建SimplePopupWindow类拷贝过去public class SimplePopupWindow { private Activity mActivity; private View mView; private boolean mIsShowInput; private int animationStyle; private int LOCATION = -1; public static SimplePopupWindow with(Activity activity) { return new SimplePopupWindow(activity); } public SimplePopupWindow(Activity activity) { mActivity = activity; animationStyle = -1; } //设置弹出位置,默认底部弹出 public void setLocation(int Lacation){ LOCATION = Lacation; } //☆视图资源,必须设置 public SimplePopupWindow setView(int ResId) { mView = LayoutInflater.from(mActivity).inflate(ResId, null); return this; } //弹出PopupWindow public void show(Callback callback) { if (mView == null){ Toast.makeText(mActivity,"请设置View", Toast.LENGTH_SHORT).show(); return; } PopupWindow window = new PopupWindow(mView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, true); if (animationStyle != -1) //如果设置了动画,则启用动画 window.setAnimationStyle(animationStyle); window.setBackgroundDrawable(new ColorDrawable()); window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); //不会被软键盘覆盖 window.setOnDismissListener(new PopupWindow.OnDismissListener() { //弹窗消失时恢复背景色 @Override public void onDismiss() { setBackgroundAlpha(1f); } }); callback.getView(mView,window); if (LOCATION != -1) window.showAtLocation(mActivity.getWindow().getDecorView().findViewById(android.R.id.content), LOCATION, 0, 0); else window.showAtLocation(mActivity.getWindow().getDecorView().findViewById(android.R.id.content), Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0); showInPut(); } //设置黑色半透明背景,建议设置0.4f,默认不设置 public SimplePopupWindow setBackgroundAlpha(float bgAlpha) { WindowManager.LayoutParams lp = mActivity.getWindow().getAttributes(); lp.alpha = bgAlpha; if (bgAlpha == 1) { mActivity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);//不移除该Flag的话,在有视频的页面上的视频会出现黑屏的bug } else { mActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);//此行代码主要是解决在华为手机上半透明效果无效的bug } mActivity.getWindow().setAttributes(lp); return this; } //设置是否自动弹出软键盘,默认为否 public SimplePopupWindow setAutoPopupInput(boolean isShowInput) { mIsShowInput = isShowInput; return this; } //设置进出动画 public SimplePopupWindow setAnimationStyle(int animationStyle){ this.animationStyle = animationStyle; return this; } //显示软键盘 private void showInPut(){ if (mIsShowInput){ new Handler().postDelayed(new Runnable() { @Override public void run() { InputMethodManager imm = (InputMethodManager)mActivity.getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); } }, 0); } } //接口回调 public interface Callback { void getView(View view, PopupWindow popupWindow); }}
动画资源文件
transition/out.xml (新建transition或anim目录)
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="250" android:fromYDelta="0.0" android:toYDelta="100%" /></set>
transition/in.xml
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="250" android:fromYDelta="100.0%" android:toYDelta="0.0" /></set>
values/styles.xml
<style name="anim_simple_popup_window"> <item name="android:windowEnterAnimation">@transition/in</item> <item name="android:windowExitAnimation">@transition/out</item></style>
阅读全文
0 0
- 化繁为简之simplepopupwindow
- FPGA研发之道(17)-化繁为简
- 化繁为简
- 化繁为简
- 马刺的大脑已非数据可丈量 化繁为简他是一派之宗
- Tower of Hanoi (递归的神奇之力--化繁为简)
- 解决问题方法论之化繁为简 - 一道算法题rand5()到rand7()
- 《专注力--化繁为简的惊人力量》之创造力的30天
- Perl:化繁为简 (转载)
- 用户体验,化繁为简
- 化繁为简系列原创教程
- 化繁为简系列原创教程
- 化繁为简系列原创教程
- 化繁为简系列原创教程
- UI设计---化繁为简
- OmniGraffle (四)化繁为简
- 化繁为简的终极指南化繁为简的终极指南
- 为将之道
- 序列化和反序列化
- 【随笔】设计模式-单例模式
- 异步与多线程的区别
- Spring Cloud入门之Zuul
- 指针和内存错误
- 化繁为简之simplepopupwindow
- ajax总结一
- Bootstrap——标准模板
- ubuntu下安装GPGME库
- 无法登陆某些网站的解决方法
- opensuse的阿里源
- jdk安装完为什么会有两个JRE
- SpringMVC学习(四)-处理模型数据
- 改进记录