2012-12-04 48 views
2

我正在使用翻译和缩放动画。首先,我将帧布局转换到屏幕中心,并使用布局参数将其位置参数设置到屏幕中心。这工作正常!在翻译动画结束时,我运行缩放动画,我的布局缩放为其原始大小的2倍。其实我的框架布局(我是动画)由按钮和图像视图组成。和android一样,动画不会转换视图,只会改变它必须绘制的位置。现在我的问题是,我无法让我的按钮工作。因为他们实际上并不存在!android在缩放动画后设置新大小

我在动画结束后通过设置其位置参数找到了翻译动画的解决方案。这将视图永久移动到新位置。

但是,在缩放动画的情况下,我必须改变布局的大小以及其内的孩子。但它不起作用,因为我将原始高度宽度乘以比例因子。这里是我的比例尺动画代码。

ScaleAnimation scaleAnim = new ScaleAnimation(1.0f, 2.0f, 1.0f, 
        2.0f, Animation.RELATIVE_TO_SELF, 0.5f, 
        Animation.RELATIVE_TO_SELF, 0.5f); 

      scaleAnim.setDuration(600); 
      // scaleAnim.setFillEnabled(true); 
      scaleAnim.setFillAfter(true); 

      view.setAnimation(scaleAnim); 
      view.startAnimation(scaleAnim); 

      scaleAnim.setAnimationListener(new AnimationListener() { 

       public void onAnimationStart(Animation animation) { 


       } 

       public void onAnimationRepeat(Animation animation) { 


       } 

       public void onAnimationEnd(Animation animation) { 
        FrameLayout.LayoutParams par = (FrameLayout.LayoutParams) view 
          .getLayoutParams(); 

        par.height = view.getMeasuredHeight() * 2; 
        par.width = view.getMeasuredWidth() * 2; 

        view.setLayoutParams(par); 
        view.requestLayout(); 

       } 
      }); 

p.s that setFillAfter(true)and setFillEnabled(true)are not the solution。

+0

你可以通过把你想要它是一切,当动画结束做到这一点,然后将其动画到该位置。确保在动画开始之前将其隐藏并禁用按钮,直到动画结束。 – TofferJ

+0

问题是通过缩放动画原始高度和宽度在缩放后不会改变。所以我的按钮不起作用 –

+0

即使您创建它们的全尺寸,然后将它们从比例10%缩放到原始大小,也不是这样吗?我用翻译和缩放动画做了类似的事情。当动画完成时,我可以点击按钮。我会尽力为你挖掘那段代码。 – TofferJ

回答

0

使用ObjectAnimator和AnimatorSet解决了这个问题。

+11

可以请你发布代码吗?我也面临类似的问题。 – Anukool

1

我会评论以上,但我没有足够的代表。文档中的这个页面解释了视图动画系统和属性动画系统之间的区别。从这里你可以创建ObjectAnimator和AnimatorSet对象,这些对象将移动按钮并编辑实际视图,而不仅仅是视图的绘制。

http://developer.android.com/guide/topics/graphics/prop-animation.html#views

属性动画系统允许查看对象的流线型的动画,并通过观看动画系统提供了一些优势。视图动画系统通过改变它们被绘制的方式来转换视图对象。这是在每个视图的容器中处理的,因为视图本身没有可操作的属性。这导致视图被动画,但在视图对象本身中没有改变。这导致行为,例如对象仍然存在于其原始位置,即使它是在屏幕上的不同位置绘制的。在Android 3.0中,添加了新的属性和相应的getter和setter方法来消除这个缺点。

属性动画系统可以通过更改视图对象中的实际属性来在屏幕上动画视图。另外,视图也会自动调用invalidate()方法刷新屏幕,只要其属性发生更改。

0
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat(View.SCALE_X, 1, 1.2f); 
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat(View.SCALE_Y, 1, 1.2f); 
ObjectAnimator scaleAnimation = ObjectAnimator.ofPropertyValuesHolder(your_view, pvhX, pvhY); 

AnimatorSet setAnimation = new AnimatorSet(); 
setAnimation.play(scaleAnimation); 
setAnimation.start();