de-vraag
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
 MichelReap
MichelReap
Question

Menampilkan dan menyembunyikan Tampilan dengan slide up/down animasi

Saya memiliki LinearLayout yang saya inginkan untuk menampilkan atau menyembunyikan dengan Animasi yang mendorong tata letak ke atas atau ke bawah setiap kali saya mengubah visibilitas.

I've melihat beberapa sampel di luar sana tetapi tidak satupun dari mereka sesuai dengan kebutuhan saya.

Saya telah menciptakan dua file xml untuk animasi tapi aku tidak tahu bagaimana untuk memulai mereka ketika saya mengubah visibilitas LinearLayout.

287 2013-11-04T10:37:25+00:00 13
Xaver Kapeller
Xaver Kapeller
Pertanyaan edit 21 Agustus 2015 в 8:36
Pemrograman
animation
android
android-animation
Solution / Answer
Xaver Kapeller
Xaver Kapeller
4 November 2013 в 10:44
2013-11-04T10:44:40+00:00
Lebih
Sumber
Sunting
#22706956

Dengan animasi API yang diperkenalkan pada Android 3.0 (Honeycomb) hal ini sangat sederhana untuk membuat animasi.

Geser Melihat ke bawah dengan jarak:

view.animate().translationY(distance);

Anda dapat kemudian geser Melihat kembali ke posisi semula seperti ini:

view.animate().translationY(0);

Anda juga dapat dengan mudah menggabungkan beberapa animasi. Animasi berikut akan meluncur Melihat ke bawah dengan ketinggian dan memudar pada saat yang sama:

// 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 Melihat kembali keluar dan geser kembali ke posisi semula. Kami juga mengatur AnimatorListener sehingga kita dapat mengatur visibilitas Melihat kembali ke PERGI setelah 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);
        }
    });
Shahab Rauf
Shahab Rauf
Jawaban edit 3 Agustus 2017 в 2:30
608
0
 Suragch
Suragch
9 Oktober 2017 в 10:54
2017-10-09T10:54:00+00:00
Lebih
Sumber
Sunting
#22706964

Saya sedang mengalami masalah pemahaman yang menerapkan jawaban yang diterima. Aku butuh sedikit lebih banyak konteks. Sekarang bahwa saya telah menemukan jawabannya, berikut adalah contohnya:

enter image description here

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 untuk saya menunjuk ke arah yang benar. Itu lebih bermanfaat daripada jawaban yang lain di halaman ini.
  • Jika anda ingin memulai dengan melihat pada layar, kemudian don't menginisialisasi itu sebagai tak TERLIHAT.
  • Karena kita menghidupkan itu benar-benar off layar, tidak perlu untuk mengatur kembali ke tak TERLIHAT. Jika anda tidak menghidupkan benar-benar off layar, meskipun, maka anda dapat menambahkan alpha animasi dan mengatur visibilitas dengan AnimatorListenerAdapter.
  • Properti Animasi docs
 Suragch
Suragch
Jawaban edit 30 April 2018 в 10:33
109
0
Stefan Medack
Stefan Medack
18 Januari 2017 в 5:45
2017-01-18T17:45:42+00:00
Lebih
Sumber
Sunting
#22706961

Solusi termudah: set android:animateLayoutChanges="benar" pada wadah yang memegang pandangan anda.

Untuk memasukkannya ke dalam beberapa konteks: Jika anda memiliki tata letak seperti di bawah ini, semua visibilitas perubahan pandangan 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 rincian lebih lanjut tentang hal ini pada Menjiwai tata Letak Perubahan - Pengembang Android

Stefan Medack
Stefan Medack
Jawaban edit 18 Januari 2017 в 5:53
23
0
Pengguna anonim
4 November 2013 в 10:50
2013-11-04T10:50:26+00:00
Lebih
Sumber
Sunting
#22706957

Anda dapat mulai benar Animasi ketika visibilitas LinearLayout perubahan dengan membuat subclass dari LinearLayout dan meng-override setVisibility() untuk memulai Animasi. Mempertimbangkan 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);
    }
}
11
0
 ashakirov
ashakirov
15 Mei 2019 в 8:04
2019-05-15T08:04:20+00:00
Lebih
Sumber
Sunting
#22706967

Sekarang visibilitas mengubah animasi harus dilakukan melalui Transisi API yang tersedia di support (androidx) paket. Sebut saja TransitionManager.beginDelayedTransition metode Slide transisi kemudian mengubah visibilitas dari pandangan.

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

private void toggle() {
    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>

Check jawaban dengan yang lain default dan transisi kustom contoh.

 ashakirov
ashakirov
Jawaban edit 15 Mei 2019 в 8:10
9
0
Ameen Maheen
Ameen Maheen
1 April 2015 в 6:10
2015-04-01T06:10:42+00:00
Lebih
Sumber
Sunting
#22706958
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);
                }
            });
}
Xaver Kapeller
Xaver Kapeller
Jawaban edit 1 April 2015 в 7:02
9
0
Đorđe Nilović
Đorđe Nilović
6 September 2018 в 12:22
2018-09-06T12:22:02+00:00
Lebih
Sumber
Sunting
#22706965

Kotlin

Berdasarkan Suragch's jawaban, berikut adalah cara yang elegan menggunakan Tampilan 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() atau myView.slideDown()

8
0
 amin
amin
11 Juni 2017 в 10:21
2017-06-11T10:21:18+00:00
Lebih
Sumber
Sunting
#22706962

Menggunakan 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;
}
}
4
0
varotariya vajsi
varotariya vajsi
28 Agustus 2015 в 6:46
2015-08-28T06:46:21+00:00
Lebih
Sumber
Sunting
#22706959

anda dapat geser ke atas dan ke bawah setiap tampilan atau tata letak dengan menggunakan kode di bawah 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));
                }
4
0
 Samuel
Samuel
29 Juni 2017 в 6:52
2017-06-29T06:52:15+00:00
Lebih
Sumber
Sunting
#22706963

Saya punya kasus sudut di mana saya melihat's tinggi masih nol jadi...

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

}
2
0
 Tiago
Tiago
17 Juni 2016 в 1:27
2016-06-17T01:27:15+00:00
Lebih
Sumber
Sunting
#22706960

Berikut ini adalah solusi saya. Hanya mendapatkan referensi untuk anda melihat dan memanggil 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 apa-apa lagi =)

1
0
 olle
olle
10 Januari 2019 в 10:06
2019-01-10T22:06:05+00:00
Lebih
Sumber
Sunting
#22706966

Suragch's jawaban di Kotlin. Ini bekerja 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
}

}

0
0
Yogesh  singh Pathania
Yogesh singh Pathania
20 Agustus 2019 в 10:17
2019-08-20T10:17:02+00:00
Lebih
Sumber
Sunting
#22706968

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

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

            }
 Jay
Jay
Jawaban edit 20 Agustus 2019 в 11:10
0
0
Related communities 1
Android Studio Indonesia
Android Studio Indonesia
1 778 pengguna
Buka telegram
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
Asilbek Qadamboyev
Terdaftar 6 jam yang lalu
2
Akshit Mehta
Terdaftar 2 hari yang lalu
3
me you
Terdaftar 5 hari yang lalu
4
Никита иванов
Terdaftar 1 minggu yang lalu
5
Alex1976G_06
Terdaftar 1 minggu yang lalu
BG
DA
DE
EL
ES
FR
ID
IT
JA
LT
LV
NL
PT
TR
ZH
© de-vraag 2022
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi