안드로이드(Android) 다양한 애니메이션 이동(translate) 을 구현하는 여러가지 방법 |
환경: Eclipse Mars, Android 4.2.2 |
안드로이드에서 화면이나 컨트롤, 위젯 등을 이동할 때 애니메이션 효과를 얻고 싶다면 translate 를 사용해 보세요. translate 를 이용하면 아주 간단하게 다양한 효과를 만들수 있습니다. 예제는 이미지를 오른쪽으로 사라지게 하거나 회전하면서 사라지도록 구현했습니다. 개발하는데 참고가 되었으면 합니다.
▼ 안드로이드에서 제공하는 translate 는 다양한 속성값을 가지고 있습니다 아래는 그 속성값들에 대한 설명입니다. 왼쪽이나 오른쪽으로 움직일려면 fromXScale 을 이용하고 위 아래로 움직일려면 fromYScale 를 이용해야 합니다. 그리고 repeatMode 는 이미지가 사라졌다가 다시 돌아오는 방식입니다. 속성값으로 reverse 를 사용합니다. 사라진 반대 방향에서 나타나므로 자연스럽습니다.
◎ fromXScale : X 의 시작위치
◎ toXScale : X 의 종료 위치
◎ fromYScale : Y의 시작 크기
◎ toYScale : Y의 끝 크기
◎ pivotX : X 좌표의 중심점
◎ pivotY : Y 좌표의 중심점
◎ repeatCount : 반복횟수
◎ repeatMode : 다시 시작할 때 reverse 는 사라진 방향, restart 는 반대방향 나타남
▼ 아래에 셋팅해 놓은 속성값들은 이미지가 오른쪽으로 사라지게 합니다. toXDelta = “100%p” 로 설정하면 이미지가 없어질 때까지 이동합니다. fromXDelta = 0 이므로 제자리에서 시작하겠죠. 그리고 반복은 repeatCount = 1 로 한번 입니다.
anim_translate_right.xml
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/linear_interpolator"> <translate android:fromXDelta="0" android:toXDelta="100%p" android:duration="500" android:repeatCount="1" android:repeatMode="reverse"/> </set>
▼ 다음은 오른쪽이 아닌 왼쪽으로 사라지게 하는 방법입니다. 오른쪽으로 사라지게 하는 속성값과 다른 점은 toXDelta 의 값이 -100%p 입니다. 값이 마이너스라서 반대로 움직입니다.
anim_translate_left.xml
<set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="500" android:fromXDelta="0" android:toXDelta="-100%p" android:repeatCount="1" android:repeatMode="reverse"/> </set>
▼ 세 번째는 translate 와 alpha 요소를 같이 적용했습니다. alpha 는 투명도를 조절하는 XML 요소 입니다. fromAlpha=1 에서 toAlpah=0 이므로 이미지가 흐려지면서 서서히 사라지게 합니다.
anim_translate_alpha.xml
<set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="500" android:fromXDelta="0" android:toXDelta="-100%p" android:repeatCount="1" android:repeatMode="reverse"/> <alpha android:duration="500" android:fromAlpha="1.0" android:toAlpha="0.0" /> </set>
▼ 마지막으로 이미지를 짧게 흔들면서 이동하는 방법입니다. 주로 진동을 주고 싶을 때 많이 이용합니다. 진동 횟수는 cycleInterpolator 요소에서 관리합니다. cycles 속성값에 입력한 숫자 만큼 흔들리게 되는데, 진동할 때 흔들리는 거리는 toXDelta 에 입력한 값으로 합니다.
anim_translate_twits.xml
<set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="1000" android:fromXDelta="0" android:interpolator="@anim/cycle_5" android:toXDelta="10" /> </set>
cycle_5.xml
<cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android" android:cycles="10" />
▼ 아래는 다양한 애니메이션 효과를 구현한 메인 Activity 전체 소스 입니다. 애니메이션 기능을 소스에서 구현하기 위해 XML 값을 읽어와야 겠죠. 그 역할을 AnimationUtils.loadAnimation() 함수가 합니다. 로딩한 XML 값을 ImageView 의 startAnimation() 함수의 인수로 넘기세요.
final Animation animTransRight = AnimationUtils.loadAnimation( this,R.anim.anim_translate_right); mImgView.startAnimation(animTransRight); import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.Button; import android.widget.ImageView; import com.example.sampleandroidinfo.R; public class ImageTranslateActivity extends Activity { ImageView mImgView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_image_translate); mImgView = (ImageView) findViewById(R.id.imgTranslate); final Animation animTransRight = AnimationUtils.loadAnimation( this,R.anim.anim_translate_right); final Animation animTransLeft = AnimationUtils.loadAnimation( this,R.anim.anim_translate_left); final Animation animTransAlpha = AnimationUtils.loadAnimation( this,R.anim.anim_translate_alpha); final Animation animTransTwits = AnimationUtils.loadAnimation( this,R.anim.anim_translate_twits); Button btnRight = (Button) findViewById(R.id.btn_right); Button btnLeft = (Button) findViewById(R.id.btn_left); Button btnAlpha = (Button) findViewById(R.id.btn_alpha); Button btnCycle = (Button) findViewById(R.id.btn_twit); btnRight.setOnClickListener(new OnClickListener() { public void onClick(View v) { mImgView.startAnimation(animTransRight); } }); btnLeft.setOnClickListener(new OnClickListener() { public void onClick(View v) { mImgView.startAnimation(animTransLeft); } }); btnAlpha.setOnClickListener(new OnClickListener() { public void onClick(View v) { mImgView.startAnimation(animTransAlpha); } }); btnCycle.setOnClickListener(new OnClickListener() { public void onClick(View v) { mImgView.startAnimation(animTransTwits); } }); } }
▼ 아래는 메인 Activity 를 구현한 화면 레이아웃 XML 입니다. 종류별 애니메이션 효과를 구현하기 위해 각각 버튼을 추가했습니다.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.imageview.ImageTranslateActivity" > <LinearLayout android:id="@+id/linView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignParentTop="true" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#3F0099" android:gravity="center" android:paddingBottom="@dimen/abc_action_bar_icon_vertical_padding" android:paddingTop="@dimen/abc_action_bar_icon_vertical_padding" android:text="Translate 구현하는 여러가지 방법" android:textColor="#FFFFFF" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > <Button android:id="@+id/btn_right" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="오른쪽" /> <Button android:id="@+id/btn_left" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="왼쪽" /> <Button android:id="@+id/btn_alpha" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="투명" /> <Button android:id="@+id/btn_twit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="흔들기" /> </LinearLayout> </LinearLayout> <ImageView android:id="@+id/imgTranslate" android:layout_width="500px" android:layout_height="500px" android:layout_centerInParent="true" android:src="@drawable/diablo" /> </RelativeLayout>
'안드로이드 개발' 카테고리의 다른 글
안드로이드 개발 Vibration 이용해서 스마트폰 진동 설정하는 방법 (0) | 2018.02.22 |
---|---|
안드로이드 개발 SensorManager, SensorEventListener 이용해서 나침판 구현하기 (0) | 2018.02.12 |
안드로이드 개발 레이아웃 인플레이션(LayoutInflater)으로 추가한 화면 삭제하는 방법 (0) | 2018.01.28 |
안드로이드(Android) SensorManager 와 SensorEventListener 이용해서 x, y, z 축 감지하는 방법 (0) | 2018.01.26 |
안드로이드 개발 서비스 바인딩 (Service Bind) 예제 구현하는 방법 (0) | 2018.01.18 |
안드로이드 개발 레이아웃 인플레이션(LayoutInflater)으로 화면 구성하는 방법 (0) | 2018.01.04 |
안드로이드 개발 setId() 에러 Expected resource of type id 해결하는 방법 (0) | 2018.01.02 |
안드로이드 개발 Activity 호출하고 결과값을 받는 onActivityForResult 사용하는 방법 (0) | 2017.12.30 |