2010-10-07 25 views
48

Ekrandan bir görüntüyü kaydırmak için xml tanımlı bir animasyon kullanıyorum. Sorun, animasyon tamamlanır tamamlanmaz orijinal konumuna sıfırlanır. Bunu nasıl düzelteceğimi bilmem gerek. İşte xml var:Android: Animasyon Pozisyonu Tamamlandıktan Sonra Sıfırlanıyor

<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator"> 
    <translate android:fromXDelta="0" android:toXDelta="-100%p" android:duration="500"/></set> 

İşte adlandırmak kullanmak Java var:

homeScrn = (View)findViewById(R.id.homescreen); 
    slideLeftOut = AnimationUtils.loadAnimation(this, R.anim.slide_left_out); 

    //Set Click Listeners For Menu 
    btnHelp.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      LayoutInflater.from(getApplicationContext()).inflate(R.layout.help, (ViewGroup)findViewById(R.id.subpage), true); 
      homeScrn.startAnimation(slideLeftOut); 
     } 
    }); 

Yani temelde ne olur ben birinin altında bir görünüm şişirmek olduğunu. Ardından görünümü yukarıdan sola doğru canlandırıyorum. Ekrandan çıkar çıkmaz ve animasyon bittiğinde, konumunu geri getirir.

cevap

69

Animasyonlar beklendiği gibi çalışıyor. Sadece bir şeyleri canlandırdığınız için, aslında onu taşıdığınız anlamına gelmez. Animasyon, animasyonun kendisi sırasında sadece çizilen pikselleri etkiler, widget'ların yapılandırmasını değil.

Bir AnimationListener eklemek gerekir ve onAnimationEnd() yöntemde, (örneğin, üst öğesinden üstündeki görünümü kaldırır görünürlük GONE sahip olarak üst üste görünümü işaretler) hamlen kalıcı kılan şey yap.

+0

! tam olarak ihtiyacım olan şey. Teşekkürler! – LoneWolfPR

+4

Ama aynı şeyleri kaydırmak zorundaysa ne yapmalıyım? onun aslında taşınmamış beri o zaman ben slayt var ben nesneyi SlideOut ??? – Ads

+0

Eğer yapsanız bile * permeneny * 'View' inizi 'onAnimationEnd()' ye taşıyın ** flicker **. Kontrol edin: http://stackoverflow.com/questions/2650351/android-translateanimation-resets-after-animation –

14

Ben cevap verirken de biraz geç olabilir ama bunun için bir çözüm vardır: Aynı soruya gitti ve en marginLeft ayarı ile çözüldü

+14

Çeviri animasyonu için çalışmıyor. Sadece Ölçekli Animasyon için çalışır. – Ads

+3

, ya döndürmek için çalışmaz. –

+1

Döndürmek için çalışıyor. –

1

Sadece xml android:fillAfter=true eklemek OnAnimationEnd() ..

MarginLayoutParams params = (MarginLayoutParams) this.getLayoutParams(); params.setMargins(this.getWidth()*position, 0,0,0); this.setLayoutParams(params);

9

Sen

kullanabilirsiniz

Görünümünüz, orijinal konumuna sıfırlanacak ancak görünümünüzde bazı düğmeler veya başka bir şey varsa, konumları değişmeyecektir.

ObjectAnimator kullanmanız gerekir, API 11 düzeyinden çalışır.Burada

için ömeği

ObjectAnimator objectAnimator= ObjectAnimator.ofFloat(mContent_container, "translationX", startX, endX); 
objectAnimator.setDuration(1000); 
objectAnimator.start(); 

Teşekkür Temmuz olduğunu, otomatik Görünüm pozisyonunu değiştirir onun answer

uygulama object animator bulamazsanız import android.animation.ObjectAnimator;

daha Project -> properties -> Android API seviyesini değiştirmek Saygılarımızla Hayk

88

Sonunda etrafta dolaşmanın bir yolu var. Bunu yapmanın doğru yolu setFillAfter(true),

Eğer o zaman ben de filterAfter="true" tanımladığınız görebilirsiniz bu

<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:interpolator="@android:anim/decelerate_interpolator" 
    android:fillAfter="true"> 

    <translate 
     android:fromXDelta="0%" 
     android:toXDelta="-100%" 
     android:duration="1000"/> 

</set> 

gibi bazı şey yapması gerektiğini xml Animasyonunuzu tanımlamak istiyorsanız olduğunu set etiketi, eğer translate etiketinde tanımlamaya çalışırsanız, işe yaramazsa, çerçevede hata olabilir! Code

ve sonra

Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide_out); 
someView.startAnimation(anim); 

VEYA

TranslateAnimation animation = new TranslateAnimation(-90, 150, 0, 0); 

animation.setFillAfter(true); 

animation.setDuration(1800); 

someView.startAnimation(animation); 

o zaman mutlaka çalışacaktır !!

Şimdi bu biraz zor görünüyor çünkü görünüş aslında yeni pozisyona geçiyor, ama aslında görüntünün pikselleri hareket ettiriliyor, yani görünümünüz aslında ilk pozisyonunda ancak görünür değil, görünürse test edebilirsiniz. Eğer gördüğümüz gibi manuel

public TranslateAnimation (float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) 

new TranslateAnimation(-90, 150, 0, 0); 

şimdi yeni bir konuma sizin görünümü/düzen taşımak zorunda düzeltmek, (düzeninde benim durumumda) size görünümünde bazı düğme veya tıklanabilir görüşe sahip olduğunu bizim animasyon olacak -90 x ekseni ile 150 x ekseni

'dan başlayarak

ve şimdi

public void onAnimationEnd(Animation animation) 
{ 
    someView.layout(150, 0, someView.getWidth() + 150, someView.getHeight()); 
} 

animasyonu çevirmek çünkü ben, olan sol tanımlamak yeni pozisyon ilk argüman için düzeninizi taşır public void layout (int left, int top, int right, int botton)

açıklayalımgörüşümüzü animasyonlu etti 150 x ekseni, üst 0 çünkü biz y eksenini animasyon etmedik, şimdi sağda yaptığımız gibi someView.getWidth() + 150 temel olarak görünümümüzün genişliğini elde ediyoruz ve ekledik, çünkü sol tarafımızın görünüm genişliğini kendi menşei haline getirmek için 150 x ekseni'a gidiyoruz ve alt bizim görünümümüzün yüksekliğine eşittir.i layout() yöntemini kullanmayın :)

DÜZENLEMEYİ yardım etmek zevk hissediyorum,

Ben insanların artık çeviri kavramını anIadiniz, ve hala hemen yorum bölümüne sorabilir herhangi bir sorunuz Görünümün geçersiz kılındığı ve değişikliklerin ön plana çıkmayacağı çerçeveyle çağrılabileceği gibi, düzen parametrelerinizi gereksiniminize göre ayarlamak için LayoutParams'u kullanın.

+2

Bu senaryo için daha iyi yanıt. – Vivekanand

+0

Açıklama için teşekkürler, bu yaklaşımı da kullanıyorum, sadece bu yaklaşımdaki sorun animasyonun animasyonlu görüntü titreşimlerinin sona erdiği zamandır. – user65721

+1

@ user65721 Görünümünüzü yeni pozisyona taşıyor musunuz? ve setFillEnabled() 'ı denediniz mi? –

1

Bu sorun bir haftadan daha uzun bir süre rahatsız olmuştur. Ve Muhammed'in cevabı bana bunu çözmek için doğru bir yol gösterdi.

Animasyonlu yan menüleri uygulamak için önem düzenini kullandım. "view.layout kalıcı olmayacaktır. LayoutParams'ı kullanmalısınız, bu da kalıcı olacaktır." (Kullanım LayoutParameter ne tür kendi ebeveynin düzenine bağlıydı):

İşte benim çözüm

Bu komut eklemek gerekir
@Override 
public void onAnimationEnd(Animation animation) { 
FrameLayout.LayoutParams layoutParams=new FrameLayout.LayoutParams(screenWidth, screenHeight); 
layoutParams.setMargins((int) -(screenWidth * RATE), 0, 
      (int) (screenWidth - screenWidth * RATE), screenHeight); 
    for(View v:views) { 

     v.setLayoutParams(layoutParams); 
     //v.layout((int) -(screenWidth * RATE), 0, (int) (screenWidth - screenWidth * RATE), screenHeight); 
     v.clearAnimation(); 
    } 
} 
5

: ha ah

final Animation animSlideLeft = new TranslateAnimation(0, -80, 0,-350, 0, 0, 0, 0); 
animSlideLeft.setFillAfter(true); 
İlgili konular