如何使用动画对角转换windowmanager浮动布局? (ChatHead点击动画)

时间:2016-07-22 16:57:01

标签: android animation android-animation android-windowmanager android-transitions

我正在尝试在我的应用程序中实现聊天。我已经设法让一切工作,onClick自定义布局打开,这是一个相对布局与webview和一些按钮。当点击同时打开定义的布局时,聊天头移动到右上角。 现在我面临的唯一问题是聊天室翻译,当它移动到右上角时,它没有顺利过渡,因为我没有给它任何动画,我不知道如何。 我搜索了一个mwthod并找到了我尝试使用的ValueAnimator。

        private ValueAnimator mMoveEdgeAnimator;


        mParams.y = goalPositionY;

        mMoveEdgeAnimator = ValueAnimator.ofInt(currentX, goalPositionX);
        mMoveEdgeAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                mParams.x = (Integer) animation.getAnimatedValue();
                mWindowManager.updateViewLayout(FloatingView.this, mParams);
            }
        });

        mMoveEdgeAnimator.setDuration(MOVE_TO_EDGE_DURATION);
        mMoveEdgeAnimator.setInterpolator(mMoveEdgeInterpolator);
        mMoveEdgeAnimator.start();

但它仅适用于X或Y中的一个轴,它在屏幕上看起来不是无缝的,我希望它对角转换类似于facebook chathead对onClick的反应。

如何对角翻译?另外如何在windowManager.addView()上应用增长动画?

提前致谢!!

1 个答案:

答案 0 :(得分:1)

您可以使用属性值持有者在x和y之间制作动画。

public void animate(final View v, int startX, int endX, int startY, int endY) {

    PropertyValuesHolder pvhX = PropertyValuesHolder.ofInt("x", startX, endX);
    PropertyValuesHolder pvhY = PropertyValuesHolder.ofInt("y", startY, endY);

    ValueAnimator translator = ValueAnimator.ofPropertyValuesHolder(pvhX, pvhY);

    translator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            WindowManager.LayoutParams layoutParams = (WindowManager.LayoutParams) v.getLayoutParams();
            layoutParams.x = (Integer) valueAnimator.getAnimatedValue("x");
            layoutParams.y = (Integer) valueAnimator.getAnimatedValue("y");
            windowManager.updateViewLayout(v, layoutParams);
        }
    });

    translator.setDuration(100);
    translator.start();
}