Tampilkan dan sembunyikan Tampilan dengan animasi geser atas / bawah

318

Saya memiliki LinearLayoutyang ingin saya tampilkan atau sembunyikan dengan Animationyang mendorong tata letak ke atas atau ke bawah setiap kali saya mengubah visibilitasnya.

Saya telah melihat beberapa sampel di luar sana tetapi tidak ada yang sesuai dengan kebutuhan saya.

Saya telah membuat dua file xml untuk animasi tetapi saya tidak tahu bagaimana memulainya ketika saya mengubah visibilitas a LinearLayout.

MichelReap
sumber

Jawaban:

639

Dengan API animasi baru yang diperkenalkan di Android 3.0 (Honeycomb), sangat mudah untuk membuat animasi seperti itu.

Geser Viewke bawah dengan jarak:

view.animate().translationY(distance);

Anda nanti dapat menggeser Viewkembali ke posisi semula seperti ini:

view.animate().translationY(0);

Anda juga dapat dengan mudah menggabungkan beberapa animasi. Animasi berikut ini akan meluncur Viewke bawah dengan ketinggiannya dan memudar pada saat yang bersamaan:

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

Anda kemudian dapat memudar Viewkembali dan geser kembali ke posisi semula. Kami juga mengatur AnimatorListeneragar kami dapat mengatur visibilitas ke Viewbelakang GONEsetelah animasi selesai:

view.animate()
    .translationY(0)
    .alpha(0.0f)
    .setListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            super.onAnimationEnd(animation);
            view.setVisibility(View.GONE);
        }
    });
Xaver Kapeller
sumber
1
mengapa tampilan tidak terlihat begitu hilang?
Ram
1
saya ingin menghidupkan tampilan ketika terlihat dan ketika pergi. tetapi jika saya pertama kali pergi melihat .tidak dapat terlihat dan tempat tampilan kosong
Ram
3
@Ram Apa yang ingin Anda capai dengan menghidupkan Viewketika visibilitasnya diatur ke View.GONE? Jika Anda mengatur visibilitasnya ke hal lain selain View.VISIBLEitu Viewtidak akan terlihat. Saya tidak mengerti apa yang Anda minta. Jika Anda ingin animasi Anda terlihat maka jangan atur visibilitas Viewke View.GONE.
Xaver Kapeller
2
menghadapi masalah yang sama dengan apa yang dihadapi Ram, pada awalnya itu berfungsi dengan baik tetapi dari waktu berikutnya ketika saya membuat tampilan itu dalam keadaan hilang dan mencoba untuk membuat tampilan itu terlihat lagi itu tidak muncul.
Pankaj kumar
12
@XaverKapeller Saya pikir masalah yang dimiliki banyak orang adalah bahwa pendengar onAnimationEnddipanggil setiap kali untuk animasi multi-kejadian, yang artinya onAnimationEnddipanggil juga ketika tampilan ditampilkan, yang menetapkan visibilitasnya ke Gone, dll.
oldergod
129

Saya kesulitan memahami penerapan jawaban yang diterima. Saya membutuhkan lebih banyak konteks. Sekarang saya sudah menemukan jawabannya, berikut adalah contoh lengkapnya:

masukkan deskripsi gambar di sini

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>

Catatan

  • Terima kasih untuk artikel ini karena mengarahkan saya ke arah yang benar. Itu lebih bermanfaat daripada jawaban lain di halaman ini.
  • Jika Anda ingin memulai dengan tampilan di layar, maka jangan menginisialisasi sebagai INVISIBLE.
  • Karena kami menghidupkan sepenuhnya layar, tidak perlu mengaturnya kembali INVISIBLE. Jika Anda tidak menghidupkan layar sepenuhnya, maka Anda dapat menambahkan animasi alfa dan mengatur visibilitas dengan AnimatorListenerAdapter.
  • Dokumen Animasi Properti
Suragch
sumber
android: visibility = "invisible" untuk menginisialisasi animasi tampilan sebagai kulit tersembunyi
Goodlife
2
Saya tidak merekomendasikan penggunaan animate.setFillAfter (true); jika Anda memiliki tampilan yang dapat diklik di bawah tampilan slide itu tidak akan menerima acara
HOCiNE BEKKOUCHE
2
Perhatikan bahwa tanpa .setVisibility(View.INVISIBLE);fungsi geser ke atas tidak akan berfungsi seperti yang diharapkan secara visual.
Advait S
Translate Animationmenggerakkan tampilan. Jika Anda ingin menghidupkan tampilan seperti penskalaannya sendiri, gunakanScaleAnimation anim = new ScaleAnimation(1, 1, 0, 1)
Zohab Ali
33

Sekarang animasi perubahan visibilitas harus dilakukan melalui Transition APIyang tersedia dalam paket dukungan (androidx). Cukup panggil metode TransitionManager.beginDelayedTransition dengan transisi Slide kemudian ubah visibilitas tampilan.

masukkan deskripsi gambar di sini

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>

Periksa jawaban ini dengan contoh transisi default dan kustom lainnya.

ashakirov
sumber
@akubi ya, seharusnya
Aba
1
Salah satu jawaban terbaik dan mudah! Terima kasih!
krisDrOid
hanya untuk dicatat, ini membutuhkanminSdkVersion 21
lasec0203
@ lasec0203 no, kelas dari androidxpaket. Ini bekerja dengan baik pada pra 21 api.
ashakirov
: thumbs_up: ini menyingkirkan kesalahan metode ambiguitas yang saya dapatkan
lasec0203
30

Solusi termudah: atur android:animateLayoutChanges="true"pada wadah yang menahan pandangan Anda.

Untuk memasukkannya ke dalam beberapa konteks: Jika Anda memiliki tata letak seperti di bawah ini, semua perubahan visibilitas pada tampilan dalam wadah ini akan dianimasikan secara otomatis.

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

    <Views_which_change_visibility>

</LinearLayout>

Anda dapat menemukan detail lebih lanjut tentang ini di Animating Layout Changes - Developer Android

Stefan Medack
sumber
Ini adalah yang termudah tetapi perilakunya berbeda karena produsen telepon dan dia perubahan kode
b2mob
Ini menghidupkan alpha, bukan posisinya.
Suragch
Ya, tapi itulah pertanyaan awalnya jika saya memahaminya dengan benar. Jika Anda ingin menghidupkan posisi, Anda bisa menggunakan RecyclerView yang menggunakan ViewHolders dengan id stabil.
Stefan Medack
12

Anda dapat memulai yang benar Animationketika visibilitas LinearLayoutperubahan dengan membuat subclass baru LinearLayoutdan setVisibility()mengganti untuk memulai Animations. Pertimbangkan sesuatu seperti ini:

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);
    }
}
Xaver Kapeller
sumber
1
Saya sebenarnya lebih suka pendekatan subclass. Terima kasih banyak.
MichelReap
1
Ini, adalah solusi luar biasa yang akan saya implementasikan di BaseView saya. Terima kasih untuk ini!
Bram Vandenbussche
1
Karena ini berfungsi saat ditampilkan, saat bersembunyi, tampilan menghilang sebelum animasi dapat dilihat. Ada solusi?
Bernardo
12
@BramVandenbussche Ini adalah solusi yang mengerikan. Itu membuat Viewbertanggung jawab untuk animasinya sendiri yang TIDAK PERNAH apa yang Anda inginkan. Bayangkan Anda ingin menghidupkan yang Viewberbeda di bagian lain aplikasi Anda. Apa yang kamu lakukan? Tambahkan bendera agar tidak secara otomatis menggerakkan visibilitas? Subkelas Viewdan ganti setVisibility()untuk menghapus animasi? Atau implementasi yang lebih buruk setVisibility()dengan animasi lain? Hanya saja semakin jelek dari sana. Jangan gunakan "solusi" ini.
Xaver Kapeller
3
Lebih baik menyebutnya AnimatedLinearLayout
Roel
12

Kotlin

Berdasarkan Suragch 's jawaban , di sini adalah cara yang elegan menggunakan View ekstensi:

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

Dan kemudian di mana pun Anda ingin menggunakannya, Anda hanya perlu myView.slideUp()ataumyView.slideDown()

Norđe Nilović
sumber
Satu-satunya bug adalah, itu tidak perlu "fillAfter = true" karena memblokir akses pandangan anak klik
Ranjan
Anda juga mungkin perlu menambahkan pendengar ke animasi slideDown dan membuat tampilan hilang diAnimationEnd.
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);
                }
            });
}
Ameen Maheen
sumber
10
Masalah dengan jawaban ini: 1) Pemformatan kode yang mengerikan. 2) Anda menggunakan potongan kode untuk memposting kode yang sebenarnya tidak dapat dijalankan di browser. Ini tidak hanya menambahkan dua tombol yang tidak berguna, tetapi juga menghancurkan penyorotan sintaksis. 3) Ini hanya beberapa dump kode acak tanpa penjelasan atau tujuan. 4) Anda mengubah visibilitas saat melakukan animasi. Selain dari fakta bahwa ini adalah bau kode yang jelas ini juga tidak akan berfungsi dengan baik. Mengubah visibilitas memulai proses tata letak baru, hanya setelah itu selesai animasi sebenarnya memiliki nilai untuk dikerjakan. Daftar ini terus dan terus ...
Xaver Kapeller
Saya sudah mengedit jawaban Anda untuk memperbaiki pemformatan dan mengubah cuplikan kode menjadi blok kode yang sebenarnya. Tetapi Anda harus mengisi sisanya ...
Xaver Kapeller
Maaf, kawan, saya membuat kode dari Anda karena tidak berfungsi dengan baik untuk saya, kode saya ini berfungsi. Tetapi perubahan yang diperlukan dalam cara posting saya setuju.
Ameen Maheen
@AmeenMaheen Untuk apa setAlpha?
IgorGanapolsky
@ Igor Ganapolsky digunakan untuk transparansi yaitu untuk memberikan efek memudar
Ameen Maheen
4

Anda dapat menggeser ke atas dan ke bawah tampilan atau tata letak apa pun dengan menggunakan kode di bawah ini di aplikasi 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));
                }
varotariya vajsi
sumber
apa itu 120? dan apa 0? apa unit untuk setDuration jika saya ingin hardcode ini?
stanley santoso
1
di sini 120 dan 0 adalah jarak yang terkait dengan sumbu Y jika Anda meletakkan kode keras daripada mendapatkan masalah di layar besar atau tablet jadi, Anda perlu memasukkan nilai dari nilai string.xml Anda untuk semua perangkat yang berbeda. dan durasi adalah waktu Anda ingin menampilkan animasi tata letak .... !!! maaf untuk bahasa inggris saya yang buruk ...!
varotariya vajsi
@varotariyavajsi Ini sebenarnya tidak menunjukkan / menyembunyikan visibilitas tampilan.
IgorGanapolsky
halo igor ganapolsky saya tahu ini ... itu hanya menerjemahkan tampilan ke arah y, jika pengguna harus muncul naik dan turun seperti slider bawah itu akan berfungsi dengan baik.
varotariya vajsi
4

Gunakan kelas ini:

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;
}
}
amin
sumber
3

Menggunakan 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()
    }
}
Vihaan Verma
sumber
2
Perbaikan kecil: Kita dapat menggunakan View.TRANSLATION_Y yang konstan alih-alih "translationY" dan juga di slide ObjectAnimation yang bisa kita lakukan .apply {doOnEnd {view.visibility = View.GONE} .......}. Start ()
tashi
0.toFloat()bisa juga hanya0f
styler1972
2

Saya memiliki kasus sudut di mana ketinggian pandangan saya masih zerosangat ...

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

}
Samuel
sumber
1

Ini solusinya. Dapatkan referensi ke tampilan Anda dan panggil metode ini:

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

Tidak perlu melakukan hal lain =)

Tiago
sumber
1
Mengapa Anda memerlukan GlobalLayoutListener untuk melakukan ini? Mengapa Anda mengatur visibilitas pada cara yang aneh? Mengapa Anda memasukkan hal-hal seperti penundaan mulai yang tidak relevan untuk dipertanyakan dalam jawaban Anda?
Xaver Kapeller
1

Jawaban Suragch di Kotlin. Ini berhasil untuk saya.

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
}

}

olle
sumber
0

Anda dapat menggunakan tiga baris kode sederhana untuk menampilkan ...

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

            }
Yogesh singh Pathania
sumber
0

Dengan ekstensi Kotlin Anda dapat menggunakan ini:

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

Contoh untuk ekstensi:

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
Mertcan Çüçen
sumber
0

Salah satu cara sederhana:

containerView.setLayoutTransition(LayoutTransition())
containerView.layoutTransition.enableTransitionType(LayoutTransition.CHANGING)
hallz12
sumber