Android에서 뷰를 애니메이션하고 새로운 위치 / 크기를 유지하는 방법은 무엇입니까?


81

현재 Android 앱에 뷰가 있고 뷰가 프레임 애니메이션을 재생하고 있습니다. 보기를 애니메이션하여 크기를 150 %로 늘리고 싶습니다. 배율 애니메이션을 적용하고 배율 애니메이션이 완료되면 뷰어가 나머지 활동 수명주기 동안 새 크기를 유지하기를 원합니다. 안타깝게도 지금 스케일 업 애니메이션이 완료되면 뷰가 원래 크기로 돌아갑니다. 새로운 애니메이션 변형을 유지하려면 어떻게해야합니까?

나는 사용하고있다

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

감사!

답변:


150

애니메이션 xml 의 루트 요소 에 아래 속성을 추가해야합니다 .

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

7
이것이 진정한 답입니다. OP는이를 수락 된 답변으로 변경해야합니다. Qlimax 감사합니다 !! (PS이 그것은 단지 애니메이션 클래스의의 javadoc에 설명되어 있습니다, 데브 설명서의 "애니메이션"절에 설명되지 않은 이러한 빈약 한 문서를.!)
닐 Traft

7
이 코드를 어디에 넣을까요? 에서 <set ...></set>또는 애니메이션 태그 ( translate| rotate| scale)?
xxxxxxxxxadfas

5
아래에서 언급했듯이, 설정 매개 변수에 추가해야합니다
cV2

3
작동하지 않습니다. 애니메이션과 함께 뷰의 실제 크기를 변경하고 싶습니다. 내용 만 변경합니다. 스케일 Y를 1.0에서 0.0으로 변경하고 애니메이션이 발생하지만 뷰가 있던 곳에 빈 공간이 남습니다. 또한 View.GONE을 시도했지만 다른 뷰를 빈 공간에 스냅합니다. 축소하는 동안 배율보기의 크기를 따르려면 다른보기가 필요합니다. 작동하게하는 방법?
Sudhanshu

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

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();. (후자의 호출은 다시 계산 될 필요가 있다는 견해 트리를 통보 할 필요가 있습니다.)
월터 Mundt

2
이것은 일을하는 믿을 수 없을 정도로 우회적 인 방법입니다. 해야 할 일은 속성을 설정 android:fillEnabled하고 android:fillAfter둘 다 참이되는 것입니다.
Neil Traft

1

실제로 사용중인 애니메이션이 Android 프레임 워크에 포함 된 것 같아서 어떤 것도 변경할 수 있는지 잘 모르겠습니다.
그러나 설명서의 예제를 따라 자신 만의 애니메이션을 만들 수 있습니다 . 그리고 애니메이션이 끝난 후에도 스케일링을 유지하려면 android : fillAfter = "true"를 넣어야합니다.


2
scaleUp150은 내가 xml로 작성한 사용자 정의 애니메이션입니다 (매우 기본적이지만). 애니메이션 내부 fillAfter = "true"를하지만 여전히 다시 원래 크기로 스냅 : 나는 안드로이드를 뒀다 S를
justinl

1

android : fillAfter = "true"를 SET 태그에 넣습니다. 애니메이션 태그에 넣으면 "전환 매개 변수"또는 "매개 변수를 애니메이션하는 동안 / 중"으로 제한됩니다. SET의 매개 변수는 애니메이션이 완료된 후 찾고있는 변환을 적용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.