记录一下:
问题描述:通过popupwindow创建三个view,每个view都是可以获取焦点,操作onkeyListener事件,监听back键,加一下动画效果,动画结束之后才dismiss;
android版本:
popupwindow源码分析:https://blog.csdn.net/zwluoyuxi/article/details/73977651
1.android 6.0及以上:PopupDecorView (现在使用的6.0版本)点击返回键并没有执行动画,而是直接dismiss
2.android 6.0以下: PopupViewContainer 没有问题
分析下:下面的的代码在6.0版本, 5.1版本是一样的,
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
if (getKeyDispatcherState() == null) {
return super.dispatchKeyEvent(event);
}
if (event.getAction() == KeyEvent.ACTION_DOWN
&& event.getRepeatCount() == 0) {
KeyEvent.DispatcherState state = getKeyDispatcherState();
if (state != null) {
state.startTracking(event, this);
}
return true;
} else if (event.getAction() == KeyEvent.ACTION_UP) {
KeyEvent.DispatcherState state = getKeyDispatcherState();
if (state != null && state.isTracking(event) && !event.isCanceled()) {
dismiss();
return true;
}
}
return super.dispatchKeyEvent(event);
} else {
return super.dispatchKeyEvent(event);
}
}
修改逻辑:重写dismiss()
在6.0版本中view中返回键是KeyEvent.ACTION_UP直接dismiss, 所以动画效果在重写dismiss()中操作,而本身的dismiss()需要重写个方法
public void onDismiss(){
super.dismiss();
}
@Override
public void dismiss() {
if(Build.VERSION.SDK_INT <= 22){
super.dismiss();
}else{
//操作
}
}