如何在Android中为视图设置动画并使其保持新的位置/大小?


80

我目前在我的Android应用中有一个视图,该视图正在播放帧动画。我想动画化视图以将其大小增加到150%。当我将比例动画应用于比例动画并且比例动画完成后,我希望观众在活动的整个生命周期中都保持新的尺寸。不幸的是,现在放大动画完成后,视图会恢复为原始大小。如何获得新的动画转换呢?

我正在使用

myView.startAnimation(AnimationUtils.loadAnimation(mContext,R.anim.scaleUp150));

谢谢!

Answers:


149

确保在动画xml的根元素中添加以下属性:

android:fillAfter="true" 
android:fillEnabled="true"

7
这是真正的答案。 OP应将其更改为可接受的答案。 谢谢Qlimax!(PS在开发指南的“动画”部分中没有记录,仅在Animation类的javadocs中记录。如此糟糕的文档!)
Neil Traft 2010年

7
该代码放在哪里?在<set ...></set>动画标签(translate| rotate| scale)中还是其中?
xxxxxxxxxadfas,

5
如下所述,您必须将其添加到设置的参数
cV2 2012年

3
这是行不通的。我希望视图的实际大小随动画而改变。它仅更改内容。我将比例Y从1.0更改为0.0,并且发生了动画,但在视图原来所在的位置留出了空白。另外,我尝试了View.GONE,但是将其他视图捕捉到了空白区域。在缩小时,我需要其他视图跟随缩放视图的大小。如何使它工作?
Sudhanshu 2014年

1
请注意,任何其他阅读此内容的人fillAfter都只会保留视图像素,而实际视图仍将位于初始位置。您LayoutParams可能需要在onAminationEnd(侦听器)中手动设置视图。
Muhammad Babar 2014年


32

如果要将动画放在xml中,则可能需要以下帮助:

<set
android:fillEnabled="true"
android:fillAfter="true"
xmlns:android="http://schemas.android.com/apk/res/android">

<translate
    android:fromYDelta="0"
    android:toYDelta="-20%p"
    android:duration="7000" />

</set>

https://stackoverflow.com/a/6519233/371749

请也感谢其他答案, 帮助了我:)祝你好运!


22

如今,它变得非常容易:

view.animate().x(valueX).y(valueY).setDuration(500).start();

(在此代码段中,使用了ViewPropertyAnimator)。

也可以附加多个其他选项。

视图将位于新位置。


这应该被发布为热门话题
Kotik_o 2016年

2

编辑:Qlimax的答案更好,但是由于OP尚未返回以更改选中标记,并且我无法删除接受的答案,因此我将其复制到此处:只需设置fillAfter = true fillEnabled = true

我的原始答案(有效,但相比而言有点荒谬)如下:

为了使动画后的工作能够按预期工作,至少要根据此线程,您必须编写一个onAnimationEnd处理程序,然后在其中手动调整视图的“真实”(转换前)范围以匹配的最终结果。比例动画。


嗨,沃尔特。我已经覆盖了onAnimationEnd,但是我不知道如何调整视图的“真实”范围以匹配动画的比例。我确实知道要结束的确切dp,但是找不到“ setWidth()”或“ setHeight()”函数。
justinl

1
我相信这些存储在LayoutParams中。您应该能够做到view.getLayoutParams().width = newWidth; view.getLayoutParams().height = newHeight; view.requestLayout();。(后一个调用是必要的,以通知视图树它需要重新计算。)
Walter Mundt 2010年

2
这是一种难以置信的回旋方式。要做的就是设置属性,android:fillEnabled并且android:fillAfter两个属性都必须为true。
尼尔·特拉夫特

1

实际上,由于您正在使用的动画似乎是嵌入在Android框架中的动画,因此我不确定您可以更改其中的任何内容。
但是,您可以按照文档中的示例创建自己的动画。如果要在动画结束后保留​​缩放比例,则必须放入android:fillAfter =“ true”。


2
scaleUp150是我在xml中编写的自定义动画(尽管这是非常基本的)。我确实将android:fillAfter =“ true”放到了动画中,但是它仍然会恢复到原始大小:S
justinl 2010年

1

将android:fillAfter =“ true”放到SET标签中-将它们放到动画标签中会将它们限制为“过渡参数”或“动画期间/期间”。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.