所以,我的Android项目中有一个缩放动画。当单击包含图像视图的相对布局并且我希望更改保持不变时,完成缩放。
现在,我知道anim.FillAfter = true;
,我已经成功保留了动画的终点状态。它仍然存在问题。假设我有一个400x600像素的图像,我缩小到200x300(x,y不改变位置)。单击包含图像的相对布局时,图像会缩小。动画结束后,图像似乎处于200x300状态。但是,我仍然可以通过单击缩放所留下的空白区域来启动动画(右侧200像素,图像用于填充底部300像素)。我最好的猜测是,在视觉上,变化正在发生并且持续存在,但只是在视觉上。
代码方面,这就是它的样子:
UI构建器:
CustomGestureListener container = new CustomGestureListener (this); <- Custom relative layout integrating GestureDetector.IOnGestureListener, GestureDetector.IOnDoubleTapListener and ScaleGestureDetector.IOnScaleGestureListener
ImageView iv = new ImageView (this);
iv.SetImageDrawable (workingCopy);
iv.SetBackgroundColor (Android.Graphics.Color.Green);
iv.Clickable = false;
container.AddView (iv, new ViewGroup.LayoutParams (ViewGroup.LayoutParams.FillParent, ViewGroup.LayoutParams.FillParent));
GesturesExtension.Click(container).ActionEvent += delegate(GesturesExtension.State StateValue) {
PTAnimationExtender.Scale(container, new System.Drawing.Size(container.Width, container.Height), new System.Drawing.Size((int)(container.Width / 2), (int)(container.Height / 2)), 2, delegate {
AlertDialog.Builder ad = new AlertDialog.Builder(this);
ad.SetMessage("View scaled");
ad.Create().Show();
});
};
缩放:
public static void Scale (this View view, Size Start, Size End, double DurationInSec, Action Callback)
{
ScaleAnimation sa = new ScaleAnimation (((float)Start.Width) / ((float)view.Width), ((float)End.Width) / ((float)view.Width), ((float)Start.Height) / ((float)view.Height), ((float)End.Height) / ((float)view.Height));
sa.Duration = (long)(DurationInSec * 1000);
sa.FillAfter = true;
sa.Interpolator = new DecelerateInterpolator (2.5f);
view.Animation = sa;
view.Animation.AnimationEnd += delegate(object sender, Animation.AnimationEndEventArgs e) {
if (Callback != null)
Callback.Invoke ();
};
view.StartAnimation (view.Animation);
}
最后,CustomGestureListener
上的OnClick监听器:
public class ClickClass
{
public delegate void Event (State StateValue);
public event Event ActionEvent;
public void CallEvent(State StateValue)
{
if (ActionEvent != null)
ActionEvent (StateValue);
}
}
///<remarks>Detect a Click over your CustomGestureListener</remarks>
public static ClickClass Click(this CustomGestureListener view)
{
ClickClass click = new ClickClass ();
view.OnTapEvent += delegate(State state) {
click.CallEvent (state);
};
return click;
}
我尝试过的其他内容正在取代FillAfter
选项。在view.Animation.AnimationEnd
事件处理程序上,我对视图进行了重新缩放。这些方面的东西:
ViewGroup.LayoutParams lp = view.LayoutParameters;
lp.Width = End.Width;
lp.Height = End.Height;
view.LayoutParameters = lp;
最终得到了我想要的结果! (在视觉和功能上重新调整后保持最终状态)。我在更改视图的布局参数时遇到的问题是,当发生这种情况时,视图会出现视觉故障。当布局参数更改执行时,在几分之一秒内,整个视图会在采用正确大小之前重新调整为自身的较小版本。
任何解决此问题的解决方案都会受到欢迎,无论是通过解决后面的填充还是由于视图布局参数的变化引起的视觉故障......或者我可能错过的任何其他内容
答案 0 :(得分:0)
因此,在更改布局参数时,我最终找到了视觉闪烁的工作范围。如前所述,在动画结束时应用以下内容时,我的问题得以解决:
ViewGroup.LayoutParams lp = view.LayoutParameters;
lp.Height = 350;
lp.Width = 150;
view.LayoutParameters = lp;
问题在于视觉上的轻弹。但视觉轻弹是由动画实际结束前调用的AnimationEnd
引起的。所以...这为我解决了这个问题:https://stackoverflow.com/a/5110476