我正在使用以下代码展开带动画的视图:
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();
}
}
当宽度改变时,上面的代码会从左到右为视图设置动画。
但是,我正试图从右到左动画它。换句话说,宽度应该在相反的方向上增长。我怎么能这样做?
答案 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();
}
正如你所看到的,这是一个"技巧"。当视图向右扩展时,我们将它以完全相同的比例向左移动,导致视图的幻觉向左扩展。
测试此代码,看看它是否适合您。我还建议您查看是否可以在容器内使用视图的对齐或重力。这样做可以更标准的方式解决您的问题,即没有任何"技巧"。
希望这有帮助。