首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为窗口布局更改设置动画

为窗口布局更改设置动画
EN

Stack Overflow用户
提问于 2014-10-15 12:43:51
回答 1查看 936关注 0票数 6

我有一个DialogFragment,通常居中在屏幕上,我试图把它移出屏幕上的键盘,如果有任何键盘应该出现的话,因为当屏幕上方完全没有使用的屏幕空间时,键盘覆盖在窗口的某些部分并不是一种很好的用户体验。

假设我已经解决了检测键盘出现或消失的问题,例如How to check visibility of software keyboard in Android?

目前,我通过这样做来移动窗口:

代码语言:javascript
复制
...
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的布局中,并从那里对其进行动画处理)。

EN

回答 1

Stack Overflow用户

发布于 2014-10-18 09:02:42

我没有时间等待赏金到期,所以我编码了下面的权宜之计,直到我能得到更好的解决方案。如果这对其他人有帮助,或者给他们一个值得赏金的答案,这就是我所做的。然而,我怀疑它的效率非常低,因为我假设它会强制每个动画帧的窗口重新布局,而不仅仅是在屏幕上平移位图。当然,这并不是全部,但这是关键的一点:

代码语言:javascript
复制
// 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();
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26374623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档