如何在Android中设置LayoutParams x和y的动画

如何在Android中设置LayoutParams x和y的动画,android,android-animation,Android,Android Animation,我不熟悉安卓系统。 我有以下代码: // layoutParams of type WindowManager.LayoutParams layoutParams.x = someX; layoutParams.y = someY; windowManager.updateViewLayout(someView, layoutParams); 如何设置此更改的动画?例如翻译…您可以使用ValueAnimator: int beginValue = 0; int endValue = 100;

我不熟悉安卓系统。 我有以下代码:

// layoutParams of type WindowManager.LayoutParams
layoutParams.x = someX;
layoutParams.y = someY;
windowManager.updateViewLayout(someView, layoutParams);

如何设置此更改的动画?例如翻译…

您可以使用
ValueAnimator

int beginValue = 0;
int endValue = 100;

ValueAnimator animator = ValueAnimator.ofInt(beginValue, endValue);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        WindowManager.LayoutParams layoutParams =
                (WindowManager.LayoutParams) view.getLayoutParams();
        layoutParams.x = (Integer) animation.getAnimatedValue();
        layoutParams.y = (Integer) animation.getAnimatedValue();
        getWindowManager().updateViewLayout(view, params);
    }
});
animator.start();

您可以使用
ValueAnimator

int beginValue = 0;
int endValue = 100;

ValueAnimator animator = ValueAnimator.ofInt(beginValue, endValue);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        WindowManager.LayoutParams layoutParams =
                (WindowManager.LayoutParams) view.getLayoutParams();
        layoutParams.x = (Integer) animation.getAnimatedValue();
        layoutParams.y = (Integer) animation.getAnimatedValue();
        getWindowManager().updateViewLayout(view, params);
    }
});
animator.start();

而是在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();
}

而是在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();
}

我发现的解决类似问题的最简单方法如下所示:

在我的例子中,我有一个
RelativeLayout
,并希望以编程方式更改它下面的
android:layout_
值(它的父项也是
RelativeLayout

因此,在
onCreate
中,我将:

LayoutTransition layoutTransition = rlListLayout.getLayoutTransition();
layoutTransition.enableTransitionType(LayoutTransition.CHANGING);
然后,例如在
onClick
方法中更改布局参数:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) rl.getLayoutParams();
params.addRule(RelativeLayout.BELOW, R.id.dummy);
rl.setLayoutParams(params);

就这样。5行代码,无需计算位置或测量任何内容。

我发现的解决类似问题的最简单方法如下所示:

在我的例子中,我有一个
RelativeLayout
,并希望以编程方式更改它下面的
android:layout_
值(它的父项也是
RelativeLayout

因此,在
onCreate
中,我将:

LayoutTransition layoutTransition = rlListLayout.getLayoutTransition();
layoutTransition.enableTransitionType(LayoutTransition.CHANGING);
然后,例如在
onClick
方法中更改布局参数:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) rl.getLayoutParams();
params.addRule(RelativeLayout.BELOW, R.id.dummy);
rl.setLayoutParams(params);
就这样。5行代码,无需计算位置或测量任何内容