Android: bir animasyon kullanarak bir görünümü göster / gizle


81

Dikey bir animasyon aracılığıyla bir görünümün nasıl gösterileceğini / gizleneceğini belirlemek için burada birçok Google sonucuna / sorusuna bakıyordum, ancak tam olarak doğru olan veya çok belirsiz olmayan birini bulamıyorum.

Başka bir düzenin altında ve birden çok başka parçacığın üzerinde bir düzen (geri alma çubuğu) var; Bu geri alma çubuğu, koşullara bağlı olarak dikey olarak kaymalı ve kayarak kapanmalıdır.

Şu anda tek yaptığım şey görünümü görünür veya kaybolacak şekilde ayarlamak.

Yanıtlar:


64

Özniteliği android:animateLayoutChanges="true" ana mizanpajın içinde ayarlayın .

Görünümü, değilse bir düzene yerleştirin android:animateLayoutChanges="true"ve bu düzen için ayarlayın .

NOT: Bu yalnızca API Seviye 11+ (Android 3.0) ile çalışır


19

RelativeLayoutDüzenleri animasyonlarla gösteren / gizleyen bir uzantı oluşturdum . Bu Viewözellikleri kazanmak için her türlü genişletilebilir .

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.AnimationUtils;
import android.widget.RelativeLayout;

public class AnimatingRelativeLayout extends RelativeLayout
{
    Context context;
    Animation inAnimation;
    Animation outAnimation;

    public AnimatingRelativeLayout(Context context)
    {
        super(context);
        this.context = context;
        initAnimations();

    }

    public AnimatingRelativeLayout(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        this.context = context;
        initAnimations();
    }

    public AnimatingRelativeLayout(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        this.context = context;
        initAnimations();
    }

    private void initAnimations()
    {
        inAnimation = (AnimationSet) AnimationUtils.loadAnimation(context, R.anim.in_animation);
        outAnimation = (Animation) AnimationUtils.loadAnimation(context, R.anim.out_animation);
    }

    public void show()
    {
        if (isVisible()) return;
        show(true);
    }

    public void show(boolean withAnimation)
    {
        if (withAnimation) this.startAnimation(inAnimation);
        this.setVisibility(View.VISIBLE);
    }

    public void hide()
    {
        if (!isVisible()) return;
        hide(true);
    }

    public void hide(boolean withAnimation)
    {
        if (withAnimation) this.startAnimation(outAnimation);
        this.setVisibility(View.GONE);
    }

    public boolean isVisible()
    {
        return (this.getVisibility() == View.VISIBLE);
    }

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

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

Ve Animationkullanarak orijinalleri geçersiz kılabilirsiniz.overrideDefaultInAnimationoverrideDefaultOutAnimation

Orijinal Animasyonlarım soldu / Söndü, ekranın içine / dışına çevirmek için XML animasyon dosyaları ekliyorum (Üstten ve üstten çevir)

in_animation.xml:

    <?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="600"
    android:fillAfter="false"
    android:fromXDelta="0"
    android:fromYDelta="-100%p"
    android:toXDelta="0"
    android:toYDelta="0" />

out_animation.xml:

  <?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="600"
    android:fillAfter="false"
    android:fromXDelta="0"
    android:fromYDelta="0"
    android:toXDelta="0"
    android:toYDelta="-100%p" />

15

Bu, API 12 ve üzerinde tek satırlık bir ifadeyle makul şekilde elde edilebilir. Aşağıda, vcanlandırmak istediğiniz görünümün bulunduğu bir örnek bulunmaktadır ;

v.animate().translationXBy(-1000).start();

Bu, Viewsöz konusu öğeyi sola 1000 piksel kaydıracaktır. Görünümü kullanıcı arayüzüne geri kaydırmak için aşağıdakileri yapabiliriz.

v.animate().translationXBy(1000).start();

Umarım birisi bunu yararlı bulur.


11

Yalnızca bir görünümün yüksekliğini canlandırmak istiyorsanız (örneğin 0'dan belirli bir sayıya kadar) kendi animasyonunuzu uygulayabilirsiniz:

final View v = getTheViewToAnimateHere();
Animation anim=new Animation(){
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        super.applyTransformation(interpolatedTime, t);
        // Do relevant calculations here using the interpolatedTime that runs from 0 to 1
        v.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, (int)(30*interpolatedTime)));
    }};
anim.setDuration(500);
v.startAnimation(anim);

7

Görünümü geçiş animasyonuyla sorunsuz bir şekilde gizlemek ve göstermek için bu iki işlevi kullandım.

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public void expand(final View v, int duration, int targetHeight, final int position) {

        int prevHeight = v.getHeight();

        v.setVisibility(View.VISIBLE);
        ValueAnimator valueAnimator = ValueAnimator.ofInt(0, targetHeight);
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                v.getLayoutParams().height = (int) animation.getAnimatedValue();
                v.requestLayout();
            }
        });
        valueAnimator.setInterpolator(new DecelerateInterpolator());
        valueAnimator.setDuration(duration);
        valueAnimator.start();
        valueAnimator.addListener(new AnimatorListenerAdapter() {

            @Override
            public void onAnimationEnd(Animator animation) {
                v.clearAnimation();
            }
        });

    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public void collapse(final View v, int duration, int targetHeight, final int position) {
        if (position == (data.size() - 1)) {
            return;
        }
        int prevHeight = v.getHeight();
        ValueAnimator valueAnimator = ValueAnimator.ofInt(prevHeight, targetHeight);
        valueAnimator.setInterpolator(new DecelerateInterpolator());
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                v.getLayoutParams().height = (int) animation.getAnimatedValue();
                v.requestLayout();
            }
        });
        valueAnimator.setInterpolator(new DecelerateInterpolator());
        valueAnimator.setDuration(duration);
        valueAnimator.start();
        valueAnimator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                animBoolArray.put(position, false);
                v.clearAnimation();

            }
        });
    }

4

Konum değişiklikleri için animasyon oluşturan TranslateAnimation sınıfını kullanmayı deneyin . Yardım için bunu okumayı deneyin - http://developer.android.com/reference/android/view/animation/TranslateAnimation.html

Güncelleme: İşte bunun örneği. Görünümünüzün yüksekliği 50 ise ve gizleme modunda sadece 10 piksel göstermek istersiniz. Örnek kod -

TranslateAnimation anim=new TranslateAnimation(0,0,-40,0);
anim.setFillAfter(true);
view.setAnimation(anim);

Not: Animasyonu ihtiyacınıza göre kullanmanıza yardımcı olacak birçok veya başka yöntemler var. Kodu tamamen özelleştirmek istiyorsanız RelativeLayout.LayoutParams'a da bir göz atın, ancak TranslateAnimation'ı kullanmak daha kolaydır.

DÜZENLEME: LayoutParams kullanarak -Complex sürüm

RelativeLayout relParam=new RelativeLayout.LayoutParam(RelativeLayout.LayoutParam.FILL_PARENT,RelativeLayout.LayoutParam.WRAP_CONTENT); //you can give hard coded width and height here in (width,height) format.
relParam.topMargin=-50; //any number that work.Set it to 0, when you want to show it.
view.setLayoutParams(relparam);

Bu örnek kod, Görünümünüzü RelativeLayout'a koyduğunuzu varsayar, eğer Layout adını değiştirmezseniz, ancak diğer düzen çalışmayabilir. Onlara bir animasyon efekti vermek istiyorsanız, topMargin'i yavaşça azaltın veya artırın. Orada da Thread.sleep () kullanmayı düşünebilirsiniz.


1
ScaleAnimation konumu değiştirmez, görünümü ölçeklendirir ... TranslateAnimation ile karıştırıyorsunuz.
Rotemmiz

Sanırım ihtiyacınız olanı almışsınızdır ve eğer burada değilse örnek bir kod - TranslateAnimation anim = new TranslateAnimation (fromX, toX, fromY, toY); view.setAnimation (anim);
noob

3

Bunu dene.

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

1

Öncelikle görmek istediğiniz görünümün yüksekliğini alın ve görünüm gösteriliyorsa kaydetmek için bir boole yapın:

int heigth=0;
boolean showing=false;
LinearLayout layout = (LinearLayout) view.findViewById(R.id.layout);

        proDetailsLL.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

            @Override
            public void onGlobalLayout() {
                // gets called after layout has been done but before display
                // so we can get the height then hide the view

                proHeight = proDetailsLL.getHeight(); // Ahaha!  Gotcha

                proDetailsLL.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                proDetailsLL.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 0));
            }
        });

Ardından, görünümü gizlemeyi gösterme yöntemini çağırın ve boole değerini değiştirin:

slideInOutAnimation(showing, heigth, layout);
proShowing = !proShowing;

Yöntem:

/**
     * Method to slide in out the layout
     * 
     * @param isShowing
     *            if the layout is showing
     * @param height
     *            the height to slide
     * @param slideLL
     *            the container to show
     */
private void slideInOutAnimation(boolean isShowing, int height, final LinearLayout slideLL, final ImageView arroIV) {

        if (!isShowing) {
        Animation animIn = new Animation() {
        protected void applyTransformation(float interpolatedTime, Transformation t) {
                    super.applyTransformation(interpolatedTime, t);
        // Do relevant calculations here using the interpolatedTime that runs from 0 to 1
        slideLL.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, (int) (heigth * interpolatedTime)));

                }
            };
            animIn.setDuration(500);
            slideLL.startAnimation(animIn);
        } else {

            Animation animOut = new Animation() {
                protected void applyTransformation(float interpolatedTime, Transformation t) {
                    super.applyTransformation(interpolatedTime, t);
                    // Do relevant calculations here using the interpolatedTime that runs from 0 to 1


                        slideLL.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,
                                (int) (heigth * (1 - interpolatedTime))));

                }
            };
            animOut.setDuration(500);
            slideLL.startAnimation(animOut);


        }

    }

1

ViewAnimator:

XML'de:

  <ViewAnimator
    android:id="@+id/animator_message"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:inAnimation="@anim/slide_down_text"
    android:outAnimation="@anim/slide_up_text">

    <TextView
        android:id="@+id/text_message_authentication"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="message_error_authentication" />

    <TextView
        android:id="@+id/text_message_authentication_connection"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="message_error_authentication_connection" />

    <TextView
        android:id="@+id/text_message_authentication_empty"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="message_error_authentication_field_empty" />

</ViewAnimator>

Fonksiyonlar:

public void show(int viewId) {
    ViewAnimator animator = (ViewAnimator) findView(animatorId);
    View view = findViewById(viewId);

    if (animator.getDisplayedChild() != animator.indexOfChild(view)) {
        animator.setDisplayedChild(animator.indexOfChild(view));
     }
 }


 private void showAuthenticationConnectionFailureMessage() {
    show(R.id.text_message_authentication_connection);
}
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.