안드로이드(Android)

안드로이드 이론 빡공 22

KyeongMin 2020. 7. 7. 18:29
728x90
반응형

**scale.xml**

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <!--확대 축소를 위한 태그
    duration 2.5초 지속
    pivotX 는 가로방향의 중심축이 어디인지
    fromXScale="1.0" 1.0은 원래 내 크기에서 시작
    toXScale="2.0" 2배로 키우겠다 하는것 
    -->
    <scale
        android:duration="2500"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:toXScale="2.0"
        android:toYScale="2.0"
        />
</set>

안드로이드 애니메이션은 뷰에 적용할 수 있고, drawable 객체에 적용할 수 있다.

일단 뷰에 적용하자 일단 버튼을 하나 생성해준다.

**activity_main.xml**

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="확대"/>
</LinearLayout>

**MainActivity.java**

package com.threedpit.myanim;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 우리가 만든 애니메이션을 AnimaionUtils에 LoadAnimaion으로 불러와준다.
               Animation anim = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.scale);
                view.startAnimation(anim);//이렇게 해서 해주면 동작한다.
            }
        });
    }
}

이렇게 구현 해주면 버튼을 클릭했을 때 동작은 아래와 같다.

**자연스럽게 천천히 줄어 들게 하는 방법을 해보자**

**activity_main.xml**

버튼을 하나더 추가 해준다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="확대"/>

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="확대2"/>
</LinearLayout>

**MainActivity.java**

그리고 버튼에 우리가 커졌다 작아지는 동작을 넣어준다.

package com.threedpit.myanim;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 우리가 만든 애니메이션을 AnimaionUtils에 LoadAnimaion으로 불러와준다.
               Animation anim = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.scale);
                view.startAnimation(anim);//이렇게 해서 해주면 동작한다.
            }
        });

        Button button2 = findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 우리가 만든 애니메이션을 AnimaionUtils에 LoadAnimaion으로 불러와준다.
                Animation anim2 = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.scale2);
                view.startAnimation(anim2);//이렇게 해서 해주면 동작한다.
            }
        });

    }
}

 

 

페이지 슬라이딩

일단 화면 구성을

**activity_main.xml**

 

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#5555FF"
        android:orientation="vertical" />

    <LinearLayout
        android:id="@+id/page"
        android:layout_width="200dp"
        android:layout_height="match_parent"
        android:layout_gravity="right"
        android:background="#FFFF66"
        android:orientation="vertical"
        android:visibility="gone">

    </LinearLayout>

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right|center_vertical"
        android:text="열기" />

</FrameLayout>

이렇게 구성을 해줍니다.

그리고 anim이라는 디렉토리를 res폴더 아래에 하나 만들고

그안에 translate_left.xml이라는 것을 하나 더 만들어주세요.

**translate_left.xml**

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator" >
    <!--interpolator는 우리가 애니메이션이 똑같은 속도로 가는게 아니고 다른 속도로
    움직이게 하기 위해 사용한다. -->

    <!--
    repeatCount는 몇번 반복할껀지
    fillAfter 이것은 애니메이션이 끝나고 마지막 위치고 둘것인지
    -->
    <translate
        android:fromXDelta="100%p"
        android:toXDelta="0%p"
        android:duration="500"
        android:repeatCount="0"
        android:fillAfter="true"
        />
</set>

**translate_right.xml**

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator" >
    <!--interpolator는 우리가 애니메이션이 똑같은 속도로 가는게 아니고 다른 속도로
    움직이게 하기 위해 사용한다. -->

    <!--
    repeatCount는 몇번 반복할껀지
    fillAfter 이것은 애니메이션이 끝나고 마지막 위치고 둘것인지
    -->
    <translate
        android:fromXDelta="0%p"
        android:toXDelta="100%p"
        android:duration="500"
        android:repeatCount="0"
        android:fillAfter="true"
        />
</set>

이렇게 두가지 애니메이션을 만들어주세요.

**MainActivity.java**

package com.threedpit.mysliding;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.text.Layout;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.LinearLayout;

public class MainActivity extends AppCompatActivity {
    Animation translateLeftAnim;
    Animation translateRightAnim;

    LinearLayout page;
    Button button ;

    boolean isPageOpen = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        page = findViewById(R.id.page);

        translateLeftAnim = AnimationUtils.loadAnimation(this,R.anim.translate_left);
        translateRightAnim = AnimationUtils.loadAnimation(this,R.anim.translate_right);

        //첫번째 애니메이션이 끝날때 버튼이 열기로 그대로 있는데
        //그 글씨를 닫기로 바꾸고 싶다. 그럴때
        //애니메이션이 종료 되었을 때, 애니메이션이 종료된 정보를 받을 수 있다.
        //그것을 리스너로 받아볼 수 있다.
        SlidingAnimaionListener animListener = new SlidingAnimaionListener();
        translateLeftAnim.setAnimationListener(animListener);
        translateRightAnim.setAnimationListener(animListener);

        button=findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(isPageOpen) {
                    page.startAnimation(translateRightAnim);
                }else {
                    page.setVisibility(View.VISIBLE);// 화면에 보이게 하기
                    page.startAnimation(translateLeftAnim);
                }
            }
        });
    }
    class SlidingAnimaionListener implements Animation.AnimationListener{
        @Override
        public void onAnimationStart(Animation animation) {// 애니메이션 시작하는 시점

        }

        @Override
        public void onAnimationEnd(Animation animation) {//애니메이션 끝나는 시점
            if(isPageOpen){
                page.setVisibility(View.INVISIBLE);// 화면에서 안보이게 하고
                button.setText("열기");// 열기로 버튼을 바꾸고
                isPageOpen = false;//닫힌 상태임을 표시
                 }else{
                button.setText("닫기");//닫기로 버튼을 바꾸고
                isPageOpen = true;//열린 상태임을 표시
            }
        }

        @Override
        public void onAnimationRepeat(Animation animation) {//애니메이션 반복되는 시점점

        }    }
}

728x90
반응형