7

मैं एक साझा तत्व संक्रमण को कार्यान्वित करने की कोशिश कर रहा हूं जब एक स्क्रीन से 2 ImageViews अगली स्क्रीन पर जाएं। छवियों में से एक के पास स्क्रीन पर centerCrop का स्केल टाइप है। जिस समस्या का सामना करना पड़ रहा है वह यह है कि जब संक्रमण शुरू होता है तो छवि अगली स्क्रीन पर एनिमेट करने से पहले ही इसका मूल आकार (फसल से पहले) जा रही है। जब यह अगली स्क्रीन तक पहुंच जाए तो यह इसे अपने मूल आकार के साथ पहुंचता है और केवल तभी यह लक्ष्य छवि दृश्य में फंस जाता है।स्केल टाइप टाइप के साथ साझा तत्व क्रॉप संक्रमण अजीब है:

पूरा अनुभव चिकनी और आंखों के लिए वास्तव में अजीब नहीं है। कोड मैं का उपयोग करें:

public void animateIntent(View view, ArticleCoverData articleCoverData) { 
    Intent intent = new Intent(mActivity, ReaderActivity.class); 
    intent.putExtra(Constants.ARTICLE_DATA, articleCoverData); 

    // The view animation will start from 
    View coverStartView = view.findViewById(R.id.coverImage); 
    View coverDiagonalDecoratorStartView = view.findViewById(R.id.diagonal_image_decorator); 

    Pair<View, String> pair1 = Pair.create(coverStartView, mActivity.getString(R.string.transition_timeline_cover_image_to_reader_name)); 
    Pair<View, String> pair2 = Pair.create(coverDiagonalDecoratorStartView, mActivity.getString(R.string.transition_timeline_cover_image_diagonal_decorator_to_reader_name)); 

    ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(mActivity, pair1, pair2); 
    ActivityCompat.startActivity(mActivity, intent, options.toBundle()); 
} 

छवि वेब निम्न कोड के साथ Glide का उपयोग करने से भरी हुई है:

Glide.with(mActivity).load(articleCoverData.mImageUrl).skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.SOURCE).dontTransform().into(holder.coverImage); 

प्राप्त ओर छवि के रूप में भरी हुई है पर इस प्रकार है:

Glide.with(mContext).load(mData.mImageUrl).skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.SOURCE).into(mCoverImageView); 

शैली में मैंने परिभाषित किया:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <!-- Add this line --> 
    <item name="android:windowContentTransitions">true</item> 

    <!-- This is the color of the Status bar --> 
    <item name="colorPrimaryDark">@color/transparent</item> 

    <!-- specify shared element transitions --> 
    <item name="android:windowSharedElementEnterTransition"> 
     @transition/change_image_transform</item> 
    <item name="android:windowSharedElementExitTransition"> 
     @transition/change_image_transform</item> 
</style> 

जब change_image_transform है:

<?xml version="1.0" encoding="utf-8"?> 
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> 
    <changeImageTransform/> 
</transitionSet> 

संपादित करें: के लिए संक्रमण को बदलने की कोशिश की:

<?xml version="1.0" encoding="utf-8"?> 
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> 
    <changeBounds/> 
    <changeTransform/> 
    <changeImageTransform/> 
</transitionSet> 

या

<?xml version="1.0" encoding="utf-8"?> 
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> 
    <changeBounds/> 
    <changeImageTransform/> 
</transitionSet> 

लेकिन परिणाम एक ही है।

प्रश्न यह है: क्या मुझे यहां कुछ याद आ रही है, क्या मुझे इस अनुभव को परेशान करने के लिए कुछ और करने की ज़रूरत है? या यह एक एंड्रॉइड बग है?

अग्रिम धन्यवाद।

उत्तर

2

अंत में करने के लिए बदलने के लिए, इस समस्या को हल करने में कामयाब रहे।

private static void startAnimatedTransitionIntent(Activity context, View view, ArticleCoverData articleCoverData) { 
    Intent intent = new Intent(context, ReaderActivity.class); 
    intent.putExtra(Constants.ARTICLE_DATA, articleCoverData); 

    View coverStartView = view.findViewById(R.id.coverImage); 
    View coverDiagonalDecoratorStartView = view.findViewById(R.id.diagonal_image_decorator); 

    Window window = context.getWindow(); 
    View decor = window.getDecorView(); 
    View navigationBarStartView = decor.findViewById(android.R.id.navigationBarBackground); 

    List<Pair<View, String>> pairs = new ArrayList<>(); 
    pairs.add(Pair.create(coverStartView, context.getString(R.string.transition_timeline_cover_image_to_reader_name))); 
    pairs.add(Pair.create(coverDiagonalDecoratorStartView, context.getString(R.string.transition_timeline_cover_image_diagonal_decorator_to_reader_name))); 

    if (navigationBarStartView != null) { 
     pairs.add(Pair.create(navigationBarStartView, Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME)); 
    } 

    ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(context, pairs.toArray(new Pair[pairs.size()])); 
    ActivityCompat.startActivity(context, intent, options.toBundle()); 
} 

मैं पिकासो का उपयोग कर छवि दृश्य में छवियों को लोड कर रहा हूँ और निम्नलिखित कोड:

Picasso.with(mActivity).load(articleCoverData.mImageUrl).into(articleVH.coverImage); 

प्राप्त पक्ष मैं लागू पर वांछित परिणाम के लिए निम्न कोड और विन्यास का उपयोग कर हासिल की थी उसी तरह से छवि:

Picasso.with(mContext).load(mData.mImageUrl).into(mCoverImageView); 

शैली:

+०१२३५१६४१०६
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <item name="android:statusBarColor">@color/app_red</item> 
    <item name="android:windowContentTransitions">true</item> 

    <!-- This is the color of the Status bar --> 
    <item name="colorPrimaryDark">@color/transparent</item> 
    <item name="android:windowDrawsSystemBarBackgrounds">true</item> 

    <!--<item name="android:windowEnterTransition">@transition/cheeses_enter</item>--> 
    <!--<item name="android:windowExitTransition">@transition/cheeses_exit</item>--> 

    <item name="android:windowSharedElementEnterTransition">@transition/cheeses_enter</item> 
    <item name="android:windowSharedElementExitTransition">@transition/cheeses_exit</item> 
</style> 

दोनों संक्रमण: cheeses_enter और cheeses_exit हैं:

<?xml version="1.0" encoding="utf-8"?> 
<transitionSet> 
    <changeBounds /> 
    <changeTransform /> 
    <changeClipBounds /> 
    <changeImageTransform /> 
</transitionSet> 

महत्वपूर्ण बात यह है imageView scaleType पैरामीटर का उपयोग और उपयोग नहीं कर पिकासो फसल या ग्लाइड फसल अपने पैमाने प्रकार लागू करने के लिए है।

क्योंकि यदि आप ऐसा करते हैं तो फसल और अन-फसल कार्रवाई संक्रमण के हिस्से के रूप में कार्य करेगी।

+1

यह कुंजी थी "छविव्यू स्केल टाइप पैरामीटर का उपयोग करके अपने स्केल प्रकार को लागू करना और पिकासो फसल या ग्लाइड फसल का उपयोग नहीं करना महत्वपूर्ण बात है।" धन्यवाद – Lancelot

0

अपने change_image_transform.xml में, इस

<?xml version="1.0" encoding="utf-8"?> 
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> 
    <changeImageTransform/> 
    <changeBounds/> 
</transitionSet> 
+0

पहले ही इसकी कोशिश कर रहा है, नतीजा वही है। –

+0

मुझे लगता है कि आप नई गतिविधि में छवि यूआरएल पास करते हैं और फिर नई गतिविधि में, आप इसे फिर से लोड करने के लिए ग्लाइड का उपयोग करते हैं? छवि के बिटमैप को पास करने का प्रयास करें, मुझे लगता है कि यह – Fuyuba

+0

हां चिकना होगा, लेकिन छवि को ग्लाइड द्वारा कैश किया गया है, इसलिए दूसरी बार इसका उपयोग किया जाता है, यह डिस्क से उपयोग किया जाता है और वेब से फिर से लोड नहीं होता है। –

0

इस समस्या को उछालने वाले किसी के लिए सिर्फ एक उत्तर देने के लिए (और थोड़ा और स्पष्टीकरण)।

सबसे पहले बस <changeImageTransform/> और <changeBounds/> का उपयोग करके संक्रमण करने के लिए पर्याप्त है।

समस्या मुख्य रूप से ग्लाइड उस समय छविदृश्य/खींचने योग्य माप को संभालती है। कुछ देरी है और इस कारण से कोई संक्रमण एनीमेशन नहीं बनाया गया है।

पिकासोscaletype के आधार पर छवि (मैट्रिक्स) के स्थान के मूल्यों को पर्याप्त तेज़ी से प्रदान करता है और संक्रमण कार्य करता है।

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