12

मैं com.android.support:design:23.1.0 से फ़्लोटिंग एक्शन बटन (फैब) घटक का उपयोग कर रहा हूं, मेरे ऐप के fabs उत्पन्न करने के लिए लाइब्रेरी।fab.show() नई गतिविधि को शुरू करने के बाद पहली बार एनिमेटेड नहीं

लेकिन पहली बार जब मैं fab.hide() के साथ एक नई गतिविधि लोड करता हूं और बटन को क्लिक करने के बाद fab.show() के माध्यम से आइकन को देखने का प्रयास करता हूं, तो फैब के लिए कोई एनीमेशन नहीं होता है। यह एक नई गतिविधि लोड करने के बाद पहली बार होता है। जब मैं बटन को छिपाने और दिखाने के लिए कई बार कोशिश करता हूं, तो यह ठीक से एनिमेटेड होता है।

यहां समस्या क्या है? एक गतिविधि लोड होने के बाद भी एनिमेटेड होने के लिए यह एक आकर्षण होगा।

गतिविधि में

जावा:

fabSend = (FloatingActionButton) findViewById(R.id.fabSend); 
    fabSend.hide();  


CompoundButton.OnCheckedChangeListener changeChecker = new CompoundButton.OnCheckedChangeListener() { 

    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     if (isChecked){ 
//    FAB on 
       fabSend.show(); 
      } else { 
//    FAB off 
       fabSend.hide(); 
      } 
     } 
    }; 

Layout.xml

  <android.support.design.widget.FloatingActionButton 
       android:id="@+id/fabSend" 
       app:borderWidth="0dp" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="end" 
       android:layout_alignParentBottom="true" 
       android:layout_marginRight="@dimen/fab_margin" 
       android:layout_marginBottom="54dp" 
       android:src="@drawable/ic_check_white_24dp" /> 

उत्तर

4

अंत में यह एक हल। मैंने विलंब के साथ एनीमेशन प्रकट करने के लिए एक नई कक्षा तैयार की है। इसे यहां पकड़ो, इसे शुरू करें और आप जाने के लिए अच्छे हैं। मुझे मानक fab.show() पर 50ms देरी पर एक बहुत ही समान एनीमेशन मिला।

public static void showFabWithAnimation(final FloatingActionButton fab, final int delay) { 
    fab.setVisibility(View.INVISIBLE); 
    fab.setScaleX(0.0F); 
    fab.setScaleY(0.0F); 
    fab.setAlpha(0.0F); 
    fab.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
     @Override 
     public boolean onPreDraw() { 
      fab.getViewTreeObserver().removeOnPreDrawListener(this); 
      fab.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        fab.show(); 
       } 
      }, delay); 
      return true; 
     } 
    }); 
} 
0

डॉक्स के अनुसार:

android.support.design.widget.FloatingActionButton

सार्वजनिक शून्य शो()

बटन दिखाती है। यह विधि बटन बटन को एनिमेट कर देगी यदि दृश्य पहले से ही रखा गया है।

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

/** 
* Unlike {@link FloatingActionButton#show()} animates button even it not currently 
* laid out 
* @param fab fab to show 
*/ 
@SuppressLint("NewApi") 
public static void show(FloatingActionButton fab) { 
    if (ViewCompat.isLaidOut(fab) || 
      Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
     fab.show(); 
    } else { 
     fab.animate().cancel();//cancel all animations 
     fab.setScaleX(0f); 
     fab.setScaleY(0f); 
     fab.setAlpha(0f); 
     fab.setVisibility(View.VISIBLE); 
     //values from support lib source code 
     fab.animate().setDuration(200).scaleX(1).scaleY(1).alpha(1) 
       .setInterpolator(new LinearOutSlowInInterpolator()); 
    } 
} 
14

मैं एक ही समस्या लिया है बाहर रखी नहीं कर रहा है चेतन बनाने के लिए। मेरे fab xml में visibility="gone" था, मैंने fab.show() द्वारा कोड से फैब दिखाने की कोशिश की - और एनीमेशन पहली बार काम नहीं कर रहा था। मैंने xml को visibility="invisible" में बदल दिया है और समस्या हल हो गई है।

+1

यह काम करता है! धन्यवाद – cgr

+1

यह स्वीकार्य उत्तर होना चाहिए। एक और बात, भले ही आपके पास 'दृश्यता = "नहीं है,' आपको 'दृश्यता =" अदृश्य "सेट करना चाहिए। –

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