Android में गतिविधि संक्रमण


188

मैं एंड्रॉइड 1.5 और बाद के लिए दो गतिविधियों के बीच संक्रमण को कैसे परिभाषित कर सकता हूं? मैं एक गतिविधि को फीका करना चाहूंगा।


7
overridePendingTransitionनीचे दिए गए सभी- संबंधित उत्तरों पर लागू होता है : (0, 0)यदि आप कोई एनीमेशन नहीं चाहते हैं तो आप पास कर सकते हैं ।
dokkaebi

जवाबों:


164

आप इसके साथ कर सकते हैं Activity.overridePendingTransition()। आप XML संसाधन फ़ाइल में सरल संक्रमण एनिमेशन को परिभाषित कर सकते हैं।


धन्यवाद iandisme overridePengingTransition एपीआई स्तर 5 है। क्या स्तर 3 (Android 1.5) के लिए ऐसा करना संभव नहीं है?
hpique

आह, तुम सही हो। केसीबी का जवाब शायद आप जो खोज रहे हैं उसकी तर्ज पर अधिक है।
iandisme

अभी तक नहीं पाया गया कि केसीबी के उत्तर के साथ एक उचित फीका कैसे करें।
hpique

1
आप इसे अपनी गतिविधि के onCreateकार्य में कर सकते हैं ।
mxcl

1
एचटीसी पर आपको काम करने के लिए सेटिंग्स (डिस्प्ले> एनीमेशन) को बदलना होगा (या कम से कम एचटीसी डिजायर एचडी पर)।
उरबोस

191

यहाँ दो गतिविधियों के बीच एक अच्छा चिकनी फीका करने के लिए कोड है ..

एक फाइल बनाएं जिसका नाम fadein.xmlमेंres/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" />

एक फाइल बनाएं जिसका नाम fadeout.xmlमेंres/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" />

आप से फीका करने के लिए चाहते हैं गतिविधि एक करने के लिए गतिविधि बी , में निम्नलिखित डाल onCreate()के लिए विधि गतिविधि बीsetContentView()मेरे लिए काम करने से पहले ।

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

यदि आपके लिए फीके बहुत धीमे हैं, तो android:durationऊपर xml फ़ाइलों में कुछ छोटा करने के लिए बदलें ।


53
बस इससे जोड़ना है। OS को आपकी गतिविधि को बंद करने का निर्णय लेने के ठीक बाद ओवरराइडपेंडिंगट्रांसिशन () को फिर से कॉल करने की आवश्यकता होगी। मैंने एक्टिविटी के ऑनपॉज () मेथड में ओवरराइडिंग ट्रान्सप्रेन्टेशन (फैडिन, फेडआउट) के लिए एक और समान कॉल लगाया। अन्यथा, आप गतिविधि को फीका देखेंगे, लेकिन बंद होने पर फीका नहीं होगा।
नैट

2
अन्य धागे पर कोई जवाब नहीं। मैं इसे हटा रहा हूं। मैं जो अनुभव कर रहा हूं, वह होता है कि संक्रमण तुरंत होता है और फिर यह अंधेरा हो जाता है और अंदर चला जाता है। इसलिए मैं गतिविधि ए पर हूं और गतिविधि बी प्रदर्शित होती है और फिर मंद हो जाती है। फिर मैंने निर्देशों का पालन करने के लिए इसे संशोधित किया। गतिविधि A के ऑनपॉज () में कोड जोड़कर समान व्यवहार प्राप्त करें।
हग पर गीक्स

12
अंतर्निहित एंड्रॉइड एनिमेशन का उपयोग करने से एक चिकनी संक्रमण होता है: overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout); उन फ़ाइलों को देखने से आपको अपने कस्टम एनिमेशन में सुधार करने के तरीके पर संकेत मिल सकते हैं (जैसे कि फीका करने की तुलना में पिछले लंबे समय में फीका बनाकर)।
दान जे १

3
बस बदलने के लिए fadeinऔर fadeoutकरने के लिए भूल नहीं है fade_inऔर fade_out। दान जे के पद से
फरीद

1
डॉक्स के अनुसार, आपको कॉल करने के overridePendingTransition()बाद finish()और / या सही कॉल करना चाहिए startActivity()। मैं नई गतिविधि शुरू करने के तुरंत बाद फोन करके इस तरह एक अच्छा फीका पाने में सक्षम था।
आयनोकॉस्ट ब्रिघम

50

यह करने के लिए एक आसान तरीका है:

  1. अपनी शैली में एक एनीमेशन शैली बनाएँ। xml फ़ाइल
<style name="WindowAnimationTransition">
    <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
    <item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>
  1. इस शैली को अपने ऐप थीम में जोड़ें
<style name="AppBaseTheme" parent="Theme.Material.Light.DarkActionBar">
      <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
</style>

बस :)


31

हाँ। आप ओएस को बता सकते हैं कि आप अपनी गतिविधि के लिए किस तरह का संक्रमण चाहते हैं।

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

    ...

}

जहाँ ANIMATION एक पूर्णांक है जो OS में निर्मित एनीमेशन का संदर्भ देता है।


क्या मुझे काम करने के लिए कुछ और करना होगा? getWindow ()। setWindowAnimations (android.R.anim.fade_in) के परिणामस्वरूप डिफ़ॉल्ट रूप से उपयोग किया जाने वाला पुश संक्रमण नहीं होता है, लेकिन यह एक फीका संक्रमण भी नहीं है। नई गतिविधि सिर्फ नेक्सस वन डिवाइस में पिछले एक से अधिक दिखाई देती है।
hpique

1
ऐसा इसलिए है क्योंकि यह संसाधन के लिए नहीं पूछ रहा है, यह ओएस में निर्मित एक संक्रमण एनीमेशन की आईडी के लिए पूछ रहा है। डेवलपर.
android.com/intl/fr/reference/android/view/…

4
ऐसा लगता है कि setWindowAnimations केवल शैली संसाधनों को स्वीकार करता है। getWindow ()। setWindowAnimations (android.R.style.Animation_Toast) निकटतम मैं एक फीका में पाया गया है, लेकिन यह काले रंग से फीका है, पिछली गतिविधि नहीं।
hpique

1
यह ओएस में एनीमेशन में बनाया जाना नहीं है, आप मूल्यों में एक कस्टम निश्चित कर सकते हैं।
ilija139

1
@ ilija139, क्या आपको यकीन है? यह यहां कहता है। developer.android.com/reference/android/view/… : "यह एक सिस्टम संसाधन होना चाहिए; यह एप्लिकेशन संसाधन नहीं हो सकता क्योंकि विंडो प्रबंधक के पास अनुप्रयोगों तक पहुंच नहीं है।"
लैपिस

29

Res> anim> 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> 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 में> मान> स्टाइल। xml

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

गतिविधियों में शामिल करें ()

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

2
मैं इसे एक विषय से जोड़ने का सुझाव दूंगा ताकि यह सभी गतिविधियों पर लागू हो?
पीटरडक

12
ये एनिमेशन एंड्रॉइड में पहले से ही परिभाषित हैं, बस सभी गतिविधियों के ऑनपॉज़ () में निम्न कोड जोड़ें:overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
Elad Nava

हां, बस यह दिखाना चाहता था कि एनीमेशन डेवलपर्स को पसंद किए जा सकते हैं।
आइससेवेट

29

डिफ़ॉल्ट एनिमेशन की सूची के लिए देखें: http://developer.android.com/reference/android/R.anim.html

वास्तव में fade_inऔर fade_outएपीआई स्तर 1 और ऊपर के लिए है।


2
जैसे getWindow ()। setWindowAnimations (android.R.anim.slide_in_left);
पियरे

5
चीयर्स, मुझे खोजने के लिए आश्चर्यजनक रूप से लंबे समय के Googling ले गए।
जियोर्गेसी

25

मैं अपनी डिफ़ॉल्ट गतिविधि एनीमेशन को अधिलेखित करता हूं। मैं इसे एपी 15 में परीक्षण करता हूं कि यह सुचारू रूप से काम करता है। यहाँ समाधान है कि मैं का उपयोग करें:

<!-- 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 फोल्डर के तहत ऐनिमेटेड फोल्डर बनाएं और फिर यह चार एनीमेशन फाइल्स बनाएं:

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>

आप मेरा नमूना प्रोजेक्ट डाउनलोड कर सकते हैं ।

बस इतना ही... :)


यह स्वीकृत उत्तर होना चाहिए। अच्छा काम करता है!
एजडेव

24

यहाँ दो गतिविधि के बीच एक अच्छा सुचारू करने के लिए कोड है।

  1. बाएं से दाएं को चिकना प्रभाव

    रेस / ऐनिमेशन में स्लाइड_इन_ राइट.एक्सएमएल और स्लाइड_आउट_राइट.एक्सएमएल नामक फाइल बनाएं

    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. दाएं से बाएं ओर का सहज प्रभाव

    रेस / ऐनिमेशन में एक फाइल बनाएं जिसे एनीमेशन_सेंटर.एक्सएमएल और ऐनिमेशन_लीव.एक्सएमएल कहा जाता है

    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. एक गतिविधि से दूसरी गतिविधि पर नेविगेट करें

       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. वापस प्रेस घटना या एक गतिविधि के लिए दूसरी गतिविधि से नेविगेट

     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 और 4 में सक्रियता
तारेक

यह मेरे लिए काम नहीं कर रहा है अगर ओवरराइडिंग ट्रेंडिशन () स्टार्ट एक्टिविटी () से पहले रखा जाए
फर्नांडो टैन

बुलाना चाहिए overridePendingTransitionतुरंत बाद : startActivity developer.android.com/reference/android/app/...
Midhun सांसद

4

आप Android 1.5 में ओवरराइडिंग ट्रेंडिंग का उपयोग नहीं कर सकते। overridePendingTransistion Android 2.0 पर आया।

यदि आप बिना किसी त्रुटि के इस के माध्यम से जाने वाले हैं, तो आपको साधारण एनिमेशन (या आप खुद) का उपयोग करके लक्ष्य (1.5 या उच्चतर) के लिए संकलन करना होगा या आपको ओवरराइडिंगट्रांसट्रिशन का उपयोग करके लक्ष्य (2.0 या उच्चतर) के लिए संकलन करना होगा।

सारांश: आप एंड्रॉइड 1.5 में ओवरराइडिंग ट्रेंडिंगट्रिशन का उपयोग नहीं कर सकते हैं

हालांकि आप OS में बिल्ट-इन एनिमेशन का उपयोग कर सकते हैं।


वह सही नहीं है। एनिमेशन 1.6 से पहले एंड्रॉइड में अच्छी तरह से हैं और आप अभी भी 1.5 टारगेट करने के लिए प्रतिबिंब के साथ ओवरराइडिंग ट्रेंड्सट्रिशन का उपयोग कर सकते हैं।
hpique

खैर, मेरी गलती है। मेरी पोस्ट अपडेट की गई। आप निश्चित रूप से अपने स्वयं के एनिमेशन कर सकते हैं और उन्हें अनुकूलित कर सकते हैं जैसा आप 1.5 में चाहते हैं। लेकिन आप अभी भी overridePendingTransition उपयोग नहीं कर सकते, क्योंकि यह 5. एपीआई स्तर के में प्रदर्शित करने के लिए शुरू कर दिया
परदा

2

आकाशगंगा उपकरणों में:

आपको यह सुनिश्चित करने की आवश्यकता है कि आपने सेटिंग> डेवलपर विकल्प का उपयोग करके इसे डिवाइस में बंद कर दिया है:

दो muppets


यहां तक ​​कि एलजी उपकरणों के लिए :)
अल्टिमो_म

मुझे ऐसा लगता है, लेकिन मैं इसे
आजमाता नहीं हूं

बहुत खुबस! मुझे संक्रमण और एनिमेशन खोजने के कई घंटों के बाद आपका जवाब मिला।
कूलमाइंड

1

ActivityCompat.startActivity () वर्क्स API> 21 का उपयोग करें।

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

1

अपना इरादा शुरू करने से पहले:

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

यह आपकी गतिविधि संक्रमण के लिए डिफ़ॉल्ट एनीमेशन देता है।


0

एंड्रॉइड के कुछ संस्करण कस्टम Activityट्रांज़िशन का समर्थन करते हैं और कुछ (पुराने डिवाइस) नहीं करते हैं। यदि आप कस्टम बदलावों का उपयोग करना चाहते हैं, तो यह जाँचना अच्छा है कि क्या ActivityहैoverridePendingTransition() , विधि के रूप में पुराने संस्करणों पर ऐसा नहीं है।

यह जानने के लिए कि विधि मौजूद है या नहीं, प्रतिबिंब एपीआई का उपयोग किया जा सकता है। यहां सरल कोड है जो मौजूद होने पर विधि की जांच करेगा और वापस करेगा:

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 */
    } 

और फिर, हम अपने स्वयं के संक्रमण को लागू कर सकते हैं, अर्थात यदि मौजूद है तो इस विधि का उपयोग करें:

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

यहाँ, एक उदाहरण के रूप में, साधारण फीका और फीका-आउट एनिमेशन संक्रमण प्रदर्शन के लिए उपयोग किए गए थे।


0

एनीमेशन में ज़ूम आउट करें

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" />
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.