我有一个DialogFragment,通常居中在屏幕上,我试图把它移出屏幕上的键盘,如果有任何键盘应该出现的话,因为当屏幕上方完全没有使用的屏幕空间时,键盘覆盖在窗口的某些部分并不是一种很好的用户体验。
假设我已经解决了检测键盘出现或消失的问题,例如How to check visibility of software keyboard in Android?。
目前,我通过这样做来移动窗口:
...
final WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
params.gravity = Gravity.TOP;
params.verticalMargin = .1f; //or whatever
dialog.getWindow().setAttributes(params);
...这可以很好地工作,但是窗口会突然停住,这不是一个愉快的UX体验。有问题的窗口有一个成功的进入和退出动画-甚至在窗口布局更改后,这些动画也能正常工作。如何在WindowManager.LayoutParams更改之间进一步使窗口具有动画效果?
(如果可能的话,我更愿意继续在http://developer.android.com/reference/android/view/Window.html的布局中工作,而不是,比如说,强迫DialogFragment进入我的activity的布局中,并从那里对其进行动画处理)。
发布于 2014-10-18 09:02:42
我没有时间等待赏金到期,所以我编码了下面的权宜之计,直到我能得到更好的解决方案。如果这对其他人有帮助,或者给他们一个值得赏金的答案,这就是我所做的。然而,我怀疑它的效率非常低,因为我假设它会强制每个动画帧的窗口重新布局,而不仅仅是在屏幕上平移位图。当然,这并不是全部,但这是关键的一点:
// Not shown: setting currentVerticalMargin, targetVerticalMargin, or calling this method
private synchronized void restartVerticalMarginAnimator() {
if (verticalMarginAnimator != null) {
return;
}
final Dialog dialog = this.getDialog();
if (dialog == null) {
return;
}
final WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
verticalMarginAnimator = new TimeAnimator();
verticalMarginAnimator.setTimeListener(new TimeListener() {
@Override
public void onTimeUpdate(TimeAnimator a, long totalTime, long deltaTime) {
float stretch = targetVerticalMargin - currentVerticalMargin;
float distance = WINDOW_ANIMATION_SPEED * deltaTime / 1000L;
boolean finished = false;
// Adjust distance so it's capped at "going all the way to target" and no further,
// and has the right sign if we're animating upward.
if (distance > Math.abs(stretch)) {
distance = stretch;
finished = true;
} else if (stretch < 0) {
distance *= -1f;
}
// Move.
currentVerticalMargin += distance;
if (finished) {
verticalMarginAnimator.end();
verticalMarginAnimator = null;
}
params.verticalMargin = currentVerticalMargin;
dialog.getWindow().setAttributes(params);
}
});
verticalMarginAnimator.start();
}https://stackoverflow.com/questions/26374623
复制相似问题