更改android视图的位置似乎会更改动画枢轴

时间:2015-01-09 15:12:14

标签: android animation xamarin

我在Xamarin(C#)工作,但Java解决方案很好。

我有一个带有单个子视图的自定义父视图。父级具有固定的大小和位置,并且子级应该展开进入用户点击父级的视图。 展开动画是一个简单的淡入淡出和缩放,它应围绕孩子的中心旋转。

我目前看到的结果是,孩子总是在父母的左上角开始动画,并且似乎转换为用户在缩放和正确缩放时点击的点。这让我觉得动画枢轴不知何故受到了干扰。

如何移动子元素并确保应用于它的动画仍围绕本地中心点旋转,以及究竟是什么导致我目前看到的这种行为?

编辑:我发现它的根本原因是动画缩放了孩子的x和y坐标以及它的宽度和高度,因此当比例为0时,孩子出现在父元素的原点,当刻度为1时,它出现在正确的位置。我现在的新问题是:我可以使用什么方法将孩子绝对放在父母身边而不受缩放影响?

感谢。

父视图类

public class Parent: RelativeLayout
{
  private RelativeLayout _child;
  private Animation      _animation;
  private LayoutParams   _layoutParams;

  public Parent(Context context, IAttributeSet attrs)
    : base(context, attrs)
  {
    _layoutParams = new RelativeLayout.LayoutParams(64, 64);

    _child = new RelativeLayout(context);
    _child.LayoutParameters = _layoutParams;
    _child.SetBackgroundColor(Color.Red);
    _child.Visibility = ViewStates.Invisible;
    this.AddView(_child);

    _animation = AnimationUtils.LoadAnimation(context, Resource.Animation.Expand);
    _animation.AnimationEnd += OnAnimationEnd;

    this.Touch += OnTouch;
  }

  private void OnTouch(object sender, View.TouchEventArgs e)
  {
    // position the top left of the child view such that
    // the center point lies over the touch point
    var x = e.Event.GetX() - (_child.Width / 2);
    var y = e.Event.GetY() - (_child.Height / 2);
    _child.SetX(x);
    _child.SetY(y);

    _child.StartAnimation(_animation);
    _child.Visibility = ViewStates.Visible;
  }
}

展开动画资源

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/decelerate_interpolator"
    android:shareInterpolator="true"
    android:duration="500" >
  <scale
    android:fromXScale="0"
    android:fromYScale="0"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toXScale="1"
    android:toYScale="1" >
  </scale>
  <alpha
    android:fromAlpha="0"
    android:toAlpha="1" />
</set>

1 个答案:

答案 0 :(得分:0)

我现在有这个动画工作,虽然新方法更多的是解决方法而不是解决方案。

通过编程方式创建动画并在父级内完全设置枢轴,我能够确保每次都完美地对齐子位置和枢轴:

private void OnTouch(object sender, View.TouchEventArgs e)
  {
    // position the top left of the child view such that
    // the center point lies over the touch point
    var x = e.Event.GetX() - (_child.Width / 2);
    var y = e.Event.GetY() - (_child.Height / 2);
    _child.SetX(x);
    _child.SetY(y);

    // define the animation with the pivot absolutely positioned over the center of the child
    var animation = new AnimationSet(true);
    animation.Interpolator = new DecelerateInterpolator();
    animation.Duration = 500;
    animation.AddAnimation(new AlphaAnimation(0.4F, 0F));
    animation.AddAnimation(new ScaleAnimation(0F, 4F, 0F, 4F,
      Dimension.Absolute, x,
      Dimension.Absolute, y));

    _child.StartAnimation(animation);
    _child.Visibility = ViewStates.Visible;
  }

如果有一个解决方案允许使用动画资源,并且不需要更简洁的绝对值。