Android图像相对于中心点的缩放动画

Posted

技术标签:

【中文标题】Android图像相对于中心点的缩放动画【英文标题】:Android image scale animation relative to center point 【发布时间】:2012-01-14 14:54:48 【问题描述】:

我有一个 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);

问题:

当图像缩放时,它不是从中心缩放,而是从左上角缩放。换句话说,图像的缩放版本没有与中心相同的点,但它具有相同的左上角点。 Here's a link that explains what I mean.第一张图是动画的缩放方式,第二张图是我想要的缩放方式。它应该保持中心点相同。我尝试在图像、容器上设置重力,左右对齐,它总是缩放相同。 我在主屏幕使用RelativeLayout,ImageView位于另一个RelativeLayout中,但我尝试了其他布局,没有变化。

【问题讨论】:

【参考方案1】:

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"/>

【讨论】:

对我来说 50% 完成了这项工作(没有 p) 如果它相对于你应用动画的组件宽度或高度,它应该没有 p。 p 指的是你应用动画的组件的父级。 如何在Java文件中使用50%p,而不是XML? new 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中。【参考方案2】:

@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);

【讨论】:

@T.Todua 什么错误?请提出一个新问题并链接回此答案。 如果我想要像 ``` android:repeatCount="infinite" android:repeatMode="reverse" ``` 这样的动画无限重复怎么办?【参考方案3】:

忘记额外的翻译,将android:pivotXandroid:pivotY设置为宽度和高度的一半,它将从图像的中心缩放。

【讨论】:

pivotXpivotY 应该设置为 viewportWidthviewportHeight 的一半。【参考方案4】:

您可以使用集合中的平移动画来抵消它。您可能需要调整 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>

【讨论】:

以上是关于Android图像相对于中心点的缩放动画的主要内容,如果未能解决你的问题,请参考以下文章

相对于鼠标位置从其中心缩放图像

Android笔记:动画

UIScrollView 在不正确的点上缩放

HTML5 Canvas - 在不翻译上下文的情况下相对于对象的中心进行缩放

动画(缩放和翻译)android画布视图上的图像的一部分

svg子元素上的CSS变换原点问题