백그라운드에서의 사용자 상호작용이나 처리로 인해 화면의 객체를 재배치해야 하는 경우가 많습니다. 객체 위치를 업데이트하면 한 영역에서 다른 영역으로 깜박임이 발생하므로 이 방식 대신 애니메이션을 사용하여 객체를 시작 위치에서 끝 위치로 이동합니다.
Android에서 화면에서 뷰 객체의 위치를 변경할 수 있는 한 가지 방법은 ObjectAnimator를 사용하는 것입니다. 객체가 놓일 종료 위치와 애니메이션 재생 시간을 제공합니다. 시간 보간기를 사용하여 애니메이션의 가속 또는 감속을 제어할 수도 있습니다.
ObjectAnimator로 뷰 위치 변경
ObjectAnimator API는 지정된 시간 동안 뷰의 속성을 변경하는 방법을 제공합니다.
이 API에는 애니메이션하는 속성 유형에 따라 ObjectAnimator의 인스턴스를 만드는 정적 메서드가 포함되어 있습니다. 화면에서 뷰 위치를 변경할 때는 translationX 및 translationY 속성을 사용합니다.
다음은 2초 동안 화면 왼쪽에서 100픽셀 떨어진 위치로 뷰를 이동하는 ObjectAnimator의 예입니다.
변환 값이 부동 소수점 수여야 하므로 이 예에서는 ObjectAnimator.ofFloat() 메서드를 사용합니다. 첫 번째 매개변수는 애니메이션을 적용할 뷰입니다. 두 번째 매개변수는 애니메이션하는 속성입니다. 뷰를 가로로 이동해야 하므로 translationX 속성이 사용됩니다. 마지막 매개변수는 애니메이션의 끝 값입니다. 이 예에서 값 100은 화면 왼쪽으로부터 몇 픽셀 떨어진 위치를 나타냅니다.
다음 메서드는 애니메이션의 재생 시간을 밀리초 단위로 지정합니다. 이 예에서 애니메이션은 2초 (2, 000밀리초) 동안 실행됩니다.
ObjectAnimator를 사용하는 것이 편리하지만 기본적으로 시작점과 종료점 사이의 직선을 따라 뷰의 위치가 변경됩니다. 머티리얼 디자인은 화면에서 객체의 공간 이동과 애니메이션 시간에 곡선을 사용합니다. 곡선 모션을 사용하면 앱에 질감을 더 부여할 수 있고 애니메이션을 좀 더 흥미롭게 만들 수 있습니다.
자체 경로 정의
ObjectAnimator 클래스에는 경로와 함께 한 번에 두 개 이상의 속성을 사용하여 좌표에 애니메이션을 적용할 수 있는 생성자가 있습니다. 예를 들어 다음 애니메이터는 Path 객체를 사용하여 뷰의 X 및 Y 속성에 애니메이션을 적용합니다.
Kotlin
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){valpath=Path().apply{arcTo(0f,0f,1000f,1000f,270f,-180f,true)}valanimator=ObjectAnimator.ofFloat(view,View.X,View.Y,path).apply{duration=2000start()}}else{// Create animator without using curved path}
자바
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){Pathpath=newPath();path.arcTo(0f,0f,1000f,1000f,270f,-180f,true);ObjectAnimatoranimator=ObjectAnimator.ofFloat(view,View.X,View.Y,path);animator.setDuration(2000);animator.start();}else{// Create animator without using curved path}
다음은 원호 애니메이션의 모습입니다.
그림 1. 곡선 경로 애니메이션.
Interpolator은
이징 곡선의 구현입니다. 이완 곡선 개념에 관한 자세한 내용은 Material Design 문서를 참고하세요. Interpolator는 애니메이션의 특정 값이 시간 함수로 계산되는 방식을 정의합니다. 시스템은 Material Design 사양에서 세 가지 기본 커브에 대한 XML 리소스를 제공합니다.
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 Oracle 계열사의 상표 또는 등록 상표입니다.
최종 업데이트: 2025-07-27(UTC)
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["필요한 정보가 없음","missingTheInformationINeed","thumb-down"],["너무 복잡함/단계 수가 너무 많음","tooComplicatedTooManySteps","thumb-down"],["오래됨","outOfDate","thumb-down"],["번역 문제","translationIssue","thumb-down"],["샘플/코드 문제","samplesCodeIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2025-07-27(UTC)"],[],[],null,["# Move a View with animation\n\nTry the Compose way \nJetpack Compose is the recommended UI toolkit for Android. Learn how to use Animations in Compose. \n[Animate position →](/develop/ui/compose/animation/quick-guide#animate-position) \n\n\u003cbr /\u003e\n\nObjects on screen often need to be repositioned due to user interaction or\nprocessing behind the scenes. Instead of immediately updating the object's\nposition, which causes it to blink from one area to another, use an animation to\nmove it from the starting position to its end position.\n\nOne way that Android lets you reposition your view objects on screen is by\nusing [`ObjectAnimator`](#UseObjectAnimator). You provide the end position you\nwant the object to settle in as well as the duration of the animation. You can\nalso use time interpolators to control the acceleration or deceleration of the\nanimation.\n\nChange the view position with ObjectAnimator\n--------------------------------------------\n\nThe [`ObjectAnimator`](/reference/android/animation/ObjectAnimator)\nAPI provides a way to change the properties of a view with a specified duration.\nIt contains static methods to create instances of `ObjectAnimator` depending on\nwhat type of attribute you are animating. When repositioning your views on\nscreen, use the `translationX` and `translationY` attributes.\n\nHere's an example of an `ObjectAnimator` that moves the view to a position 100\npixels from the left of the screen in 2 seconds: \n\n### Kotlin\n\n```kotlin\nObjectAnimator.ofFloat(view, \"translationX\", 100f).apply {\n duration = 2000\n start()\n}\n```\n\n### Java\n\n```java\nObjectAnimator animation = ObjectAnimator.ofFloat(view, \"translationX\", 100f);\nanimation.setDuration(2000);\nanimation.start();\n```\n\nThis example uses the\n[`ObjectAnimator.ofFloat()`](/reference/android/animation/ObjectAnimator#ofFloat(T,%20android.util.Property%3CT,%20java.lang.Float%3E,%20android.util.Property%3CT,%20java.lang.Float%3E,%20android.graphics.Path))\nmethod, because the translation values have to be floats. The first parameter is\nthe view you want to animate. The second parameter is the property you are\nanimating. Since the view needs to move horizontally, the `translationX`\nproperty is used. The last parameter is the end value of the animation. In this\nexample, the value of 100 indicates a position that many pixels from the left of\nthe screen.\n\nThe next method specifies how long the animation takes, in milliseconds. In this\nexample, the animation runs for 2 seconds (2000 milliseconds).\n\nThe last method causes the animation to run, which updates the view's position\non screen.\n\nFor more information about using `ObjectAnimator`, see [Animate using\nObjectAnimator](/guide/topics/graphics/prop-animation#object-animator).\n\nAdd curved motion\n-----------------\n\nWhile using the `ObjectAnimator` is convenient, by default it repositions the\nview along a straight line between the starting and ending points. Material\ndesign relies on curves for spatial movement of objects on the screen and the\ntiming of an animation. Using curved motion gives your app a more material feel\nwhile making your animations more interesting.\n\n### Define your own path\n\nThe `ObjectAnimator` class has constructors that let you animate coordinates\nusing two or more properties at once along with a path. For\nexample, the following animator uses a\n[`Path`](/reference/android/graphics/Path) object to animate the X and Y\nproperties of a view: \n\n### Kotlin\n\n```kotlin\nif (Build.VERSION.SDK_INT \u003e= Build.VERSION_CODES.LOLLIPOP) {\n val path = Path().apply {\n arcTo(0f, 0f, 1000f, 1000f, 270f, -180f, true)\n }\n val animator = ObjectAnimator.ofFloat(view, View.X, View.Y, path).apply {\n duration = 2000\n start()\n }\n} else {\n // Create animator without using curved path\n}\n```\n\n### Java\n\n```java\nif (Build.VERSION.SDK_INT \u003e= Build.VERSION_CODES.LOLLIPOP) {\n Path path = new Path();\n path.arcTo(0f, 0f, 1000f, 1000f, 270f, -180f, true);\n ObjectAnimator animator = ObjectAnimator.ofFloat(view, View.X, View.Y, path);\n animator.setDuration(2000);\n animator.start();\n} else {\n // Create animator without using curved path\n}\n```\n\nHere is what the arc animation looks like:\n\n**Figure 1.** A curved path animation.\n\nAn [`Interpolator`](/develop/ui/views/animations/prop-animation#interpolators)\nis an implementation of an easing curve. See the\n[Material Design documentation](https://m3.material.io/styles/motion/easing-and-duration/applying-easing-and-duration)\nfor more information about the concept of easing curves. An `Interpolator`\ndefines how specific values in an animation are calculated as a function of\ntime. The system provides XML resources for the three basic curves in the\nMaterial Design specification:\n\n- `@interpolator/fast_out_linear_in.xml`\n- `@interpolator/fast_out_slow_in.xml`\n- `@interpolator/linear_out_slow_in.xml`\n\n### Use PathInterpolator\n\nThe\n[`PathInterpolator`](/reference/android/view/animation/PathInterpolator)\nclass is an interpolator introduced in Android 5.0 (API 21). It is based on a\n[Bézier curve](https://en.wikipedia.org/wiki/B%C3%A9zier_curve) or a\n`Path` object. The Android examples in the [Material Design documentation for\neasing](https://m3.material.io/styles/motion/easing-and-duration/tokens-specs#433b1153-2ea3-4fe2-9748-803a47bc97ee)\nuse `PathInterpolator`.\n\n`PathInterpolator` has constructors based on different types of Bézier curves.\nAll Bézier curves have start and end points fixed at `(0,0)` and `(1,1)`,\nrespectively. The other constructor arguments depend on the type of Bézier\ncurve being created.\n\nFor example, for a quadratic Bézier curve only the X and Y coordinates\nof one control point are needed: \n\n### Kotlin\n\n```kotlin\nval myInterpolator = if (Build.VERSION.SDK_INT \u003e= Build.VERSION_CODES.LOLLIPOP) {\n PathInterpolator(0.67f, 0.33f)\n} else {\n LinearInterpolator()\n}\n```\n\n### Java\n\n```java\nInterpolator myInterpolator = null;\nif (Build.VERSION.SDK_INT \u003e= Build.VERSION_CODES.LOLLIPOP) {\n myInterpolator = new PathInterpolator(0.67f, 0.33f);\n} else {\n myInterpolator = new LinearInterpolator();\n}\n```\n\nThis produces an easing curve that starts quickly and decelerates as it\napproaches the end.\n\nThe cubic Bézier constructor similarly has fixed start and end points, but it\nrequires two control points: \n\n### Kotlin\n\n```kotlin\nval myInterpolator = if (Build.VERSION.SDK_INT \u003e= Build.VERSION_CODES.LOLLIPOP) {\n PathInterpolator(0.5f, 0.7f, 0.1f, 1.0f)\n} else {\n LinearInterpolator()\n}\n```\n\n### Java\n\n```java\nInterpolator myInterpolator = null;\nif (Build.VERSION.SDK_INT \u003e= Build.VERSION_CODES.LOLLIPOP) {\n myInterpolator = new PathInterpolator(0.5f, 0.7f, 0.1f, 1.0f);\n} else {\n myInterpolator = new LinearInterpolator();\n}\n```\n\nThis is an implementation of the Material Design [*emphasized\ndecelerate*](https://m3.material.io/styles/motion/easing-and-duration/tokens-specs#cbea5c6e-7b0d-47a0-98c3-767080a38d95)\neasing curve.\n\nFor greater control, an arbitrary `Path` can be used to define the curve: \n\n### Kotlin\n\n```kotlin\nval myInterpolator = if (Build.VERSION.SDK_INT \u003e= Build.VERSION_CODES.LOLLIPOP) {\n val path = Path().apply {\n moveTo(0.0f, 0.0f)\n cubicTo(0.5f, 0.7f, 0.1f, 1.0f, 1.0f, 1.0f)\n }\n PathInterpolator(path)\n} else {\n LinearInterpolator()\n}\n```\n\n### Java\n\n```java\nInterpolator myInterpolator = null;\nif (Build.VERSION.SDK_INT \u003e= Build.VERSION_CODES.LOLLIPOP) {\n Path path = new Path();\n path.moveTo(0.0f, 0.0f);\n path.cubicTo(0.5f, 0.7f, 0.1f, 1.0f, 1.0f, 1.0f);\n myInterpolator = new PathInterpolator(path);\n} else {\n myInterpolator = new LinearInterpolator();\n}\n```\n\nThis produces the same easing curve as the cubic Bézier example, but it uses a\n`Path` instead.\n\nYou can also define a path interpolator as an XML resource: \n\n \u003cpathInterpolator xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:controlX1=\"0.5\"\n android:controlY1=\"0.7\"\n android:controlX2=\"0.1f\"\n android:controlY2=\"1.0f\"/\u003e\n\nOnce you create a `PathInterpolator` object, you can pass it to the\n[`Animator.setInterpolator()`](/reference/android/animation/Animator#setInterpolator(android.animation.TimeInterpolator))\nmethod. The `Animator` uses the interpolator to determine the timing or path\ncurve when it is started. \n\n### Kotlin\n\n```kotlin\nval animation = ObjectAnimator.ofFloat(view, \"translationX\", 100f).apply {\n interpolator = myInterpolator\n start()\n}\n```\n\n### Java\n\n```java\nObjectAnimator animation = ObjectAnimator.ofFloat(view, \"translationX\", 100f);\nanimation.setInterpolator(myInterpolator);\nanimation.start();\n```"]]