缩放动画表现为平移动画的行为

7
我正在实践游戏中的比例动画,遵循所有指南,但总是发生一些奇怪的事情,而不是使对象变大。动画不仅使图像变大,而且还移动它,即使我没有使用平移动画...
以下是XML文件:
<?xml version="1.0" encoding="utf-8"?>
<set android:shareInterpolator="false"    
 xmlns:android="http://schemas.android.com/apk/res/android">
<scale
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:fromXScale="1.0"
    android:toXScale="1.4"
    android:fromYScale="1.0"
    android:toYScale="1.4"
    android:pivotX="50%"
    android:pivotY="50%"
    android:fillAfter="false"
    android:duration="1000" />
 </set>

在Java中它被称为:

private void startAnimation(final ImageView imageView) {
        final Animation popAnim = AnimationUtils.loadAnimation(getActivity(), R.anim.scalebounce);
        imageView.startAnimation(popAnim);
        popAnim.setAnimationListener(new AnimationListener() {

            public void onAnimationStart(Animation animation) {

            }

            public void onAnimationRepeat(Animation animation) {

            }

            public void onAnimationEnd(Animation animation) {
                imageView.clearAnimation();
                imageView.setVisibility(View.GONE);
            }
        });
    }

我已尝试网上找到的所有解决方案,但仍无法解决问题。即使只进行缩放操作,它仍然会出现这种转换行为... 我是从一个小点开始制作图像,然后才变得更大(正常大小)。但我不想让它移动,只想保持在原地。谢谢:)

P.S. 我一直在观察动画,似乎它占用了更大的空间,这就是为什么看起来像是在移动... 为什么它需要占用更大的空间?而不是实际图像大小?

2个回答

5

pivotX和pivotY需要大致等于您的视图应该缩放的位置。

为了说明,这里有一张图表:

enter image description here

您的旋转点当前在视图外部,这使得您的视图似乎同时移动和缩放。

如果您想让旋转点成为视图左上角,请将pivotX / pivotY设置为0。

如果您希望缩放从中心进行(如第一张图片所示),请将pivotX = view.getWidth() / 2f和pivotY = view.getHeight() / 2f设置为相应值。

希望这能帮到您 :)


嗨,谢谢。我有一个问题。50%的pivotX和Y不是中心吗? - NoobMe
我不确定在运行时如何解释这个50%。 - Gil Moshayof
当我改变从X到Y时,它仍然在移动。=_= - NoobMe
尝试将pivotX和pivotY设置为0? - Gil Moshayof
1
很高兴看到这个答案,但是当我尝试时,它仍然在移动而不是缩放。 - A. Adam

3

我遇到了同样的问题。我不知道它是否与我的问题几乎相同,但它可能有所帮助。 我在一个相对布局中的scrollview中拥有按钮。当我想要动画化我的按钮的比例时,出现了与你的问题一样的情况,所以我在Java代码中进行操作而不是XML,但在RELATIVE_TO_PARENT和RELATIVE_TO_SELF之间没有任何区别。我发现每次都从按钮的父对象(scrollview)获取了枢轴点。不知道为什么。 因此,我决定计算scrollview的枢轴点,使其位于我的按钮所在位置:

ScaleAnimation animation = new ScaleAnimation(1.0f, 1.1f, 1.1f, 1.0f, Animation.RELATIVE_TO_PARENT, (float) (button1.getX()+ 45*ssu) / width, Animation.RELATIVE_TO_PARENT, (float) (button1.getY()+ 45*ssu) / (4 * height) );
                animation.setDuration(1000);
                animation.setRepeatMode(ValueAnimator.REVERSE);
                animation.setRepeatCount(animation.INFINITE);
                button1.startAnimation(animation);

你可以看到,我将按钮的x位置通过整个宽度除以pivotX,将按钮的y位置通过滚动视图的四倍高度除以pivotY,并且还添加了45*ssu到按钮的位置上,因为这是其一半。如果不进行这个调整,pivot将位于左上角。 PS:ssu是自己制作的缩放器,因为我在Java代码中设置了按钮的宽度和高度为90*ssu。 希望这能帮到你 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接