欢迎各位访问的博客,博客地址
一、概述
1.继承关系:
java.lang.Object
↳ android.widget.PopupWindow
可以看出它并不是继承于View,而是Object的子类,位于app包下,和Dialog类似;
2.实现效果:
微博效果
电商购物效果
二、基本使用
贴上微博效果的代码如下:
@OnClick(R.id.compose_btn)
public void onComposeBtnClicked(View view){
initPopup();
}
private void initPopup() {
View customView = getLayoutInflater().inflate(R.layout.popup_custome_view, null);
final PopupWindow popupWindow = new PopupWindow(customView,
WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT, true);
popupWindow.setAnimationStyle(R.style.popupAnimation);
popupWindow.setBackgroundDrawable(new BitmapDrawable());
//由于PopupWindow没有提供监听动画的接口和获取动画的接口,这里做了延时一个动画的时长
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
getWindow().setStatusBarColor(Color.TRANSPARENT);
}
}
}, 200);
customView.findViewById(R.id.close_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popupWindow.dismiss();
}
});
popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
getWindow().setStatusBarColor(getResources().getColor(R.color.colorPrimaryDark));
}
}
});
popupWindow.showAtLocation(mTabHost, Gravity.BOTTOM, 0, 0);
popupWindow.update();
}
可以看出触发点击事件时候显示显示popupWindow:
- 初始化popupWindow中必须设置:
popupWindow.setBackgroundDrawable(new BitmapDrawable());
否则无法show;
- 设置动画:
popupWindow.setAnimationStyle(R.style.popupAnimation);
这里要在style中配置:
<style name="popupAnimation" parent="android:Animation" mce_bogus="1">
<item name="android:windowEnterAnimation">@anim/pop_enter</item>
<item name="android:windowExitAnimation">@anim/pop_exit</item>
</style>
pop_enter的xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromYDelta="100%"
android:toYDelta="0%"
android:duration="200"/>
<alpha
android:duration="200"
android:fromAlpha="0.0"
android:interpolator="@android:anim/decelerate_interpolator"
android:toAlpha="1.0" />
</set>
pop_exit的xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromYDelta="0%"
android:toYDelta="100%"
android:duration = "200"/>
<alpha
android:duration="200"
android:fromAlpha="1.0"
android:interpolator="@android:anim/accelerate_interpolator"
android:toAlpha="0.0" />
</set>
- 关于动画:
查了很久没发现popupwindow的动画监听,并且无法获取动画实例,所以这里的动画监听使用了new Handler().postDelayed的延时方式处理;
三、存在的问题
如果popupwindow中有弹出软键盘的交互,就好比我的效果图二中需要弹出软键盘,这里试了下在Activity中配置windowSoftInputMode为adjustResize或者是adjustPan在弹出软键盘时候均会遮挡输入框,但是在原生android上是不会遮挡的,在国内小米和魅族上测试均会遮挡,我想了一下应该是国内改了FrameWork层中window的相关参数导致的,解决这个问题需要给popupwindow设置:
mPopupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
mPopupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
如果想在弹出popupwindow时候改变window的背景色,比如我效果图二的效果,这里可以在show的时候一并设置window的背景alpha,在dismiss的时候在设置回来:
show的时候:
private void show() {
WindowManager.LayoutParams params = getWindow().getAttributes();
params.alpha = 0.7f;
getWindow().setAttributes(params);
mPopupWindow.showAtLocation(mRecycler, Gravity.BOTTOM, 0, 0);
}
dismiss的时候:
mPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
WindowManager.LayoutParams params = getWindow().getAttributes();
params.alpha = 1f;
getWindow().setAttributes(params);
}
});
四、总结
- popupwindow和dialog一样都是和View平级的控件,都在app包下;
- popupwindow是处在整个Activity最顶层,设置在window层级;
- Window是Activity在Attach时候创建的,在创建的过程中会设置windowsoftInputmode属性值,这里可以参考老罗的这篇博文:http://blog.csdn.net/luoshengyang/article/details/8223770
- 关于windowsoftInputmode相关值得含义:
【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
【C】stateHidden:用户选择activity时,软键盘总是被隐藏
【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
【E】stateVisible:软键盘通常是可见的
【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分