Android'de etkinlik geçişi


188

Android 1.5 ve sonraki sürümler için iki etkinlik arasındaki geçişi nasıl tanımlayabilirim? Bir etkinliğin kaybolmasını istiyorum.


7
Aşağıdaki tüm overridePendingTransitionilgili cevaplar için geçerlidir: (0, 0)Hiç animasyon istemiyorsanız geçebilirsiniz .
dokkaebi

Yanıtlar:


164

Bunu ile yapabilirsiniz Activity.overridePendingTransition(). Bir XML kaynak dosyasında basit geçiş animasyonları tanımlayabilirsiniz.


Teşekkürler iandisme. overridePengingTransition, API düzey 5'tir. Bunu düzey 3 (Android 1.5) için yapmak mümkün değil mi?
hpique

Ah, haklısın. CaseyB'nin cevabı muhtemelen daha çok aradığınız şey boyunca.
iandisme

CaseyB'nin cevabı ile uygun bir solgunluğun nasıl yapılacağını henüz bulamadık.
hpique

1
Bunu Faaliyetinizin onCreateişlevinde yapabilirsiniz.
mxcl

1
HTC'de çalışması için (> en azından HTC Desire HD üzerinde) ayarları> ekran> animasyonu tümüyle değiştirmeniz gerekir.
Urboss

192

İşte iki Faaliyet arasında hoş bir yumuşak solma kodu ..

Adlı bir dosya oluşturun fadein.xmliçinderes/anim

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
   android:interpolator="@android:anim/accelerate_interpolator"
   android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="2000" />

Adlı bir dosya oluşturun fadeout.xmliçinderes/anim

<?xml version="1.0" encoding="utf-8"?>

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
   android:interpolator="@android:anim/accelerate_interpolator"
   android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="2000" />

Eğer kaybolur istiyorsanız Aktivite A için Aktivite B , içinde aşağıdaki koymak onCreate()için yöntemiyle Etkinliği B . Önce setContentView()benim için çalışıyor.

overridePendingTransition(R.anim.fadein, R.anim.fadeout);

Solmalar sizin için çok yavaşsa, android:durationyukarıdaki xml dosyalarında daha küçük bir şeye geçin.


54
Sadece buna eklemek için. İşletim Sistemi Etkinliğinizi kapatmaya karar verdikten hemen sonra overridePendingTransition () öğesinin yeniden çağrılması gerekir. Ben sadece Aktivite onPause () yönteminde overridePendingTransition (fadein, fadeout) için başka bir özdeş çağrı koymak. Aksi takdirde, Etkinliğin kaybolduğunu görürsünüz, ancak kapatıldığında kaybolmaz.
Nate

2
Diğer ileti dizisinde yanıt yok. Siliyorum. Yaşadığım şey, geçişin hemen gerçekleşmesi ve daha sonra kararması ve içeri kaymasıdır. Bu yüzden A Etkinliği'ndeyim ve B Etkinliği görüntülenir, ardından loş olur ve kaybolur. Daha sonra talimatları takip etmek için değiştirdim kodu Etkinlik A'nın onPause () öğesine ekleyerek aynı davranışı elde edin.
Geeks On Hugs

12
Yerleşik Android animasyonlarını kullanmak daha yumuşak bir geçişle sonuçlanıyor gibi görünüyor: overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout); Bu dosyaları görüntülemek, size özel animasyonlarınızı nasıl geliştirebileceğinizle ilgili ipuçları verebilir (örneğin, solmaya daha uzun süre dayanarak).
Dan J

3
Sadece değişim unuttum yok fadeinve fadeouthiç fade_inve fade_out. Dan J'nin gönderisinden
Farid

2
Dokümanlara göre, overridePendingTransition()aradıktan hemen sonra finish()ve / veya aramalısınız startActivity(). Yeni Etkinliği başlattıktan hemen sonra bu şekilde güzel bir solma elde edebildim.
Ionoclast Brigham

50

Bunu yapmanın daha kolay bir yolu:

  1. Styles.xml dosyanıza bir animasyon stili oluşturun
<style name="WindowAnimationTransition">
    <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
    <item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>
  1. Bu stili uygulama temanıza ekleyin
<style name="AppBaseTheme" parent="Theme.Material.Light.DarkActionBar">
      <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
</style>

Bu kadar :)


31

Evet. İşletim sistemine aktiviteniz için ne tür bir geçiş yapmak istediğinizi söyleyebilirsiniz.

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    getWindow().setWindowAnimations(ANIMATION);

    ...

}

ANIMATION, işletim sisteminde yerleşik bir animasyonu ifade eden bir tamsayıdır.


Çalışması için başka bir şey yapmam gerekiyor mu? getWindow (). setWindowAnimations (android.R.anim.fade_in), varsayılan olarak kullanılan push geçişiyle sonuçlanmaz, ancak solma geçişi de değildir. Yeni etkinlik bir Nexus One cihazında öncekinin üzerinde görünür.
hpique

1
Çünkü bu bir kaynak istemiyor, işletim sistemine yerleşik bir geçiş animasyonunun kimliğini istiyor. developer.android.com/intl/fr/reference/android/view/…
CaseyB

4
SetWindowAnimations yalnızca stil kaynaklarını kabul ediyor gibi görünüyor. getWindow (). setWindowAnimations (android.R.style.Animation_Toast) bir solmaya bulduğum en yakın olanıdır, ancak önceki aktiviteden değil siyahtan kaybolur.
hpique

1
İşletim sisteminde animasyonun yerleşik olması gerekmez, değerlerde özel bir tane tanımlayabilirsiniz.
ilija139

1
@ ilija139, emin misin? Burada geliştirici yazıyor. Android.com/reference/android/view/… : "Bu bir sistem kaynağı olmalı; pencere yöneticisinin uygulamalara erişimi olmadığından bir uygulama kaynağı olamaz."
lapis

29

res> oluştur> fadein.xml

<?xml version="1.0" encoding="utf-8"?>
    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
       android:interpolator="@android:anim/accelerate_interpolator"
       android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="500" />

res> oluştur> anim> fadeout.xml

<?xml version="1.0" encoding="utf-8"?>
    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
       android:interpolator="@android:anim/accelerate_interpolator"
       android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="500" />

Res> değerler> styles.xml içinde

<style name="Fade">
        <item name="android:windowEnterAnimation">@anim/fadein</item>
        <item name="android:windowExitAnimation">@anim/fadeout</item>
    </style>

OnCreate () etkinliklerinde

getWindow().getAttributes().windowAnimations = R.style.Fade;

2
Bir temaya eklemenizi öneririm, böylece tüm aktivitelere uygulanır mı?
Peterdk

12
Bu animasyonlar zaten Android'de tanımlanmıştır, sadece tüm aktivitelerin onPause () 'sine aşağıdaki kodu ekleyin:overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
Elad Nava

Evet, animasyonun geliştiricilerin beğenisine göre düzenlenebileceğini göstermek istedim.
IceSteve


25

Varsayılan etkinlik animasyonumun üzerine yazıyorum. Api 15'te sorunsuz çalıştığını test ediyorum. İşte kullandığım çözüm:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorPrimary</item>
    <item name="android:windowAnimationStyle">@style/CustomActivityAnimation</item>

</style>

<style name="CustomActivityAnimation" parent="@android:style/Animation.Activity">
    <item name="android:activityOpenEnterAnimation">@anim/slide_in_right</item>
    <item name="android:activityOpenExitAnimation">@anim/slide_out_left</item>
    <item name="android:activityCloseEnterAnimation">@anim/slide_in_left</item>
    <item name="android:activityCloseExitAnimation">@anim/slide_out_right</item>
</style>

Res klasörü altında anim klasörü oluşturun ve ardından bu dört animasyon dosyasını oluşturun:

slide_in_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="100%p" android:toXDelta="0"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_out_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="-100%p"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

slide_in_left.xml

<?xml version="1.0" encoding="utf-8"?>

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

slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="100%p"
        android:duration="@android:integer/config_mediumAnimTime"/>
</set>

Örnek projemi indirebilirsiniz .

Bu kadar... :)


Bu Kabul Edilen Cevap olmalıdır. İyi çalışıyor!
EdgeDev

24

İşte iki aktivite arasında güzel bir pürüzsüz yapmak için kod.

  1. soldan sağa yumuşak etki

    Res / anim'de slide_in_right.xml ve slide_out_right.xml adlı bir dosya oluşturun

    slide_in_right.xml

        <?xml version="1.0" encoding="utf-8"?>
        <set xmlns:android="http://schemas.android.com/apk/res/android"
            android:shareInterpolator="false" >
            <translate android:duration="5000" android:fromXDelta="100%" android:toXDelta="0%" />
            <alpha android:duration="5000" android:fromAlpha="0.0" android:toAlpha="1.0" />
        </set>

    slide_out_right.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false" >
        <translate android:duration="5000" android:fromXDelta="0%" android:toXDelta="-100%"/>
        <alpha android:duration="5000" android:fromAlpha="1.0" android:toAlpha="0.0" />
    </set>
  2. sağdan sola yumuşak etki

    Res / anim'de animation_enter.xml ve animation_leave.xml adlı bir dosya oluşturun

    animation_enter.xml

       <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false">
        <translate android:fromXDelta="-100%" android:toXDelta="0%"
            android:fromYDelta="0%" android:toYDelta="0%"
            android:duration="700"/>
       </set>

    animation_leave.xml

      <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false">
        <translate
            android:fromXDelta="0%" android:toXDelta="100%"
            android:fromYDelta="0%" android:toYDelta="0%"
            android:duration="700" />
      </set>
  3. Bir aktiviteden ikinci Aktiviteye git

       Intent intent_next=new Intent(One_Activity.this,Second_Activity.class);
       overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_right);
       startActivity(intent_next);
     finish();

    4.Onay tuşuna basın veya İkinci aktiviteden bir Aktiviteye gidin

     Intent home_intent = new Intent(Second_Activity.this, One_Activity.class);
     overridePendingTransition(R.anim.animation_enter, R.anim.animation_leave);
     startActivity(home_intent);
     finish();

3
OverridePendingTransition, startActivity'de 3'te olmalıdır.
arberg

OverridePendingTransition 3 ve 4'te startActivity'den sonra olmalıdır
Tareq

StartActivity ()
Fernando Tan

Arayayım mı overridePendingTransitionhemen sonra startActivity: developer.android.com/reference/android/app/...
Midhun MP

4

Android 1.5'te overridePendingTransition'ı kullanamazsınız. overridePendingTransistion Android 2.0'a geldi.

Eğer herhangi bir hatayla karşılaşmayacaksanız, sıradan animasyonları (veya siz) kullanarak hedefi (1.5 veya üstü) derlemeniz veya overridePendingTransistion kullanarak hedefi (2.0 veya üstü) derlemeniz gerekir.

Özet: Android 1.5'te overridePendingTransistion'ı kullanamazsınız .

Yine de işletim sistemindeki yerleşik animasyonları kullanabilirsiniz.


Bu doğru değil. Animasyonlar 1.6'dan çok önce Android'de ve hala hedef 1.5'e yansıma ile overridePendingTransistion kullanabilirsiniz.
hpique

Benim hatam. Yayımım güncellendi. Kesinlikle kendi animasyonlarınızı yapabilir ve 1.5'te istediğiniz gibi özelleştirebilirsiniz. Ancak API düzeyinde 5'de görünmeye başladığı için overridePendingTransition'ı hala kullanamazsınız
Curtain

2

GALAXY IN Cihazlar:

Ayarlar> Geliştirici Seçenekleri'ni kullanarak cihazda kapatmadığınızdan emin olmanız gerekir:

iki kukla


cihazlar için bile :)
Ultimo_m

Sanırım, ama denemiyorum
Maher Ismaail

Fantastik! Yanıtınızı birkaç saatlik geçiş ve animasyonlar aradıktan sonra buldum.
CoolMind

1

ActivityCompat.startActivity () işlevini kullanın API> 21.

    ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, transitionImage, EXTRA_IMAGE);
    ActivityCompat.startActivity(activity, intent, options.toBundle());

1

Niyetinize Başlamadan Önce:

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(AlbumListActivity.this);
startActivity(intent, options.toBundle());

Bu, Etkinlik Geçişinize Varsayılan Animasyon verir.


0

Android'in bazı sürümleri özel Activitygeçişleri destekler, bazıları desteklemez (eski cihazlar). Özel geçişleri kullanmak istiyorsanız bunu kontrol etmek için iyi bir uygulamadır Activityvardır overridePendingTransition()öyle değil eski sürümlerinde olduğu gibi, yöntem.

Yöntemin var olup olmadığını bilmek için yansıma API'sı kullanılabilir. Varsa yöntemi kontrol edip döndürecek olan basit kod şöyledir:

Method mOverridePendingTransition;

try {
        mOverridePendingTransition = Activity.class.getMethod(
                "overridePendingTransition", new Class[] { Integer.TYPE, Integer.TYPE } );
        /* success */
    } catch (NoSuchMethodException nsme) {
        /* failure, this version of Android doesn't have this method */
    } 

Ve sonra, kendi geçişimizi uygulayabiliriz, yani varsa bu yöntemi kullanabiliriz:

if (UIConstants.mOverridePendingTransition != null) {
               try {
                   UIConstants.mOverridePendingTransition.invoke(MainActivity.this, R.anim.activity_fade_in, R.anim.activity_fade_out);
               } catch (InvocationTargetException e) {
                   e.printStackTrace();
               } catch (IllegalAccessException e) {
                   e.printStackTrace();
               }
            }

Burada örnek olarak geçiş gösterimi için basit solma ve solma animasyonları kullanılmıştır.


0

yakınlaştırma animasyonu

Intent i = new Intent(getApplicationContext(), LoginActivity.class);
 overridePendingTransition(R.anim.zoom_enter, R.anim.zoom_exit);
startActivity(i);
finish();

zoom_enter

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:fromAlpha="0.0" android:toAlpha="1.0"
    android:duration="500" />

zoom_exit

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:fromAlpha="1.0" android:toAlpha="0.0"
    android:fillAfter="true"
    android:duration="500" />
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.