Ein- und Ausblenden einer Ansicht mit einer Animation nach oben / unten


317

Ich habe eine LinearLayout, die ich mit einer Animationanzeigen oder ausblenden möchte , die das Layout nach oben oder unten schiebt, wenn ich seine Sichtbarkeit ändere.

Ich habe da draußen ein paar Proben gesehen, aber keine davon entspricht meinen Bedürfnissen.

Ich habe zwei XML-Dateien für die Animationen erstellt, weiß aber nicht, wie ich sie starten soll, wenn ich die Sichtbarkeit von a ändere LinearLayout.

Antworten:


638

Mit der neuen Animations-API, die in Android 3.0 (Honeycomb) eingeführt wurde, ist es sehr einfach, solche Animationen zu erstellen.

Um eine ViewStrecke nach unten rutschen:

view.animate().translationY(distance);

Sie können den ViewRücken später wie folgt in seine ursprüngliche Position schieben :

view.animate().translationY(0);

Sie können auch problemlos mehrere Animationen kombinieren. Die folgende Animation schiebt ein ViewBild um seine Höhe nach unten und blendet es gleichzeitig ein:

// 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);

Sie können den ViewRücken dann ausblenden und in seine ursprüngliche Position zurückschieben. Wir stellen auch ein ein, AnimatorListenerdamit wir die Sichtbarkeit des ViewRückens auf einstellen können , GONEsobald die Animation beendet ist:

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

1
Warum ist die Ansicht nicht sichtbar, wenn sie einmal verschwunden ist?
Ram

1
Ich möchte die Ansicht animieren, wenn sie sichtbar und weg ist. aber wenn ich zum ersten Mal gegangen bin, ist es nicht sichtbar und der Ort der Sicht ist leer
Ram

3
@Ram Was möchten Sie erreichen, indem Sie a animieren, Viewwenn seine Sichtbarkeit eingestellt ist View.GONE? Wenn Sie die Sichtbarkeit auf etwas gesetzt außer View.VISIBLEdann die Viewnicht sichtbar sein wird . Ich verstehe nicht, was Sie fragen. Wenn Sie möchten, dass Ihre Animation sichtbar ist, stellen Sie die Sichtbarkeit von Viewto nicht ein View.GONE.
Xaver Kapeller

2
Das gleiche Problem, mit dem Ram konfrontiert war, funktioniert beim ersten Mal einwandfrei, aber ab dem nächsten Mal, wenn ich diese Ansicht in den Status "Verschwunden" versetze und versuche, diese Ansicht wieder sichtbar zu machen, wird sie nicht angezeigt.
Pankaj Kumar

12
@XaverKapeller Ich denke, das Problem, das viele haben, ist, dass der Listener onAnimationEndjedes Mal für eine mehrfach auftretende Animation aufgerufen wird, was bedeutet, dass dies auch onAnimationEndaufgerufen wird, wenn die Ansicht angezeigt wird, wodurch ihre Sichtbarkeit auf Gone usw. gesetzt wird
ältergott

129

Ich hatte Probleme, die akzeptierte Antwort zu verstehen. Ich brauchte etwas mehr Kontext. Nachdem ich es herausgefunden habe, ist hier ein vollständiges Beispiel:

Geben Sie hier die Bildbeschreibung ein

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>

Anmerkungen

  • Vielen Dank an diesen Artikel , der mich in die richtige Richtung gelenkt hat. Es war hilfreicher als die anderen Antworten auf dieser Seite.
  • Wenn Sie mit der Ansicht auf dem Bildschirm beginnen möchten, initialisieren Sie sie nicht als INVISIBLE.
  • Da wir es komplett außerhalb des Bildschirms animieren, müssen Sie es nicht zurücksetzen INVISIBLE. Wenn Sie jedoch nicht vollständig außerhalb des Bildschirms animieren, können Sie eine Alpha-Animation hinzufügen und die Sichtbarkeit mit einem festlegen AnimatorListenerAdapter.
  • Eigenschaftsanimationsdokumente

android: sichtbarkeit = "unsichtbar", um die Ansichtsanimation als Versteck zu initialisieren
Goodlife

2
Ich empfehle nicht die Verwendung von animate.setFillAfter (true); Wenn Sie anklickbare Ansichten unter der verschobenen Ansicht haben, werden keine Ereignisse
empfangen

2
Beachten Sie, dass ohne .setVisibility(View.INVISIBLE);die Slide-Up-Funktion nicht wie visuell erwartet funktioniert.
Advait S

Translate Animationverschiebt die Ansicht. Wenn Sie die Ansicht wie ihre Skalierung selbst animieren möchten, verwenden SieScaleAnimation anim = new ScaleAnimation(1, 1, 0, 1)
Zohab Ali

32

Jetzt sollten Animationen zur Änderung der Sichtbarkeit durchgeführt werden, über Transition APIdie im Support-Paket (androidx) verfügbar ist. Rufen Sie einfach die TransitionManager.beginDelayedTransition- Methode mit Folienübergang auf und ändern Sie dann die Sichtbarkeit der Ansicht.

Geben Sie hier die Bildbeschreibung ein

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>

Überprüfen Sie diese Antwort mit anderen Standard- und benutzerdefinierten Übergangsbeispielen.


1
Was showsoll sein? Ein Boolescher?
Akubi

@akubi Ja, es sollte sein
Aba

1
Eine der besten und einfachsten Antworten! Vielen Dank!
krisDrOid

Nur um zu beachten, dies erfordertminSdkVersion 21
lasec0203

@ lasec0203 nein, Klassen sind aus androidxPaket. Es funktioniert gut auf vor 21 API.
Ashakirov

30

Einfachste Lösung: einstellen android:animateLayoutChanges="true" den Container auf, der Ihre Ansichten enthält.

Um es in einen Kontext zu setzen: Wenn Sie ein Layout wie das folgende haben, werden alle Sichtbarkeitsänderungen an den Ansichten in diesem Container automatisch animiert.

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

    <Views_which_change_visibility>

</LinearLayout>

Weitere Informationen hierzu finden Sie unter Animieren von Layoutänderungen - Android Developer


Es ist das einfachste, aber sein Verhalten unterscheidet sich aufgrund des Telefonherstellers und seiner Codeänderungen
b2mob

Dies animiert das Alpha, nicht die Position.
Suragch

Ja, aber darum ging es bei der ursprünglichen Frage, wenn ich sie richtig verstanden habe. Wenn Sie Positionen animieren möchten, können Sie eine RecyclerView verwenden, die ViewHolders mit stabilen IDs verwendet.
Stefan Medack

12

Sie können das richtige starten Animation Sichtbarkeit der LinearLayoutÄnderungen starten, indem Sie eine neue Unterklasse von erstellen LinearLayoutund überschreiben setVisibility(), um die zu starten Animations. Betrachten Sie so etwas:

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
Der Unterklassenansatz gefällt mir eigentlich besser. Vielen Dank.
MichelReap

1
Dies ist eine großartige Lösung, die ich in meinem BaseView implementieren werde. Danke dafür!
Bram Vandenbussche

1
Da dies beim Anzeigen und Ausblenden funktioniert, verschwindet die Ansicht, bevor die Animation angezeigt wird. Problemumgehungen?
Bernardo

12
@BramVandenbussche Dies ist eine schreckliche Lösung. Es macht den ViewVerantwortlichen für seine eigenen Animationen verantwortlich, was NIE das ist, was Sie wollen. Stellen Sie sich vor, Sie möchten das Viewin einem anderen Teil Ihrer App anders animieren . Was machst du dann? Eine Flagge hinzufügen, um die Sichtbarkeit nicht automatisch zu animieren? Unterklasse Viewund überschreiben setVisibility(), um die Animation zu entfernen? Oder noch schlimmer setVisibility()mit einer anderen Animation umsetzen ? Von da an wird es immer hässlicher. Verwenden Sie diese "Lösung" nicht.
Xaver Kapeller

3
Nennen Sie es besser AnimatedLinearLayout
Roel

12

Kotlin

Basierend auf Suragch ‚s Antwort , hier ist eine elegante Art und Weise anzeigen Erweiterung mit:

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)
}

Und wo immer Sie es verwenden möchten, brauchen Sie nur myView.slideUp()odermyView.slideDown()


Der einzige Fehler ist, dass es nicht "fillAfter = true" benötigt, da es untergeordnete Ansichten blockiert. Klicken Sie auf Barrierefreiheit
Ranjan

Außerdem müssten Sie wahrscheinlich einen Listener zur SlideDown-Animation hinzufügen und die Ansicht auf AnimationEnd deaktivieren.
Manohar Reddy

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
Probleme mit dieser Antwort: 1) Schreckliche Code-Formatierung. 2) Sie verwenden ein Code-Snippet, um Code zu veröffentlichen, der im Browser nicht ausgeführt werden kann. Dies fügt nicht nur zwei nutzlose Schaltflächen hinzu, sondern zerstört auch die Syntaxhervorhebung. 3) Es ist nur ein zufälliger Code-Dump ohne Erklärung oder Zweck. 4) Sie ändern die Sichtbarkeit, während Sie eine Animation ausführen. Abgesehen von der Tatsache, dass dies ein offensichtlicher Codegeruch ist, funktioniert dies auch nicht richtig. Durch Ändern der Sichtbarkeit wird ein neuer Layoutprozess gestartet. Erst wenn dies abgeschlossen ist, verfügt die Animation über Werte, mit denen gearbeitet werden kann. Die Liste geht weiter und weiter ...
Xaver Kapeller

Ich habe Ihre Antwort bereits bearbeitet, um die Formatierung zu korrigieren, und das Codefragment in einen tatsächlichen Codeblock umgewandelt. Aber Sie müssen den Rest ausfüllen ...
Xaver Kapeller

Tut mir leid, Kumpel, ich habe den Code von dir erfunden, weil er für mich nicht gut funktioniert. Dieser Code von mir funktioniert. Aber Änderungen, die bei der Veröffentlichung erforderlich sind, stimme ich zu.
Ameen Maheen

@AmeenMaheen Wofür ist setAlpha?
IgorGanapolsky

@ Igor Ganapolsky wird für Transparenz verwendet, dh um einen verblassenden Effekt zu erzielen
Ameen Maheen

4

Sie können jede Ansicht oder jedes Layout mithilfe des folgenden Codes in der Android-App nach oben und unten verschieben

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));
                }

Was ist 120? und was ist 0? Was ist die Einheit für setDuration, wenn ich dies fest codieren möchte?
Stanley Santoso

1
Hier ist 120 und 0 der Abstand in Bezug auf die Y-Achse, wenn Sie harten Code eingeben, als Probleme auf einem großen Bildschirm oder Tablet zu bekommen. Daher müssen Sie für alle Geräte einen Wert aus Ihrem string.xml-Wert eingeben. und Dauer ist die Zeit, in der Sie eine Animation des Layouts anzeigen möchten .... !!! Tut mir leid für mein schlechtes Englisch...!
Varotariya Vajsi

@varotariyavajsi Hiermit wird die Sichtbarkeit einer Ansicht nicht angezeigt / ausgeblendet.
IgorGanapolsky

hallo igor ganapolsky ich kenne diese ... es ist nur eine übersetzungsansicht in y richtung, wenn der benutzer wie ein unterer schieber nach oben und unten zeigen muss, funktioniert es einwandfrei.
Varotariya Vajsi

4

Verwenden Sie diese Klasse:

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

Verwenden von 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
Kleinere Verbesserungen: Wir können die Konstante View.TRANSLATION_Y anstelle von "translationY" verwenden und auch in der ObjectAnimation-Folie können wir .apply {doOnEnd {view.visibility = View.GONE} .......}. Start () ausführen.
Tashi

0.toFloat()kann auch nur sein0f
styler1972

2

Ich hatte einen Eckkoffer, in dem meine Ansicht immer noch zeroso hoch war ...

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

Hier ist meine Lösung. Holen Sie sich einfach einen Verweis auf Ihre Ansicht und rufen Sie diese Methode auf:

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();
        }
    });
}

Keine Notwendigkeit, etwas anderes zu tun =)


1
Warum benötigen Sie dazu einen GlobalLayoutListener? Warum stellen Sie die Sichtbarkeit so seltsam ein? Warum nehmen Sie in Ihre Antwort Dinge wie eine Startverzögerung auf, die für die Frage irrelevant ist?
Xaver Kapeller

1

Suragchs Antwort in Kotlin. Das hat bei mir funktioniert.

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

Sie können die einfachen drei Codezeilen verwenden, um die Animation anzuzeigen ...

//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

Mit Kotlin-Erweiterungen können Sie Folgendes verwenden:

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)
}

Beispiel für die Erweiterung:

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

Eine der einfachen Möglichkeiten:

containerView.setLayoutTransition(LayoutTransition())
containerView.layoutTransition.enableTransitionType(LayoutTransition.CHANGING)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.