相对于中心点的Android图像比例动画


88

我有一个ImageView,并对其进行了简单的缩放动画。非常标准的代码。

我的scale_up.xml:

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale android:fromXScale="1"
           android:fromYScale="1"
           android:toXScale="1.2"
           android:toYScale="1.2"
           android:duration="175"/>
</set>

我的动画代码:

Animation a = AnimationUtils.loadAnimation(this, R.anim.scale_up);
((ImageView) findViewById(R.id.circle_image)).startAnimation(a);

问题:

当图像缩放时,它不是从中心缩放,而是从左上角缩放。换句话说,图像的缩放版本与中心没有相同的点,但是其左上角具有相同的点。这里的链接解释了我的意思。第一张图像是动画的缩放比例,第二张图像是我希望的缩放比例。它应保持中心点相同。我尝试在容器上的图像上设置重力,将其向左或向右对齐,它的缩放比例始终相同。我在主屏幕上使用了RelativeLayout,ImageView位于另一个RelativeLayout中,但是我尝试了其他布局,没有任何变化。

Answers:


76

忘了额外的转换,设置android:pivotXandroid:pivotY宽度和高度的一半,它会从图像的中心规模。


2
pivotXpivotY应设置为一半,viewportWidth并且viewportHeight要准确。
toobsco42

162

50% 是动画视图的中心。

50%p 是父母的中心

<scale
    android:fromXScale="1.0"
    android:toXScale="1.2"
    android:fromYScale="1.0"
    android:toYScale="1.2"
    android:pivotX="50%"
    android:pivotY="50%"
    android:duration="175"/>

30
对我来说,有50%做到了这一点(无p)
agamov 2014年

5
如果相对于您要应用动画的组件的宽度或高度,则应该不带p。p指的是您向其应用动画的组件的父对象。
艾伦·

如何50%p在Java文件中代替XML?
Nikola K.

6
新的ScaleAnimation(1.0f,1.2f,1.0f,1.2f,Animation.RELATIVE_TO_PARENT,0.5f,Animation.RELATIVE_TO_PARENT,0.5f);
姜琦

还有一个“ a”-Animation.ABSOLUTE以px为单位设置。
Zon

120

@stevanveltema和@JiangQi提供的答案是完美的,但是如果您想使用代码进行缩放,则可以使用我的答案。

// first 0f, 1f mean scaling from X-axis to X-axis, meaning scaling from 0-100%
// first 0f, 1f mean scaling from Y-axis to Y-axis, meaning scaling from 0-100%
// The two 0.5f mean animation will start from 50% of X-axis & 50% of Y-axis, i.e. from center

ScaleAnimation fade_in =  new ScaleAnimation(0f, 1f, 0f, 1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
fade_in.setDuration(1000);     // animation duration in milliseconds
fade_in.setFillAfter(true);    // If fillAfter is true, the transformation that this animation performed will persist when it is finished.
view.startAnimation(fade_in);

1
@ T.Todua什么错误?请提出一个新问题并链接回该答案。
罗汉·坎德瓦尔

7

您可以在集合中使用平移动画来抵消它。您可能需要调整toXDelta和toYDelta值以使其正确,以便使图像居中。

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale android:fromXScale="1"
        android:fromYScale="1"
        android:toXScale="1.2"
        android:toYScale="1.2"
        android:duration="175"/>
    <translate
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="-20%"
        android:toYDelta="-20%"
        android:duration="175"/>
</set>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.