Slayt yukarı / aşağı animasyonuyla bir Görünümü gösterme ve gizleme


318

Bir var LinearLayoutben göstermek veya bir ile gizlemek istediğiniz Animationben görünürlüğünü değiştirdiğinizde yukarı düzenini iten veya aşağıya.

Orada birkaç örnek gördüm ama hiçbiri benim ihtiyaçlarına uygun değil.

Animasyonlar için iki xml dosyası oluşturdum ama bir görünürlüğünü değiştirdiğimde nasıl başlatılacağını bilmiyorum LinearLayout.

Yanıtlar:


639

Android 3.0'da (Honeycomb) tanıtılan yeni animasyon API'sı ile bu tür animasyonlar oluşturmak çok basit.

Bir Sürme Viewbir mesafe ile aşağı:

view.animate().translationY(distance);

Daha sonra Viewarka kısmı aşağıdaki gibi orijinal konumuna kaydırabilirsiniz :

view.animate().translationY(0);

Ayrıca, birden çok animasyonu kolayca birleştirebilirsiniz. Aşağıdaki animasyon View, yüksekliğine göre aşağı kaydırır ve aynı anda kaybolur:

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

Daha sonra Viewarkadan kaybolup orijinal konumuna geri kaydırabilirsiniz. Ayrıca , animasyon bittikten sonra sırtın AnimatorListenergörünürlüğünü ayarlayabilmemiz için bir set oluşturduk :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
Neden görüntü bir kez gittiğinde görünmüyor?
Ram

1
görünür ve gittiğinde görünümü canlandırmak istiyorum. ama ben ilk kez gittim. görünür olamaz ve görüş yeri boş
Ram

3
@Ram ViewGörünürlüğü ayarlandığında bir animasyonu yaparak ne elde etmeye çalışıyorsunuz View.GONE? Eğer başka bir değere görünürlüğünü ayarlarsanız View.VISIBLEdaha sonra Viewgörünür olmayacaktır. Ne istediğini anlamıyorum. Eğer animasyon görünür olmasını istiyorsanız o zaman görünürlüğünü ayarlamak yok Viewetmek View.GONE.
Xaver Kapeller

2
Ram'in karşılaştığı aynı sorunla karşı karşıyayken, ilk kez iyi çalışıyor, ancak bir dahaki sefere bu görünümü gittiğimde ve o görünümü tekrar görünür hale getirmeye çalıştığımda görünmüyor.
Pankaj kumar

12
Ben çok var sorun dinleyici olduğunu düşünüyorum @XaverKapeller onAnimationEndçok meydana gelen animasyon, araçlar için her zaman denir onAnimationEndvb Gone onun görünürlüğünü ayarlar görünümü olsun zaman da denir,
oldergod

129

Kabul edilen cevabı uygulamayı anlamakta sıkıntı çekiyordum. Biraz daha bağlama ihtiyacım vardı. Şimdi anladım, tam bir örnek:

resim açıklamasını buraya girin

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>

notlar

  • Beni doğru yöne yönlendirdiği için bu makaleye teşekkürler . Bu sayfadaki diğer cevaplardan daha yararlı oldu.
  • Ekrandaki görünümle başlamak istiyorsanız, olarak başlatmayın INVISIBLE.
  • Tamamen ekran dışında oynattığımız için, INVISIBLE . Ekran dışında tamamen animasyon yapmıyorsanız, bir alfa animasyonu ekleyebilir ve birAnimatorListenerAdapter .
  • Özellik Animasyon belgeleri

android: görünürlük = "görünmez" bir animasyon olarak görünüm animasyon başlatmak için
Goodlife

2
Animate.setFillAfter (true) kullanılmasını önermiyorum;
sürgülü

2
.setVisibility(View.INVISIBLE);Yukarı kaydırma işlevi olmadan görsel olarak beklendiği gibi çalışmaz.
Advait S

Translate Animationgörünümü taşır. Görünümü ölçeklendirmenin kendisi gibi canlandırmak istiyorsanız, o zaman kullanınScaleAnimation anim = new ScaleAnimation(1, 1, 0, 1)
Zohab Ali

33

Şimdi görünürlük değişikliği animasyonları Transition APIdestek (androidx) paketinde bulunanlar aracılığıyla yapılmalıdır . Slayt geçişi ile TransitionManager.beginDelayedTransition yöntemini çağırmanız ve ardından görünümün görünürlüğünü değiştirmeniz yeterlidir.

resim açıklamasını buraya girin

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>

Kontrol bu cevabı başka bir varsayılan ve özel geçiş örnekleri ile.


@akubi evet, olmalı
Aba

1
En iyi ve kolay cevaplardan biri! Teşekkürler!
krisDrOid

sadece not, bu gerektirirminSdkVersion 21
lasec0203

@ lasec0203 hayır, sınıflar androidxpaketten. 21 api öncesi iyi çalışır.
ashakirov

: thumbs_up: Bu aldığım bir yöntem belirsizlik hatası kurtuldu
lasec0203

30

En kolay çözüm: android:animateLayoutChanges="true"görünümlerinizi tutan kabın üzerine yerleştirilir.

Bir bağlam içine koymak için: Aşağıdaki gibi bir düzeniniz varsa, bu kapsayıcıdaki görünümlerde tüm görünürlük değişiklikleri otomatik olarak canlandırılacaktır.

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

    <Views_which_change_visibility>

</LinearLayout>

Bununla ilgili daha fazla ayrıntıyı Animasyon Düzeni Değişikliklerinde bulabilirsiniz - Android Geliştiricisi


En kolayı ancak davranışı telefon üreticisi ve kod değişikliği nedeniyle farklılık gösteriyor
b2mob

Bu, konumu değil alfa canlandırır.
Suragch

Evet, ama doğru anladıysam asıl soru buydu. Konumları canlandırmak istiyorsanız, sabit kimliğe sahip ViewHolders kullanan bir RecyclerView kullanabilirsiniz.
Stefan Medack

12

Yeni bir alt sınıf oluşturarak ve başlatmak için geçersiz kılmayı değiştirerek değişikliklerin Animationgörünürlüğünü doğru başlatabilirsiniz . Bunun gibi bir şey düşünün: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
Aslında alt sınıf yaklaşımını daha iyi seviyorum. Çok teşekkür ederim.
MichelReap

1
Bu, BaseView uygulamamda uygulayacağım harika bir çözüm. Bunun için teşekkürler!
Bram Vandenbussche

1
Bu gösterilirken, gizlendiğinde, animasyon görülmeden önce görünüm kaybolur. Herhangi bir geçici çözüm var mı?
Bernardo

12
@BramVandenbussche Bu korkunç bir çözüm. O yapar Viewise kendi animasyonlar sorumlu ASLA istediğini. ViewUygulamanızın başka bir bölümünde farklı şekilde canlandırmak istediğinizi düşünün . O zaman ne yapacaksın? Görünürlüğü otomatik olarak canlandırmamak için bir bayrak eklensin mi? Canlandırma kaldırmak için alt sınıf Viewve geçersiz setVisibility()kıl? Ya da setVisibility()başka bir animasyonla daha kötü uygulama ? Oradan daha çirkin ve çirkinleşiyor. Bu "çözümü" kullanmayın.
Xaver Kapeller

3
Better call it AnimatedLinearLayout
Roel

12

Kotlin

Dayanarak Suragch 'ın cevabı burada Görünüm uzantısını kullanarak zarif bir yoludur:

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

Bunu kullanmak istediğiniz yere Ve sonra, sadece ihtiyaç myView.slideUp()veyamyView.slideDown()


Tek hata, çocuk görüntülemelerini tıklama erişilebilirliğini engellediğinden "fillAfter = true" gerekmez
Ranjan

Ayrıca muhtemelen slideDown animasyonuna bir dinleyici eklemeniz ve animasyonu AnimationEnd'e eklemeniz gerekir.
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
Bu yanıtla ilgili sorunlar: 1) Korkunç kod biçimlendirme. 2) Aslında tarayıcıda çalıştırılamayan kod göndermek için bir kod snippet'i kullanırsınız. Bu sadece iki işe yaramaz düğme eklemekle kalmaz, aynı zamanda sözdizimi vurgulamayı da yok eder. 3) Herhangi bir açıklama veya amaç olmadan sadece rastgele bir kod dökümü. 4) Bir animasyon gerçekleştirirken görünürlüğü değiştiriyorsunuz. Bu bariz kod kokusu olduğu gerçeği bir yana, bu da düzgün çalışmaz. Görünürlüğü değiştirmek yeni bir düzenleme işlemi başlatır, ancak bu işlem bittikten sonra animasyonun üzerinde çalışılacak değerler vardır. Liste uzayıp gidiyor ...
Xaver Kapeller

Yanıtınızı biçimlendirmeyi düzeltmek için düzenledim ve kod pasajını gerçek bir kod bloğuna çevirdim. Ama gerisini doldurmalısın ...
Xaver Kapeller

Üzgünüm dostum var, benim için kodu yapmadım çünkü benim için iyi çalışmıyor, bu kod benim çalışıyor.Ancak gönderme yolunda gerekli değişiklikleri kabul ediyorum.
Ameen Maheen

@AmeenMaheen Ne setAlphaiçin?
IgorGanapolsky

@ Igor Ganapolsky şeffaflık yani solma etkisi vermek için kullanılır
Ameen Maheen

4

android uygulamasında feryat kodu kullanarak herhangi bir görünümü veya düzeni yukarı ve aşağı kaydırabilirsiniz

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 nedir? ve 0 nedir? Bunu kodlamak istersem setDuration'ın birimi nedir?
stanley santoso

1
burada 120 ve 0, büyük ekrana veya tablete sorun yaşamadan sabit kod koyarsanız, Y ekseni ile ilgili mesafedir, bu nedenle tüm farklı cihazlar için string.xml değerinizden değer koymanız gerekir. ve süre düzeni animasyon göstermek istediğiniz zamandır .... !!! Zavallı İngilizcem için özür dilerim ...!
varotariya vajsi

@varotariyavajsi Bu aslında bir görünümün görünürlüğünü göstermez / gizlemez.
IgorGanapolsky

merhaba igor ganapolsky bunları biliyorum ... bu sadece y yönünde görünümü çevirmek, eğer kullanıcı bir alt kaydırıcı gibi yukarı ve aşağı göstermek gerekiyorsa o iyi çalışıyor olacak.
varotariya vajsi

4

Bu sınıfı kullanın:

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 kullanma

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
Küçük iyileştirmeler: "translationY" yerine View.TRANSLATION_Y sabitini kullanabiliriz ve ayrıca ObjectAnimation yukarı kaydırmada .apply {doOnEnd {view.visibility = View.GONE} .......} yapabiliriz.
tashi

0.toFloat()ayrıca olabilir0f
styler1972

2

Görüşümün yüksekliğinin hala zeroöyle olduğu bir köşe davam vardı ...

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

İşte benim çözümüm. Sadece görünümünüze bir referans alın ve bu yöntemi çağırın:

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

Başka bir şey yapmanıza gerek yok =)


1
Bunu yapmak için neden bir GlobalLayoutListener'a ihtiyacınız var? Görünürlüğü neden bu kadar garip bir şekilde ayarlıyorsunuz? Neden yanıtınıza soru ile ilgisi olmayan bir başlangıç ​​gecikmesi gibi şeyler ekliyorsunuz?
Xaver Kapeller

1

Suragch'ın cevabı Kotlin'de. Bu benim için çalıştı.

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

Animasyonu göstermek için basit üç kod satırını kullanabilirsiniz ...

//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 uzantıları ile şunları kullanabilirsiniz:

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

Uzantıya örnek:

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

Basit yollardan biri:

containerView.setLayoutTransition(LayoutTransition())
containerView.layoutTransition.enableTransitionType(LayoutTransition.CHANGING)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.