슬라이드 업 / 다운 애니메이션으로보기 표시 및 숨기기


318

나는이 LinearLayout내가 보여이나와 숨기려는 것을 Animation나는 그것의 가시성을 변경할 때마다 위쪽으로 레이아웃을 못살게 굴지 또는 아래쪽으로.

나는 몇 가지 샘플을 보았지만 그 중 어느 것도 내 요구에 맞지 않습니다.

애니메이션에 대해 두 개의 xml 파일을 만들었지 만의 표시 여부를 변경할 때 시작하는 방법을 모르겠습니다 LinearLayout.

답변:


639

Android 3.0 (Honeycomb)에 도입 된 새로운 애니메이션 API를 사용하면 이러한 애니메이션을 만드는 것이 매우 간단합니다.

View거리만큼 아래로 슬라이딩 :

view.animate().translationY(distance);

나중에 View다음과 같이 원래 위치로 다시 밀어 넣을 수 있습니다 .

view.animate().translationY(0);

여러 애니메이션을 쉽게 결합 할 수도 있습니다. 다음 애니메이션은 View높이를 아래로 슬라이드 하여 동시에 페이드 인합니다.

// Prepare the View for the animation
view.setVisibility(View.VISIBLE);
view.setAlpha(0.0f);

// Start the animation
view.animate()
    .translationY(view.getHeight())
    .alpha(1.0f)
    .setListener(null);

그런 다음 View뒤로 물러서서 원래 위치로 밀어 넣을 수 있습니다 . 또한 애니메이션이 완료되면 뒤로 AnimatorListener의 가시성을 설정할 수 있도록 설정했습니다 .ViewGONE

view.animate()
    .translationY(0)
    .alpha(0.0f)
    .setListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            super.onAnimationEnd(animation);
            view.setVisibility(View.GONE);
        }
    });

1
왜 사라지면 왜 보이지 않습니까?
Ram

1
표시되거나 사라 졌을 때 뷰에 애니메이션을 적용하고 싶습니다. 그러나 내가 처음으로 갔다 .it 볼 수없고 시야가 비어있는 경우
Ram

3
@Ram View가시성이 설정되어있을 때 애니메이션으로 무엇을 달성하려고 View.GONE합니까? 이 외에 아무것도에 대한 가시성을 설정하면 View.VISIBLE다음은 View표시되지 않습니다. 나는 당신이 무엇을 요구하는지 이해하지 못합니다. 당신이 당신의 애니메이션을 볼 수 있도록하려면 다음의 가시성 설정하지 마십시오 View에를 View.GONE.
Xaver Kapeller 2018 년

2
램이 직면 한 것과 같은 문제에 직면했을 때 처음에는 정상적으로 작동하지만 다음 번에는 해당보기를 사라진 상태로 만들고 해당보기를 다시 표시하려고하면 나타나지 않습니다.
Pankaj kumar

12
@XaverKapeller 많은 사람들이 겪고있는 문제 onAnimationEnd는 다중 발생 애니메이션을 위해 매번 청취자 가 호출된다는 것 onAnimationEnd입니다. 즉 , 뷰가 표시 될 때 호출되어 가시성을 사라짐 등으로 설정합니다.
oldergod

129

허용되는 답변을 적용하는 데 어려움을 겪고있었습니다. 좀 더 문맥이 필요했습니다. 이제 알아 냈습니다. 전체 예는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

MainActivity.java

public class MainActivity extends AppCompatActivity {

    Button myButton;
    View myView;
    boolean isUp;

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

        myView = findViewById(R.id.my_view);
        myButton = findViewById(R.id.my_button);

        // initialize as invisible (could also do in xml)
        myView.setVisibility(View.INVISIBLE);
        myButton.setText("Slide up");
        isUp = false;
    }

    // slide the view from below itself to the current position
    public void slideUp(View view){
        view.setVisibility(View.VISIBLE);
        TranslateAnimation animate = new TranslateAnimation(
                0,                 // fromXDelta
                0,                 // toXDelta
                view.getHeight(),  // fromYDelta
                0);                // toYDelta
        animate.setDuration(500);
        animate.setFillAfter(true);
        view.startAnimation(animate);
    }

    // slide the view from its current position to below itself
    public void slideDown(View view){
        TranslateAnimation animate = new TranslateAnimation(
                0,                 // fromXDelta
                0,                 // toXDelta
                0,                 // fromYDelta
                view.getHeight()); // toYDelta
        animate.setDuration(500);
        animate.setFillAfter(true);
        view.startAnimation(animate);
    }

    public void onSlideViewButtonClick(View view) {
        if (isUp) {
            slideDown(myView);
            myButton.setText("Slide up");
        } else {
            slideUp(myView);
            myButton.setText("Slide down");
        }
        isUp = !isUp;
    }
}

activity_mail.xml

<?xml version="1.0" encoding="utf-8"?>
<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.slideview.MainActivity">

    <Button
        android:id="@+id/my_button"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="100dp"
        android:onClick="onSlideViewButtonClick"
        android:layout_width="150dp"
        android:layout_height="wrap_content"/>

    <LinearLayout
        android:id="@+id/my_view"
        android:background="#a6e1aa"
        android:orientation="vertical"
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:layout_height="200dp">

    </LinearLayout>

</RelativeLayout>

노트

  • 올바른 방향으로 나를 가리켜 주신 이 기사 덕분 입니다. 이 페이지의 다른 답변보다 도움이되었습니다.
  • 화면에서보기로 시작하려면으로 초기화하지 마십시오 INVISIBLE.
  • 화면에서 완전히 애니메이션 효과를주기 때문에 다시 설정할 필요가 없습니다 INVISIBLE. 그래도 화면에서 완전히 애니메이션을 적용하지 않는 경우 알파 애니메이션을 추가하고로 가시성을 설정할 수 있습니다 AnimatorListenerAdapter.
  • 속성 애니메이션 문서

android : visibility = "invisible"보기 애니메이션을 숨기기로 초기화
Goodlife

2
animate.setFillAfter (true);의 사용을 권장하지 않습니다. 슬라이드보기 아래에 클릭 가능한보기가있는 경우 이벤트를받지 않습니다.
HOCiNE BEKKOUCHE

2
없이 통지 .setVisibility(View.INVISIBLE);기능까지 슬라이드로 작동하지 않습니다 시각적으로 기대했다.
Advait S

Translate Animation보기를 이동합니다. 스케일링 자체와 같은 뷰를 애니메이션하려면ScaleAnimation anim = new ScaleAnimation(1, 1, 0, 1)
Zohab Ali

33

이제 가시성 변경 애니메이션은 Transition API지원 (androidx) 패키지에서 사용 가능한 것을 통해 수행되어야 합니다. 슬라이드 전환으로 TransitionManager.beginDelayedTransition 메소드를 호출 한 다음보기의 가시성을 변경하십시오.

여기에 이미지 설명을 입력하십시오

import androidx.transition.Slide;
import androidx.transition.Transition;
import androidx.transition.TransitionManager;

private void toggle(boolean show) {
    View redLayout = findViewById(R.id.redLayout);
    ViewGroup parent = findViewById(R.id.parent);

    Transition transition = new Slide(Gravity.BOTTOM);
    transition.setDuration(600);
    transition.addTarget(R.id.redLayout);

    TransitionManager.beginDelayedTransition(parent, transition);
    redLayout.setVisibility(show ? View.VISIBLE : View.GONE);
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/parent"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="play" />

    <LinearLayout
        android:id="@+id/redLayout"
        android:layout_width="match_parent"
        android:layout_height="400dp"
        android:background="#5f00"
        android:layout_alignParentBottom="true" />
</RelativeLayout>

다른 기본 및 사용자 정의 전환 예제를 사용 하여이 답변 을 확인하십시오 .


@akubi 예,
Aba

1
가장 쉽고 쉬운 답변 중 하나! 감사!
krisDrOid

참고로minSdkVersion 21
lasec0203

@ lasec0203 아니요, 클래스는 androidx패키지 에서 제공 됩니다. 21 api 이전에는 잘 작동합니다.
ashakirov

: thumbs_up : 이것은 내가 받고 있던 방법 모호성 오류를 제거했습니다
lasec0203

30

가장 쉬운 솔루션 : android:animateLayoutChanges="true"뷰를 유지하는 컨테이너에 설정 하십시오.

일부 컨텍스트에 배치하려면 다음과 같은 레이아웃이있는 경우이 컨테이너의보기에 대한 모든 가시성 변경 사항이 자동으로 애니메이션됩니다.

<LinearLayout android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:animateLayoutChanges="true"
    >

    <Views_which_change_visibility>

</LinearLayout>

레이아웃 변경 애니메이션 적용-Android 개발자 에서 이에 대한 자세한 내용을 확인할 수 있습니다


가장 쉬운 방법이지만 전화 제조업체에 따라 동작이 다르며 코드 변경 사항도 있습니다.
b2mob

위치가 아닌 알파에 애니메이션을 적용합니다.
Suragch

그렇습니다. 그러나 그것이 올바르게 이해한다면 원래의 질문이었습니다. 위치에 애니메이션을 적용하려면 안정적인 ID를 가진 ViewHolders를 사용하는 RecyclerView를 사용할 수 있습니다.
Stefan Medack 18:32에

12

의 하위 클래스를 새로 만들고 재정 의하여을 ( 를) 재정 의하여 변경 내용을 Animation표시 할 때 올바른 시작을 시작할 수 있습니다 . 다음과 같은 것을 고려하십시오.LinearLayoutLinearLayoutsetVisibility()Animations

public class SimpleViewAnimator extends LinearLayout
{
    private Animation inAnimation;
    private Animation outAnimation;

    public SimpleViewAnimator(Context context)
    {
        super(context);
    }

    public void setInAnimation(Animation inAnimation)
    {
        this.inAnimation = inAnimation;
    }

    public void setOutAnimation(Animation outAnimation)
    {
        this.outAnimation = outAnimation;
    }

    @Override
    public void setVisibility(int visibility)
    {
        if (getVisibility() != visibility)
        {
            if (visibility == VISIBLE)
            {
                if (inAnimation != null) startAnimation(inAnimation);
            }
            else if ((visibility == INVISIBLE) || (visibility == GONE))
            {
                if (outAnimation != null) startAnimation(outAnimation);
            }
        }

        super.setVisibility(visibility);
    }
}

1
실제로 서브 클래스 접근 방식이 더 좋습니다. 대단히 감사합니다.
MichelReap

1
이것은 BaseView에서 구현할 멋진 솔루션입니다. 이것에 대한 Thx!
Bram Vandenbussche

1
표시 할 때 작동하므로 숨기면 애니메이션이 표시되기 전에 뷰가 사라집니다. 해결 방법이 있습니까?
Bernardo

12
@BramVandenbussche 이것은 끔찍한 해결책입니다. 그것은 결코 당신이 원하는 View것이 아닌 자체 애니메이션을 책임지게합니다 . View앱의 다른 부분 에서 다르게 애니메이션을 적용한다고 가정 해보십시오. 그럼 어떻게합니까? 가시성을 자동으로 애니메이션하지 않으려면 플래그를 추가 하시겠습니까? 애니메이션을 제거하기 위해 서브 클래 싱 View및 재정의 setVisibility()? 아니면 setVisibility()다른 애니메이션으로 더 나쁜 구현 을 하시겠습니까? 거기에서 더 추악 해지고 더 추해집니다. 이 "솔루션"을 사용하지 마십시오.
Xaver Kapeller

3
더 나은 전화로 AnimatedLinearLayout
Roel

12

코 틀린

를 기반으로 Suragch대답 , 여기보기 확장을 사용하여 우아한 방법입니다 :

fun View.slideUp(duration: Int = 500) {
    visibility = View.VISIBLE
    val animate = TranslateAnimation(0f, 0f, this.height.toFloat(), 0f)
    animate.duration = duration.toLong()
    animate.fillAfter = true
    this.startAnimation(animate)
}

fun View.slideDown(duration: Int = 500) {
    visibility = View.VISIBLE
    val animate = TranslateAnimation(0f, 0f, 0f, this.height.toFloat())
    animate.duration = duration.toLong()
    animate.fillAfter = true
    this.startAnimation(animate)
}

그런 다음 어디에서 사용 myView.slideUp()하든myView.slideDown()


자식 뷰 클릭 접근성을 차단하므로 "fillAfter = true"가 필요하지 않습니다.
Ranjan

또한 slideDown 애니메이션에 리스너를 추가하고 뷰를 onAnimationEnd로 이동해야 할 수도 있습니다.
마노 하르 레디

9
if (filter_section.getVisibility() == View.GONE) {
    filter_section.animate()
            .translationY(filter_section.getHeight()).alpha(1.0f)
            .setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationStart(Animator animation) {
                    super.onAnimationStart(animation);
                    filter_section.setVisibility(View.VISIBLE);
                    filter_section.setAlpha(0.0f);
                }
            });
} else {
    filter_section.animate()
            .translationY(0).alpha(0.0f)
            .setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    super.onAnimationEnd(animation);
                    filter_section.setVisibility(View.GONE);
                }
            });
}

10
이 답변의 문제 : 1) 끔찍한 코드 형식. 2) 코드 스 니펫을 사용하여 실제로 브라우저에서 실행할 수없는 코드를 게시합니다. 이것은 쓸모없는 버튼 두 개를 추가 할뿐만 아니라 구문 강조를 파괴합니다. 3) 설명이나 목적이없는 임의의 코드 덤프 일뿐입니다. 4) 애니메이션을 수행하는 동안 가시성을 변경하고 있습니다. 이것은 명백한 코드 냄새라는 사실을 제외하고는 제대로 작동하지 않습니다. 가시성을 변경하면 새로운 레이아웃 프로세스가 시작됩니다. 완료된 후에 만 ​​애니메이션에 실제로 작업 할 값이 있습니다. 목록은 계속해서 ...
Xaver Kapeller

서식을 수정하기 위해 이미 답변을 편집하고 코드 스 니펫을 실제 코드 블록으로 바꿨습니다. 그러나 당신은 나머지를 작성해야합니다 ...
Xaver Kapeller

죄송하지만 친구가있어서 잘 작동하지 않기 때문에 코드를 만들었습니다.이 코드는 작동합니다. 그러나 게시하는 방식에 필요한 변경 사항은 동의합니다.
Ameen Maheen

@AmeenMaheen 무엇입니까 setAlpha?
IgorGanapolsky

@ Igor Ganapolsky 그것은 투명성, 즉 페이딩 효과를주는 데 사용됩니다
Ameen Maheen

4

Android 앱에서 벨로우즈 코드를 사용하여 모든보기 또는 레이아웃을 위아래로 슬라이드 할 수 있습니다

boolean isClicked=false;
LinearLayout mLayoutTab = (LinearLayout)findViewById(R.id.linearlayout);

        if(isClicked){
                    isClicked = false;
                    mLayoutTab.animate()
                    .translationYBy(120)
                    .translationY(0)     
                    .setDuration(getResources().getInteger(android.R.integer.config_mediumAnimTime));

        }else{
                isClicked = true;
                mLayoutTab.animate()
                .translationYBy(0)
                .translationY(120)
                .setDuration(getResources().getInteger(android.R.integer.config_mediumAnimTime));
                }

120은 무엇입니까? 그리고 0은 무엇입니까? 이것을 하드 코딩하고 싶다면 setDuration의 단위는 무엇입니까?
stanley santoso

1
여기서 120과 0은 큰 화면이나 태블릿에서 문제를 얻는 것보다 하드 코드를 넣는 경우 Y 축과 관련된 거리이므로 모든 다른 장치에 대해 string.xml 값의 값을 입력해야합니다. 지속 시간은 레이아웃의 애니메이션을 표시하려는 시간입니다 .... !!! 영어 실력이 미안해 ...!
varotariya vajsi

@varotariyavajsi 실제로 뷰의 가시성을 표시하거나 숨기는 것은 아닙니다.
IgorGanapolsky

안녕하세요 igor ganapolsky 나는 이것을 알고 있습니다 ...보기를 y 방향으로 변환합니다. 사용자가 하단 슬라이더처럼 위아래로 표시 해야하는 경우 제대로 작동합니다.
varotariya vajsi

4

이 수업을 사용하십시오 :

public class ExpandCollapseExtention {

 public static void expand(View view) {
    view.setVisibility(View.VISIBLE);

    final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
    final int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
    view.measure(widthSpec, heightSpec);

    ValueAnimator mAnimator = slideAnimator(view, 0, view.getMeasuredHeight());
    mAnimator.start();
}


public static void collapse(final View view) {
    int finalHeight = view.getHeight();

    ValueAnimator mAnimator = slideAnimator(view, finalHeight, 0);

    mAnimator.addListener(new Animator.AnimatorListener() {

        @Override
        public void onAnimationEnd(Animator animator) {               
            view.setVisibility(View.GONE);
        }


        @Override
        public void onAnimationStart(Animator animation) {

        }


        @Override
        public void onAnimationCancel(Animator animation) {

        }


        @Override
        public void onAnimationRepeat(Animator animation) {

        }
    });
    mAnimator.start();
}


private static ValueAnimator slideAnimator(final View v, int start, int end) {

    ValueAnimator animator = ValueAnimator.ofInt(start, end);

    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {

            int value = (Integer) valueAnimator.getAnimatedValue();
            ViewGroup.LayoutParams layoutParams = v.getLayoutParams();
            layoutParams.height = value;
            v.setLayoutParams(layoutParams);
        }
    });
    return animator;
}
}

3

ObjectAnimator 사용

private fun slideDown(view: View) {
    val height = view.height
    ObjectAnimator.ofFloat(view, "translationY", 0.toFloat(), height.toFloat()).apply {
        duration = 1000
        start()
    }
}

private fun slideUp(view: View) {
    val height = view.height
    ObjectAnimator.ofFloat(view, "translationY", height.toFloat(),0.toFloat()).apply {
        duration = 1000
        start()
    }
}

2
사소한 개선 : "translationY"대신 상수 View.TRANSLATION_Y를 사용할 수 있으며 슬라이드 업 ObjectAnimation에서도 .apply {doOnEnd {view.visibility = View.GONE} .......}. start ()를 수행 할 수 있습니다.
tashi

0.toFloat()또한 단지가 될 수0f
styler1972

2

뷰 높이가 여전히 zero너무나 코너 케이스가 있었다 ...

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.view.View;

public final class AnimationUtils {

  public static void slideDown(final View view) {
        view.animate()
                .translationY(view.getHeight())
                .alpha(0.f)
                .setListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        // superfluous restoration
                        view.setVisibility(View.GONE);
                        view.setAlpha(1.f);
                        view.setTranslationY(0.f);
                    }
                });
    }

    public static void slideUp(final View view) {
        view.setVisibility(View.VISIBLE);
        view.setAlpha(0.f);

        if (view.getHeight() > 0) {
            slideUpNow(view);
        } else {
            // wait till height is measured
            view.post(new Runnable() {
                @Override
                public void run() {
                    slideUpNow(view);
                }
            });
        }
    }

    private static void slideUpNow(final View view) {
        view.setTranslationY(view.getHeight());
        view.animate()
                .translationY(0)
                .alpha(1.f)
                .setListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        view.setVisibility(View.VISIBLE);
                        view.setAlpha(1.f);
                    }
                });
    }

}

1

여기 내 해결책이 있습니다. 뷰에 대한 참조를 얻고이 메소드를 호출하십시오.

public static void animateViewFromBottomToTop(final View view){

    view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

        @Override
        public void onGlobalLayout() {

            view.getViewTreeObserver().removeOnGlobalLayoutListener(this);

            final int TRANSLATION_Y = view.getHeight();
            view.setTranslationY(TRANSLATION_Y);
            view.setVisibility(View.GONE);
            view.animate()
                .translationYBy(-TRANSLATION_Y)
                .setDuration(500)
                .setStartDelay(200)
                .setListener(new AnimatorListenerAdapter() {

                    @Override
                    public void onAnimationStart(final Animator animation) {

                        view.setVisibility(View.VISIBLE);
                    }
                })
                .start();
        }
    });
}

다른 것을 할 필요가 없습니다 =)


1
왜 이것을하기 위해 GlobalLayoutListener가 필요할까요? 왜 그렇게 이상한 방식으로 가시성을 설정합니까? 왜 대답에 의문이없는 시작 지연과 같은 것들을 포함하고 있습니까?
Xaver Kapeller

1

코 틀린에서 수 라흐의 대답. 이것은 나를 위해 일했습니다.

class MainActivity : AppCompatActivity() {

var isUp: Boolean = false

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    var myView: View = findViewById(R.id.my_view)
    var myButton: Button = findViewById(R.id.my_button)

    //Initialize as invisible
    myView.visibility = View.INVISIBLE
    myButton.setText("Slide up")

    isUp = false

}


fun View.slideUp(duration: Int = 500){
    visibility = View.VISIBLE
    val animate = TranslateAnimation(0f, 0f, this.height.toFloat(), 0f)
    animate.duration = duration.toLong()
    animate.fillAfter = true
    this.startAnimation(animate)
}

fun View.slideDown(duration: Int = 500) {
    visibility = View.VISIBLE
    val animate = TranslateAnimation(0f, 0f, 0f, this.height.toFloat())
    animate.duration = duration.toLong()
    animate.fillAfter = true
    this.startAnimation(animate)
}

fun onSlideViewButtonClick(view: View){
    if(isUp){
        my_view.slideDown()
        my_button.setText("Slide Up")

    }
    else{
        my_view.slideUp()
        my_button.setText("Slide Down")
    }
    isUp = !isUp
}

}


0

간단한 세 줄의 코드를 사용하여 애니메이션을 표시 할 수 있습니다 ...

//getting the hiding view by animation

 mbinding.butn.setOnClickListener {

                val SlideOutLeft = AnimationUtils.loadAnimation(this, R.anim.slide_out_left)
                simplelayout.visibility = View.INVISIBLE
                simplelayout.startAnimation(SlideOutLeft)


                val SlideInRight = AnimationUtils.loadAnimation(applicationContext, R.anim.slide_in_right)
                animation1.visibility = View.VISIBLE
                animation1.startAnimation(SlideInRight)

            }
            //again unhide the view animation
            mbinding.buttn.setOnClickListener {


               val SlideInLeft=AnimationUtils.loadAnimation(this,R.anim.slide_in_left)
                //set the layout
               simplelayout.visibility=View.VISIBLE
               simplelayout.startAnimation(SlideInLeft)

               val SlideOutRight=AnimationUtils.loadAnimation(this,R.anim.slide_out_right)
               animation1.visibility=View.INVISIBLE
               animation1.startAnimation(SlideOutRight)

            }

0

Kotlin 확장을 사용하면 다음을 사용할 수 있습니다.

enum class SlideDirection{
    UP,
    DOWN,
    LEFT,
    RIGHT
}

enum class SlideType{
    SHOW,
    HIDE
}

fun View.slideAnimation(direction: SlideDirection, type: SlideType, duration: Long = 250){
    val fromX: Float
    val toX: Float
    val fromY: Float
    val toY: Float
    val array = IntArray(2)
    getLocationInWindow(array)
    if((type == SlideType.HIDE && (direction == SlideDirection.RIGHT || direction == SlideDirection.DOWN)) ||
        (type == SlideType.SHOW && (direction == SlideDirection.LEFT || direction == SlideDirection.UP))   ){
        val displayMetrics = DisplayMetrics()
        val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
        windowManager.defaultDisplay.getMetrics(displayMetrics)
        val deviceWidth = displayMetrics.widthPixels
        val deviceHeight = displayMetrics.heightPixels
        array[0] = deviceWidth
        array[1] = deviceHeight
    }
    when (direction) {
        SlideDirection.UP -> {
            fromX = 0f
            toX = 0f
            fromY = if(type == SlideType.HIDE) 0f else (array[1] + height).toFloat()
            toY = if(type == SlideType.HIDE) -1f * (array[1] + height)  else 0f
        }
        SlideDirection.DOWN -> {
            fromX = 0f
            toX = 0f
            fromY = if(type == SlideType.HIDE) 0f else -1f * (array[1] + height)
            toY = if(type == SlideType.HIDE) 1f * (array[1] + height)  else 0f
        }
        SlideDirection.LEFT -> {
            fromX = if(type == SlideType.HIDE) 0f else 1f * (array[0] + width)
            toX = if(type == SlideType.HIDE) -1f * (array[0] + width) else 0f
            fromY = 0f
            toY = 0f
        }
        SlideDirection.RIGHT -> {
            fromX = if(type == SlideType.HIDE) 0f else -1f * (array[0] + width)
            toX = if(type == SlideType.HIDE) 1f * (array[0] + width) else 0f
            fromY = 0f
            toY = 0f
        }
    }
    val animate = TranslateAnimation(
        fromX,
        toX,
        fromY,
        toY
    )
    animate.duration = duration
    animate.setAnimationListener(object: Animation.AnimationListener{
        override fun onAnimationRepeat(animation: Animation?) {

        }

        override fun onAnimationEnd(animation: Animation?) {
            if(type == SlideType.HIDE){
                visibility = View.INVISIBLE
            }
        }

        override fun onAnimationStart(animation: Animation?) {
            visibility = View.VISIBLE
        }

    })
    startAnimation(animate)
}

확장의 예 :

view.slideAnimation(SlideDirection.UP, SlideType.HIDE)//to make it disappear through top of the screen
view.slideAnimation(SlideDirection.DOWN, SlideType.SHOW)//to make it reappear from top of the screen

view.slideAnimation(SlideDirection.DOWN, SlideType.HIDE)//to make it disappear through bottom of the screen
view.slideAnimation(SlideDirection.UP, SlideType.SHOW)//to make it reappear from bottom of the screen

0

간단한 방법 중 하나 :

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