gpt4 book ai didi

android - 动画窗口布局更改

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:16:07 25 4
gpt4 key购买 nike

我有一个 DialogFragment,通常位于屏幕中央,我正在尝试将其移出屏幕键盘(如果有的话),因为覆盖键盘不是一个好的 UX 体验当远处有完全未使用的屏幕空间时,在部分窗口上方。

假设我已经解决了检测键盘出现或消失的问题,例如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);
...

这工作正常,但窗口突然猛地到位,这不是一种令人愉快的用户体验。有问题的窗口有一个成功的进入和退出动画 - 这些甚至在窗口布局更改后也能正常工作。如何在 WindowManager.LayoutParams 更改之间进一步为窗口设置动画?

(如果可能的话,我更愿意继续在 {of the}/{within the} http://developer.android.com/reference/android/view/Window.html 的布局方面工作,而不是说,强制 DialogFragment 进入我的 Activity 布局并从那里对其进行动画处理)。

最佳答案

我没有时间等待赏金到期,所以我编写了以下止损代码,直到我能找到更好的解决方案。如果它能帮助其他人,或者给他们一个有值(value)的答案的想法,这就是我所做的。但是,我怀疑它的效率极低,因为我假设它会强制重新布局每个动画帧的窗口,而不是仅仅在屏幕上平移位图。这当然不是全部,但很关键:

// 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();
}

关于android - 动画窗口布局更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26374623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com