我在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>
答案 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;
}
如果有一个解决方案允许使用动画资源,并且不需要更简洁的绝对值。