为左侧的视图设置动画

时间:2016-10-31 13:37:16

标签: android animation

我正在使用以下代码展开带动画的视图:

public class HorizontallyAnimate extends Animation {

    private int  toWidth;
    private int  startWidth;
    private View view;
    private String TAG = HorizontallyAnimate.class.getSimpleName();
    private int newWidth;
    public HorizontallyAnimate(View view) {
        this.view = view;
        this.startWidth = this.view.getWidth();
        this.toWidth = (this.startWidth == view.getHeight() ? this.startWidth * 4 : view.getHeight());

        Log.d(TAG,"Start width" + this.startWidth);
        Log.d(TAG,"view hieght " + view.getHeight());

    }

    protected void applyTransformation(float interpolatedTime, Transformation t) {
        newWidth = this.startWidth + (int) ((this.toWidth - this.startWidth) * interpolatedTime);
        this.view.getLayoutParams().width = newWidth;
        this.view.requestLayout();
    }

}

当宽度改变时,上面的代码会从左到右为视图设置动画。

但是,我正试图从右到左动画它。换句话说,宽度应该在相反的方向上增长。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

您在此处理的问题是锚定问题。当其他部分发生变化时,视图的锚点(或枢轴点)确定视图上的哪个点保持不变。

调整其尺寸时,视图的锚点取决于视图的布局方式。由于您没有在您发布的代码中提供有关视图布局方式的任何信息,因此我将从您遇到的问题中假设视图的水平锚点位于其左侧侧。

这种锚定问题会产生增长,导致最左侧保持静止,而右侧则向右侧扩展。

使视图的左侧向左扩展而右侧保持静止可以通过多种方式实现。一种方法是改变视图在其父级中的布局方式(即,如果父级是RelativeLayout,则将视图设置为alignParentRight=true,或者在其他区域中使用gravity容器)。

但是,由于您没有指定视图的布局方式,因此我将为您提供一个解决方案,该解决方案不会对其容器进行任何假设。这个解决方案并不完美,因为它可能导致一些口吃,但它仍然应该达到你想要做的。

applyTransformation方法中,您需要通过向左翻译来弥补正确的增长。您可以使用translationX

来弥补这一点
protected void applyTransformation(float interpolatedTime, Transformation t) {

        // hold the change in a separate variable for reuse.
        int delta = (int) ((this.toWidth - this.startWidth) * interpolatedTime);

        newWidth = this.startWidth + delta;
        this.view.getLayoutParams().width = newWidth;

        // shift the view leftwards so that the right side appears not to move.
        // shift amount should be equal to the amount the view expanded, but in the
        // opposite direction.
        this.view.setTranslationX(-delta); 

        this.view.requestLayout();
    }

正如你所看到的,这是一个"技巧"。当视图向右扩展时,我们将它以完全相同的比例向左移动,导致视图的幻觉向左扩展。

测试此代码,看看它是否适合您。我还建议您查看是否可以在容器内使用视图的对齐或重力。这样做可以更标准的方式解决您的问题,即没有任何"技巧"。

希望这有帮助。