android - मैं एक गतिविधि दृश्य एनीमेशन संक्रमण के दौरान स्टेटस बार और नेविगेशन बार को एनिमेशन से कैसे रोक सकता हूं?




android-5.0-lollipop shared-element-transition (5)

आपको उन्हें ActivityOptions.makeSceneTransitionAnimation. में साझा करने की आवश्यकता है ActivityOptions.makeSceneTransitionAnimation.

उदाहरण के लिए:

ActivityOptions.makeSceneTransitionAnimation(... Pair.create(activity.findViewById(android.R.id.window_status_bar), Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME) 

(psuedo का बहाना; मेरे पास सटीक android.R.id मान नहीं है)

विचारों को साझा करने के बाद आप एक उपयुक्त संक्रमण चला सकते हैं।

सबसे पहले, मेरी स्थिति पट्टी पृष्ठभूमि गहरे भूरे रंग के लिए सेट है, और मेरा नेविगेशन बार पृष्ठभूमि डिफ़ॉल्ट काला है। मैं मटेरियल लाइट थीम का उपयोग कर रहा हूं।

मैं एक नई गतिविधि शुरू कर रहा हूं, डिफ़ॉल्ट बदलावों के साथ ActivityOptions.makeSceneTransitionAnimation का उपयोग कर रहा हूं, और मुझे लगता है कि स्थिति और नेविगेशन बार संक्षिप्त रूप से सफेद और फिर सही रंगों में वापस आते हैं।

documentation अनुसार:

एक संक्रमण का पूर्ण प्रभाव प्राप्त करने के लिए, आपको कॉलिंग और कॉलिंग गतिविधियों दोनों पर विंडो सामग्री संक्रमण सक्षम करना होगा। अन्यथा, कॉलिंग गतिविधि निकास संक्रमण शुरू कर देगी, लेकिन फिर आपको एक विंडो संक्रमण (जैसे स्केल या फीका) दिखाई देगा

मैं getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS); का उपयोग कर रहा हूं getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS); कॉलिंग और गतिविधियों दोनों पर।

इसी तरह, अगर मैं एक स्लाइड में प्रवेश संक्रमण को बदलता हूं, तो स्थिति और नेविगेशन बार दोनों को एक सफेद पृष्ठभूमि के साथ स्लाइड संक्रमण होता है।

मैं एक गतिविधि दृश्य एनीमेशन संक्रमण के दौरान स्टेटस बार और नेविगेशन बार को एनिमेट करने से कैसे रोकूँ?


जहां तक ​​मैं समझता हूं कि यह गतिविधि संक्रमण ओवरलैप के कारण होता है। इस समस्या को दूर करने के लिए मैंने दोनों गतिविधियों के onCreate() विधियों में निम्नलिखित मानों का उपयोग किया है:

getWindow().setAllowEnterTransitionOverlap(false);
getWindow().setAllowReturnTransitionOverlap(false);

मेरे पास बस यही मुद्दा था, और जवाब पहेली को एक महत्वपूर्ण टुकड़ा याद आ रहे हैं। याद रखें कि एक साझा तत्व संक्रमण पर, सब कुछ गंतव्य गतिविधि में होता है।

चमकती प्रभाव को हटाने के लिए, बस निम्नलिखित गतिविधि को जोड़ने के लिए कहा जा रहा है:

Fade fade = new Fade();
fade.excludeTarget(android.R.id.statusBarBackground, true);
fade.excludeTarget(android.R.id.navigationBarBackground, true);

getWindow().setEnterTransition(fade);
getWindow().setExitTransition(fade);

इससे आपकी समस्या का समाधान हो जाना चाहिए!


यहाँ देखें कि मैंने यह कैसे किया। मैं एक ImageView के साथ SharedElementTransition Status Bar में Status Bar और Navigation Bar दोनों साझा करता हूं:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  View imageView = view.findViewById(R.id.iv);
  Resources resources = view.getResources();
  imageView.setTransitionName(resources.getString(R.string.transition_image_thumbnail));

  Pair<View, String> p1 = Pair.create(imageView, resources.getString(R.string.transition_image_thumbnail));

  Window window = getActivity().getWindow();

  View navigationBar = getActivity().findViewById(android.R.id.navigationBarBackground);
  View statusBar = getActivity().findViewById(android.R.id.statusBarBackground);

  Pair<View, String> p2 = Pair.create(statusBar, statusBar.getTransitionName());
  Pair<View, String> p3 = Pair.create(navigationBar, navigationBar.getTransitionName());

  ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(),
          p1, p2, p3);

  ActivityCompat.startActivity(getActivity(), intent, options.toBundle());
} else {
  startActivity(intent);
}

साझा तत्व संक्रमण के साथ हस्तक्षेप से गतिविधि संक्रमण को पूरी तरह से रोकें:

बाहर निकलने की गतिविधि पर, कॉल getWindow ()। SetExitTransition (नल);

प्रवेश गतिविधि पर, कॉल getWindow ()। SetEnterTransition (नल);

https://.com/a/34907685/967131

मुझे संदेह है कि इसके दुष्प्रभाव हो सकते हैं, लेकिन यह निश्चित रूप से नहीं पता है। यह मृत सरल है और यद्यपि काम करता है।

निमिष से विशिष्ट तत्वों को रोकें:

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

बेनाम: ओह, बात बात है? मैंने बहुत सारी टिप्पणियां देखीं जो स्टेटस बार और नेविगेशन बार के संदर्भों को पुनः प्राप्त करने की कोशिश कर रही थीं। मेरे साथ भी ऐसा ही हुआ, जब तक मुझे एहसास हुआ कि मैं उन लोगों को फ्रेग्मेंट के लेआउट में नहीं पाऊंगा ... वे उस स्तर से ऊपर थे। इसलिए, गतिविधि से सजावट दृश्य प्राप्त करने के लिए नीचे दिए गए कोड और खोज करें। तब मैंने उन्हें बिना किसी समस्या के पाया।

अंत में, मैंने इस उपयोगिता विधि को विकसित किया:

public static Bundle transitionOptions(Activity activity, int transitionViewResId, int transitionNameResId) {
   if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
       return null;
   }

   View decorView = activity.getWindow().getDecorView();
   View statusBar = decorView.findViewById(android.R.id.statusBarBackground);
   View navigationBar = decorView.findViewById(android.R.id.navigationBarBackground);
   View appBarLayout = decorView.findViewById(**R.id.appbarlayout**);
   View transitionView = decorView.findViewById(transitionViewResId);
   String transitionName = activity.getString(transitionNameResId);

   List<Pair<View, String>> pairs = new ArrayList<>();
   pairs.add(Pair.create(statusBar, Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME));
   pairs.add(Pair.create(navigationBar, Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME));
   if (appBarLayout != null) {
       pairs.add(Pair.create(appBarLayout, activity.getString(**R.string.transition_appbarlayout**)));
   }
   pairs.add(Pair.create(transitionView, transitionName));
   //noinspection unchecked - we're not worried about the "unchecked" conversion of List<Pair> to Pair[] here
   return ActivityOptionsCompat.makeSceneTransitionAnimation(activity, pairs.toArray(new Pair[pairs.size()]))
           .toBundle();
}

नोट R.string.transition_appbarlayout और R.id.appbarlayout । ये आईडी मनमानी हैं, जब तक वे मेल खाते हैं कि आपका कोड क्या उपयोग करता है। अपने एक्सएमएल में, मैं कस्टम एक्शन बार को लेआउट की तरह (आवश्यक को नीचे संपादित) करता हूं:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout
    android:id="**@+id/appbarlayout**"
    android:transitionName="**@string/transition_appbarlayout**">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"/>
</android.support.design.widget.AppBarLayout>

यदि आप इस तरह से टूलबार का उपयोग नहीं करते हैं, तो उस भाग को उपयोगिता विधि से हटाया जा सकता है।

तब आप इसे अपने फ्रैगमेंट में जैसे कहेंगे:

startActivity(intent, UIUtils.transitionOptions(getActivity(),
                        R.id.**my_view**,
                        R.string.**transition_my_view**));

जब तक यह आपके XML से मेल खाता है, तब तक आप जो भी मान चाहते हैं उसका उपयोग करना

यह स्थिति पट्टी, टूल बार और नेविगेशन बार (बैक / होम / हाल के ऐप्स बटन) को संक्रमण के दौरान चमकने से रोकता है। बाकी गतिविधि संक्रमण सामान्य है।

मेरे मामले में, हमारी ऐप थीम में एक android:windowBackground of blue। यह संक्रमण में एक नीली चमक का कारण बनता है, जो काफी निराशाजनक है। लेकिन इसके बजाय एक परिवर्तन करें जो पूरे ऐप को प्रभावित करता है जैसे, अब मैं पहले, त्वरित और गंदे विकल्प के साथ जा रहा हूं।





activity-transition