setLayoutParams()动画持续时间不起作用

时间:2016-09-11 11:41:02

标签: android animation transition duration layoutparams

LayoutParams转换addRule()

我的观点会改变位置,但持续时间是即时的。

我在API 15上工作,所以我无法使用beginDelayedTransition()

Animation a = new Animation() {

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {

        final RelativeLayout.LayoutParams positionRules = new RelativeLayout.LayoutParams(layoutFalse.getWidth(), layoutFalse.getHeight());

        positionRules.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
        positionRules.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
        layoutFalse.requestLayout();
        layoutFalse.setLayoutParams(positionRules);
    }
};

a.setDuration(3000);
layoutFalse.startAnimation(a);

3 个答案:

答案 0 :(得分:1)

为每个动画帧调用

applyTransformation(),转换应使用interpolatedTime参数来计算该帧的变换。您的applyTransformation()无条件地应用更改,因此所有帧的结果都相同。

如果您只想在指定时间后更改布局,请使用layoutFalse.postDelayed()发布在延迟后应用更改的Runnable

答案 1 :(得分:1)

在这个区块中你不做任何动画。 你只要说:

让这个对象在每个框架中与我想要的对立面。没有了。

所以,我认为,如果你想动画一些东西,你必须像这样使用interpolatedTime: 在没有动画的情况下在RelativeLayout内设置视图的位置:

public void setTopLeftCornerF(float leftMargin, float topMargin) {
    if (this.getLayoutParams() instanceof RelativeLayout.LayoutParams) {
        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)this.getLayoutParams();
        params.width = (int)_width;//w();
        params.height = (int)_height;//h();
        params.setMargins((int)leftMargin, (int)topMargin, (int)-leftMargin, (int)-topMargin);
        this.setLayoutParams(params);
    }
}

在某处使用动画:

@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
    // TODO Auto-generated method stub
    super.applyTransformation(interpolatedTime, t);
    float posX = (float) (mFromX + ((mToX - mFromX) * interpolatedTime));
    float posY = (float) (mFromY + ((mToY - mFromY) * interpolatedTime));

    t.getMatrix().setTranslate(posX,posY);
}

或按照here

所述使用TranslateAnimation

答案 2 :(得分:0)

在这里,

layoutFalse.requestLayout();
layoutFalse.setLayoutParams(positionRules);

你的顺序错了。因为您应首先设置layoutParams,然后在requestLayout上致电view

应该如下

layoutFalse.setLayoutParams(positionRules);
layoutFalse.requestLayout();