7

मैं एंड्रॉइड लॉलीपॉप की नई गतिविधि संक्रमण का उपयोग करना चाहता हूं। लेकिन वर्तमान में मैं एनिमेशन के दौरान बहुत अजीब hickups देख रहा हूँ। मैंने एक छोटे से नमूने को एक साथ हैक किया जिसे मैं सोच सकता था।साझा तत्वों के साथ गतिविधि संक्रमण में हिचकी

  1. सक्षम मेरी styles.xml
  2. में विंडो की सामग्री को संक्रमण मेरी शैली
  3. में एक बहुत ही सरल slide.xml बाहर निकलने के संक्रमण के रूप में संदर्भित परंतु एक के लिए एक android:transitionName:

    यह वही है मैं एक बहुत ही लघु संस्करण में किया था है दोनों लेआउट में साझा तत्व

  4. उस नाम के साथ ActivityOptions.makeSceneTransitionAnimation() पर कॉल किया गया और दृश्य मैं
  5. Pa साझा करना चाहता हूं startActivity()

के परिणामस्वरूप बंडल ssed यह वह जगह है व्यवहार मैं देख रहा हूँ (देखने के लिए मैं क्या मतलब है की कोशिश 10x धीमी गति एनीमेशन): सही से पहले स्लाइड एनीमेशन देखा गया है कि साझा नहीं कर रहे हैं नीचे स्लाइड, उन दृश्यों नीचे कूद थोड़ा सा। वे वास्तव में थोड़ा अलग स्थानांतरित करते हैं।

लेकिन: यह केवल दूसरा होता है जब मैं उस एनीमेशन (और हर बार बाद में) चलाता हूं। पहला पास बस ठीक दिखता है। और यह भी तब होता है जब मैं अगली गतिविधि के साथ तत्व साझा करना चाहता हूं। अगर मैं तत्व साझा करने की कोशिश नहीं करता तो सब ठीक काम करता है।

मूल्यों/styles.xml

<resources> 
<style name="AppTheme" parent="android:Theme.Material.Light"> 
    <!-- enable window content transitions --> 
    <item name="android:windowContentTransitions">true</item> 

    <!-- specify exit transition --> 
    <item name="android:windowExitTransition">@transition/slide</item> 
</style> 
</resources> 

संक्रमण/slide.xml मुख्य गतिविधि

के लिए

<slide /> 

लेआउट:

यहाँ मेरी कोड है

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <View 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:background="#0000ff" /> 

     <View 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:background="#00ff00" /> 

     <View 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:background="#0000ff" /> 

     <View 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:background="#00ff00" /> 

    </LinearLayout> 

    <!-- the actual element I want to share --> 
    <View 
     android:id="@+id/view" 
     android:layout_width="56dp" 
     android:layout_height="56dp" 
     android:background="#ff0000" 
     android:elevation="8dp" 
     android:transitionName="view" /> 

</RelativeLayout> 

MainActivity.java

public class MainActivity extends Activity implements View.OnClickListener { 

    View mView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mView = findViewById(R.id.view); 
     mView.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View view) { 
     ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, mView, "view"); 

     Intent intent = new Intent(this, SecondaryActivity.class); 
     startActivity(intent, options.toBundle()); 
    } 


} 
+0

आपके द्वारा साझा किए गए तत्व संक्रमण के लिए उपयोग किया जाने वाला कोड कहां है? मैं देखता हूं कि आपने अपनी शैली में 'windowExitTransition' निर्दिष्ट किया है, लेकिन आप' windowSharedElementExitTransition' को कैसे सेट कर रहे हैं? साथ ही, आपका दूसरा गतिविधि लेआउट कोड कैसा दिखता है? –

+0

साथ ही, क्या वही व्यवहार होता है यदि आप अपने गैर-साझा दृश्यों को निश्चित ऊंचाइयों (अपनी पहली गतिविधि के लेआउट एक्सएमएल में प्रत्येक दृश्य के लिए 'लेआउट_वेट = "1" 'सेट करने के बजाय' –

+0

'को निर्दिष्ट नहीं करते हैं, तो हम कस्टम' विंडोश्रेड एलिमेंट एक्स्टिट ट्रांसिशन 'निर्दिष्ट नहीं करते हैं। इसलिए हम विषयों को डिफ़ॉल्ट रूप से उपयोग कर रहे हैं। साझा तत्वों में पहले से ही दोनों लेआउट में एक निश्चित आकार है। – Greeny

उत्तर

11

यह संभव है कि आप बदलाव पुस्तकालय है कि, किसी कारण से, जब तक के बाद एल नीचे ताला लगा हुआ था खोज नहीं हुई थी में एक बग मार रहे हैं।

बग में, आपके पास एक पुनर्विक्रेता संक्रमण और साझा तत्व पुनर्विक्रेता संक्रमण होना चाहिए। डिफ़ॉल्ट पुनर्विक्रेता संक्रमण दोनों के लिए बाहर निकलने के संक्रमण के समान है।

यदि, वापसी संक्रमण के दौरान, साझा तत्व को कॉलिंग गतिविधि में स्थानांतरित कर दिया जाता है, जबकि विचार अभी भी प्रवेश कर रहे हैं, तो जब आप रिटर्न कॉल में बाधा डालते हैं तो आपको एक हिचकी दिखाई देगी। स्लाइड और विस्फोट संक्रमण के साथ, आप यह भी देखेंगे कि अगली बार जब आप बाहर निकलेंगे, तो वे उस हिसाब से शुरू हो जाएंगे, जहां आपको एक अच्छा डबल-वामी मिल जाएगा।

  • स्पष्ट रूप android:windowSharedElementReenterTransition@null करने के लिए सेट:

    तो आपके पास कुछ विकल्प MR1 जब तक इस बग के आसपास काम करना है। अधिकांश समय आपको साझा तत्व पुनर्विक्रेता संक्रमण की आवश्यकता नहीं होती है क्योंकि कहा जाता है गतिविधि साझा तत्व आपके लिए सही स्थान पर रखेगी।

  • एक निकास संक्रमण का प्रयोग न करें (सेट android:windowReenterTransition@null करने के लिए)
  • यकीन के बुला गतिविधि के android:windowSharedElementReturnTransition काफी बड़ी है ताकि बुला गतिविधि के windowReenterTransition खत्म पहली अवधि बनाओ। यह मुश्किल हो सकता है क्योंकि यह डिवाइस स्थिति पर निर्भर हो सकता है - कॉलिंग गतिविधि को स्मृति से हटा दिया गया है और इसे पुनरारंभ करने की आवश्यकता है।
  • android:windowAllowReturnTransitionOverlap से false पर सेट करें।
+1

क्या आप Google पर एक सॉफ्टवेयर इंजीनियर हैं? बस सोच रहा है क्योंकि यह ऐसा लगता है लेकिन यह आपके StackOverflow प्रोफ़ाइल में ऐसा नहीं कहता है। :) –

+0

'एंड्रॉइड सेट करना: windowAllowReturnTransitionOverlap' को' false' के लिए अभी काम करता है। लेकिन मैंने https://code.google.com/p/android/issues/detail?id=78393 –

+0

हाँ पर एक बग रिपोर्ट भी दायर की, मुझे उस प्रोफ़ाइल को अपडेट करना चाहिए। Bjorn, बग दाखिल करने के लिए धन्यवाद। –

संबंधित मुद्दे