【问题标题】:android set new size after scale animationandroid在缩放动画后设置新大小
【发布时间】:2012-12-04 08:22:11
【问题描述】:

我正在使用翻译和缩放动画。首先,我将框架布局转换为屏幕中心,然后使用布局参数将其位置参数设置为屏幕中心。这很好用!在翻译动画结束时,我运行缩放动画,我的布局缩放为原始大小的 2 倍。实际上我的框架布局(我正在制作动画)由按钮和图像视图组成。与在 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 setFillAfter(true) 和 setFillEnabled(true) 不是解决方案。

【问题讨论】:

  • 您可以通过在动画结束时将所有内容放置在您想要的位置来做到这一点,然后将其动画到该位置。确保在动画开始之前将其隐藏,并在动画结束之前禁用按钮。
  • 问题是通过缩放动画,缩放后原始高度和宽度不会改变。所以我的按钮不起作用
  • 即使您创建它们的全尺寸然后将它们从 10% 缩放到原始尺寸也不行吗?我用平移和缩放动画做了类似的事情。动画完成后,我可以单击按钮。我会尽力为你挖掘那段代码。
  • 解决方案将不胜感激。实际上它就像一个对话框。我将它移到中心设置是使用布局 para 边距居中。然后将其放大两倍于原始大小。但是我的按钮仍保留在其他地方,而不是显示的地方。

标签: android animation android-framelayout scaletransform


【解决方案1】:

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

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

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

属性动画系统可以通过更改 View 对象中的实际属性来为屏幕上的 View 设置动画。此外,Views 还会在其属性发生变化时自动调用 invalidate() 方法来刷新屏幕。

【讨论】:

    【解决方案2】:
    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();
    

    【讨论】:

      【解决方案3】:

      对我有用的解决方案,

      1. 不需要设置 setFillAfter,因为我们自己设置视图的比例和平移,即使你设置它也不应该出现问题。

        scaleAnim.setFillAfter(true);

      2. 使用 scaleX 和 scaleY 调用设置动画结束后的视图比例

                    public void onAnimationEnd(Animation animation) {
                        par.setScaleX(2f)
                        par.setScaleY(2f)
                        view.requestLayout();
                    }
        

        它将相应地定位缩放视图。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多