2015-01-11 5 views
13

एंड्रॉयड 5.0 मैं, परिपत्र के साथ काम करने पहली क्लिक एनीमेशन पर एनीमेशन प्रकटCircularReveal एनीमेशन पहला प्रयास पर काम नहीं करता

समस्या

जब मैं बटन पर क्लिक करें एनीमेशन प्रकट शुरू करने के लिए नहीं है कोशिश कर रहा हूँ में शुरू

दूसरा क्लिक के बाद यह सामान्य रूप से काम करता है

मेरे कोड

public class MainActivity extends ActionBarActivity { 

Animator a; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    final View cardType = findViewById(R.id.cardtype); 
    cardType.setVisibility(View.GONE); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     a = ViewAnimationUtils.createCircularReveal(cardType, 
       cardType.getWidth(), 
       cardType.getHeight(), 
       0, 
       cardType.getHeight() * 2) 
       .setDuration(2500); 
     a.addListener(new AnimatorListenerAdapter() { 
      @Override 
      public void onAnimationStart(Animator animation) { 
       super.onAnimationStart(animation); 
       cardType.setVisibility(View.VISIBLE); 
      } 
     }); 
     a.addListener(new AnimatorListenerAdapter() { 
      @Override 
      public void onAnimationEnd(Animator animation) { 
       super.onAnimationEnd(animation); 
       cardType.setVisibility(View.GONE); 
      } 
     }); 
     findViewById(R.id.icon_first_activity).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       a.start(); 
      } 
     }); 
    } 
}} 
+0

अरे, क्या आप इसे ठीक करने में कामयाब रहे हैं? मुझे एक ही समस्या है और समाधान नहीं मिल रहा है। –

+1

@ निकोलाक। हाँ, मैं यह समाधान है मानों मेरी कोड में की तरह सीधे का उपयोग नहीं करते 'cardType.getWidth()' सीधे नहीं पारित किया जाना चाहिए, इसे लोड करने में समय लगता हल किया। ताकि एनीमेशन और मूल्य – architjn

+0

आरंभ करने के लिए वहाँ आप क्या कह रहे हैं में तर्क है के बीच में कुछ समय मिलता है सबसे अच्छा तरीका है, अन्य गतिविधि या कुछ और से मूल्यों को प्राप्त करने के लिए है।मैंने विधि के पैरामीटर के रूप में पहले से गणना किए गए चर को पारित करने का प्रयास किया है, और समस्या अभी भी वहां है :(मैंने चर के बजाय कच्चे मान लिखने का भी प्रयास किया है, और इससे इसे ठीक नहीं किया गया है। –

उत्तर

25

मैंने आपके कोड की कोशिश नहीं की है, लेकिन मुझे लगता है कि आपके पास एक छोटी ऑर्डरिंग समस्या है। मुझे लगता है कि आपको से पहले एनीमेशन शुरू करने की आवश्यकता है। जोड़ने

संपादित करने के लिए:

... और आप अपने बटन View.INVISIBLE, नहीं View.GONE की स्थापना की जानी चाहिए।

यहां: This code works

संपादित एक बार फिर जोड़ने के लिए:

हां। आपकी समस्या यह है कि आप प्रारंभ में देखें GONE सेट करें। इसका मतलब है कि इसका आकार 0 है। फिर आप समन्वय प्रकट करने के रूप में cardType.getHeight और cardType.getWidth का उपयोग करते हैं। वे 0 हैं। आप दृश्य को प्रारंभिक रूप से सेट करना चाहते हैं, और फिर प्रकट होने के केंद्र के रूप में चौड़ाई/2 और ऊंचाई/2 का उपयोग करें।

+0

काम नहीं कर रही है, पहले से ही – architjn

+1

की कोशिश की गई है, इसलिए अन्य समस्याएं भी हो सकती हैं, लेकिन आप निश्चित रूप से कम से कम ऐसा करने की आवश्यकता है। –

+0

'ऑनएनीमेशन स्टार्ट' वही काम करें – architjn

-1

समाधान सीधे कोड
या तो और क्लिक पर एनीमेशन कोड बाहर मूल्यों onclick डाल में मान नहीं मिलता है या अन्य गतिविधि


से मूल्यों को प्राप्त करके मान मेरा मतलब cardType.getWidth() और cardType.getHeight()

है
+0

क्या आप काम करने वाले कोड का एक सारांश साझा कर सकते हैं, क्योंकि मुझे आपकी जैसी ही समस्या है और मैं इसे समझ नहीं सकता। – AdamMc331

+0

@ McAdam331 आप इसे लोड करने के लिए कह रहे हैं, गतिविधि की शुरुआत या क्लिक पर? – architjn

+0

मैंने कोड को ऑनविंडोफोकसchanged में रखा है। जब तक बटन क्लिक नहीं किया जाता है तब तक मैं एनीमेशन शुरू नहीं करता हूं। – AdamMc331

5

मूल रूप से अन्य लोगों के सवालों के जवाब में क्या कहते, यह सही है, लेकिन समस्या यह है कि आप दृश्यता चला चाहते हैं (क्योंकि अपने लेआउट यह चला की आवश्यकता है!) आप (और साथ ही और/या 0dp चौड़ाई) दृश्यता ऊंचाई 0dp साथ एक्सएमएल में अदृश्य सेट करने के लिए और प्रोग्रामेटिक रूप से क्लिक ईवेंट के अंदर भी सही लेआउटपैम सेट करें, यह डब्ल्यू होगा ork। उदाहरण के लिए मेरी कोड:

... 
    expandButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      //To not have empty scroll, the container is INVISIBLE with 0dp height. 
      //Otherwise the Reveal effect will not work at the first click. 
      //Here I set the parameters programmatically. 
      viewContainer.setLayoutParams(new LinearLayout.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT, 
        ViewGroup.LayoutParams.WRAP_CONTENT)); 

      if (viewContainer.getVisibility() == View.VISIBLE) { 
       expandButton.animate().rotation(0f).setDuration(duration).start(); 
       Utils.unReveal(viewContainer, 0, 0); 
      } else { 
       expandButton.animate().rotation(180f).setDuration(duration).start(); 
       Utils.reveal(viewContainer, viewContainer.getWidth(), 0); 
      } 
     } 
    }); 
    ... 

@TargetApi(VERSION_CODES.LOLLIPOP) 
public static void reveal(final View view, int cx, int cy) { 
    if (!hasLollipop()) { 
     view.setVisibility(View.VISIBLE); 
     return; 
    } 

    //Get the final radius for the clipping circle 
    int finalRadius = Math.max(view.getWidth(), view.getHeight()); 

    //Create the animator for this view (the start radius is zero) 
    Animator animator = 
      ViewAnimationUtils.createCircularReveal(view, cx, cy, 0, finalRadius); 

    //Make the view VISIBLE and start the animation 
    view.setVisibility(View.VISIBLE); 
    animator.start(); 
} 

@TargetApi(VERSION_CODES.LOLLIPOP) 
public static void unReveal(final View view, int cx, int cy) { 
    if (!hasLollipop()) { 
     view.setVisibility(View.GONE); 
     return; 
    } 

    //Get the initial radius for the clipping circle 
    int initialRadius = view.getWidth(); 

    //Create the animation (the final radius is zero) 
    Animator animator = 
     ViewAnimationUtils.createCircularReveal(view, cx, cy, initialRadius, 0); 

    //Make the view GONE when the animation is done 
    animator.addListener(new AnimatorListenerAdapter() { 
     @Override 
     public void onAnimationEnd(Animator animation) { 
      super.onAnimationEnd(animation); 
      view.setVisibility(View.GONE); 
     } 
    }); 

    //Start the animation 
    animator.start(); 
} 

आप केवल एक्सएमएल में चला सेट करते हैं, पहली बार कभी काम नहीं करेगा क्योंकि ऊंचाई/चौड़ाई/x/y/आदि .. 0. इसके अलावा रहे हैं, अगर आप बस से पहले अदृश्य सेट एनीमेशन के लिए कॉल काम भी करेगा, लेकिन यदि आप दृश्यता के साथ शुरू करते हैं तो यह लेआउट पैराम शुरू करेगा।

0

मैं क्या किया, यह है, जैसा मैं एक ही ऊंचाई के साथ दो दृश्य है अब हम दृश्यता चला रिटर्न 0 {ऊंचाई और चौड़ाई} के रूप में की तुलना में मैं दिखाई दृश्य ऊंचाई हर बार और मेरे लिए अपने काम दे रहा हूँ।

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