Android डिज़ाइन समर्थन लाइब्रेरी विस्तार योग्य फ़्लोटिंग एक्शन बटन (FAB) मेनू


172

अब जब एंड्रॉइड डिज़ाइन सपोर्ट लाइब्रेरी बाहर हो गई है, तो क्या कोई जानता है कि इसके साथ फैब मेनू को इनबॉक्स ऐप पर फैब की तरह कैसे लागू किया जाए?

इस तरह दिखना चाहिए:

यहां छवि विवरण दर्ज करें



मैं पहले से ही सभी दस्तावेज़ की जाँच की है, लेकिन जाहिरा तौर पर वहाँ फैब मेनू का कोई भी संकेत नहीं हैं :(
EkKoZ

8
आप इस फ़्लोटिंगएशनबटन लाइब्रेरी पर नज़र डाल सकते हैं ।
मार्कस रूबी

3
@MarkusRubey धन्यवाद, वास्तव में इस समय का उपयोग करके एक IM है, बस मैं इसे मूल एक के साथ बनाना चाहता था, लेकिन जाहिर है यह अभी तक संभव नहीं है।
EkKZZ

बहुत सारे ओपन सोर्स लाइब्रेरी हैं, जिनसे काम चल सकता है। इसे एक बार देखें: github.com/futuresimple/android-floating-action-button
capt.swag 7:15

जवाबों:


143

वर्तमान में, डिज़ाइन लाइब्रेरी में कोई विजेट प्रदान नहीं किया गया है। इसे जल्दी और आसानी से करने का एकमात्र तरीका तीसरे पक्ष के पुस्तकालयों का उपयोग करना है।

आप स्पष्ट रूप से डिज़ाइन लाइब्रेरी का उपयोग करके भी ऐसा कर सकते हैं, लेकिन यह एक बहुत बड़ा काम होगा और इसके लिए बहुत समय की आवश्यकता होगी। मैंने कुछ उपयोगी पुस्तकालयों का उल्लेख किया है, जो आपको इसे प्राप्त करने में मदद कर सकते हैं।

  1. रैपिड फ्लोटिंग बटन (wangjiegulu)
  2. फ्लोटिंग एक्शन बटन (कुलों)
  3. फ्लोटिंग एक्शन बटन (makovkastar)
  4. Android फ़्लोटिंग एक्शन बटन (फ्यूचरसिमल)

म 4 एक का उपयोग कर रहा हूं।


31
ठीक है, यह विचार मूल डिज़ाइन लाइब्रेरी के साथ करना था, मुझे पता है कि बहुत सारी लाइब्रेरी हैं जो पहले से ही इस सुविधा को करती हैं। आपके जवाब के लिए धन्यवाद।
EkKZZ

क्या आपने चौथे के साथ कोई समस्या पाई? मेरा लॉलीपॉप + उपकरणों पर दिखाई नहीं दे रहा है। इसके अलावा पृष्ठभूमि ओवरले रंग और पाठ काम नहीं कर रहा है
अजित मेमन

@ अजितमेना नप। मेरा ऐप 100K से अधिक उपयोगकर्ताओं के लिए उत्पादन में है और मेरे पास कभी भी कोई समस्या नहीं थी जैसा कि आपने उल्लेख किया है।
अरित्र रॉय

क्या आप मुझे अपने ऐप का लिंक प्रदान कर सकते हैं? मुझे कुछ ऐसा ही चाहिए जो ऊपर दिखाया गया है, साथ ही जब बटन पर क्लिक किया जाता है तो स्क्रीन पर एक पारदर्शी पृष्ठभूमि दिखाई देती है।
अजित मेमना

2
एक नोट के रूप में, कुलों और माकोवास्तार का समर्थन नहीं किया जा रहा है। मुझे संदेह है कि यह FAB डिज़ाइन लाइब्रेरी में सुधार के कारण है
ईमानदार ऑब्जेक्ट्स

162

किसी भी पुस्तकालय का उपयोग किए बिना या एनिमेशन के लिए विशाल xml कोड लिखने के बिना एनिमेटिंग FAB मेनू को लागू करने के लिए एक बेहतर दृष्टिकोण मिला। उम्मीद है कि यह भविष्य में किसी ऐसे व्यक्ति के लिए मदद करेगा जिसे इसे लागू करने के लिए एक सरल तरीके की आवश्यकता है।

केवल animate().translationY()फ़ंक्शन का उपयोग करके , आप किसी भी दृश्य को ऊपर या नीचे कर सकते हैं, जैसा कि मैंने अपने नीचे दिए गए कोड में किया था, जीथब में पूरा कोड देखें । यदि आप कोटलिन में समान कोड की तलाश कर रहे हैं, तो आप कोटलिन कोड रेपो एनिमेटेड एफएबी मेनू चेकआउट कर सकते हैं ।

पहले अपने सभी FAB को उसी स्थान पर परिभाषित करें, ताकि वे एक-दूसरे को ओवरलैप करें, याद रखें कि FAB शीर्ष पर होना चाहिए कि आप क्लिक करना चाहते हैं और दूसरे को दिखाना चाहते हैं। उदाहरण के लिए:

    <android.support.design.widget.FloatingActionButton
    android:id="@+id/fab3"
    android:layout_width="@dimen/standard_45"
    android:layout_height="@dimen/standard_45"
    android:layout_gravity="bottom|end"
    android:layout_margin="@dimen/standard_21"
    app:srcCompat="@android:drawable/ic_btn_speak_now" />

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab2"
    android:layout_width="@dimen/standard_45"
    android:layout_height="@dimen/standard_45"
    android:layout_gravity="bottom|end"
    android:layout_margin="@dimen/standard_21"
    app:srcCompat="@android:drawable/ic_menu_camera" />

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab1"
    android:layout_width="@dimen/standard_45"
    android:layout_height="@dimen/standard_45"
    android:layout_gravity="bottom|end"
    android:layout_margin="@dimen/standard_21"
    app:srcCompat="@android:drawable/ic_dialog_map" />

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|end"
    android:layout_margin="@dimen/fab_margin"
    app:srcCompat="@android:drawable/ic_dialog_email" />

अब आपके जावा क्लास में अपने सभी FAB को परिभाषित करें और नीचे दिखाए गए क्लिक की तरह प्रदर्शन करें:

 FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab1 = (FloatingActionButton) findViewById(R.id.fab1);
    fab2 = (FloatingActionButton) findViewById(R.id.fab2);
    fab3 = (FloatingActionButton) findViewById(R.id.fab3);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(!isFABOpen){
                showFABMenu();
            }else{
                closeFABMenu();
            }
        }
    });

animation().translationY()अपने एफएबी को चेतन करने के लिए उपयोग करें , मैं आपको डीपी में इस पद्धति की विशेषता का उपयोग करना पसंद करता हूं क्योंकि केवल इंट का उपयोग करने से उच्च संकल्प या कम रिज़ॉल्यूशन के साथ प्रदर्शन संगतता प्रभावित होगी। जैसा की नीचे दिखाया गया:

 private void showFABMenu(){
    isFABOpen=true;
    fab1.animate().translationY(-getResources().getDimension(R.dimen.standard_55));
    fab2.animate().translationY(-getResources().getDimension(R.dimen.standard_105));
    fab3.animate().translationY(-getResources().getDimension(R.dimen.standard_155));
}

private void closeFABMenu(){
    isFABOpen=false;
    fab1.animate().translationY(0);
    fab2.animate().translationY(0);
    fab3.animate().translationY(0);
}

अब Res के अंदर उपर्युक्त आयाम को परिभाषित करें-> मान-> dimens.xml जैसा कि नीचे दिखाया गया है:

    <dimen name="standard_55">55dp</dimen>
<dimen name="standard_105">105dp</dimen>
<dimen name="standard_155">155dp</dimen>

यह पूरी उम्मीद है कि यह समाधान भविष्य में उन लोगों की मदद करेगा, जो सरल समाधान खोज रहे हैं।

संपादित

यदि आप FAB पर लेबल जोड़ना चाहते हैं, तो बस एक क्षैतिज LinearLayout लें और FAB को टेक्स्टव्यू के रूप में लेबल के साथ डालें, और लेआउट्स को चेतन करें यदि ऐसा करने में कोई समस्या मिलती है, तो आप github में अपना नमूना कोड देख सकते हैं, मैंने सभी पिछड़े संगतता को संभाल लिया है उस नमूना कोड में समस्याएँ। Github में FABMenu के लिए मेरा नमूना कोड जांचें

बैकपैक पर FAB को बंद करने के लिए, नीचे दिखाए अनुसार onBackPress () को ओवरराइड करें:

    @Override
public void onBackPressed() {
    if(!isFABOpen){
        this.super.onBackPressed();
    }else{
        closeFABMenu();
    }
}

स्क्रीनशॉट में एफएबी के साथ शीर्षक भी है, क्योंकि मैं इसे अपने नमूना ऐप में मौजूद इन्थिथब से लेता हूं

यहां छवि विवरण दर्ज करें


8
यहां तक ​​कि मेनू में लेबल जोड़ना भी सरल है। आपको लेबल के रूप में कुछ टेक्स्टव्यू के साथ लिनियरवेलआउट के अंदर एफएबी जोड़ना होगा, और उसके बाद पूरे रैखिक लेआउट को एनिमेट करें और ओपन और क्लोज फंक्शन के अंदर रैखिक लेआउट को छिपाना न
भूलें

1
लेकिन प्रशांत ने एनीमेशन के लिए अलग से xml बनाया था, लेकिन मेरे समाधान के लिए एनीमेशन के लिए किसी भी अतिरिक्त xml की आवश्यकता नहीं है, इसलिए मेरा उत्तर बेहतर है, क्योंकि यह दृश्य को एनिमेट करने के लिए कोड की अतिरिक्त पंक्ति की आवश्यकता नहीं है।
HAXM

2
यही सबसे अच्छा जवाब है। आप डिज़ाइन लाइब्रेरी से वास्तविक FAB का उपयोग कर सकते हैं और यह कि कंपाइल नहीं किया गया है।
स्टीफन मैथिस

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

1
@droidHeaven एक तामचीनी लें और अपने सभी FAB को उसके अंदर
रखें

31
  • सबसे पहले अपने एक्टिविटी लेआउट xml फ़ाइल में मेनू लेआउट बनाएँ। उदाहरण के लिए, क्षैतिज अभिविन्यास के साथ एक रेखीय लेआउट और लेबल के लिए एक TextView शामिल है तो TextView के बगल में एक फ़्लोटिंग एक्शन बटन।

  • अपनी जरूरत और संख्या के अनुसार मेनू लेआउट बनाएं।

  • एक बेस फ़्लोटिंग एक्शन बटन बनाएं और इसके क्लिक पर मेनू लेआउट की दृश्यता को बदल दें।

कृपया संदर्भ के लिए नीचे दिए गए कोड की जांच करें और अधिक जानकारी के लिए मेरे प्रोजेक्ट github से चेकआउट करें

गितुब से चेकआउट परियोजना

<android.support.constraint.ConstraintLayout
            android:id="@+id/activity_main"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context="com.app.fabmenu.MainActivity">

            <android.support.design.widget.FloatingActionButton
                android:id="@+id/baseFloatingActionButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="16dp"
                android:layout_marginEnd="16dp"
                android:layout_marginRight="16dp"
                android:clickable="true"
                android:onClick="@{FabHandler::onBaseFabClick}"
                android:tint="@android:color/white"
                app:fabSize="normal"
                app:layout_constraintBottom_toBottomOf="@+id/activity_main"
                app:layout_constraintRight_toRightOf="@+id/activity_main"
                app:srcCompat="@drawable/ic_add_black_24dp" />

            <LinearLayout
                android:id="@+id/shareLayout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="12dp"
                android:layout_marginEnd="24dp"
                android:layout_marginRight="24dp"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                android:visibility="invisible"
                app:layout_constraintBottom_toTopOf="@+id/createLayout"
                app:layout_constraintLeft_toLeftOf="@+id/createLayout"
                app:layout_constraintRight_toRightOf="@+id/activity_main">

                <TextView
                    android:id="@+id/shareLabelTextView"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginEnd="8dp"
                    android:layout_marginRight="8dp"
                    android:background="@drawable/shape_fab_label"
                    android:elevation="2dp"
                    android:fontFamily="sans-serif"
                    android:padding="5dip"
                    android:text="Share"
                    android:textColor="@android:color/white"
                    android:typeface="normal" />


                <android.support.design.widget.FloatingActionButton
                    android:id="@+id/shareFab"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:clickable="true"
                    android:onClick="@{FabHandler::onShareFabClick}"
                    android:tint="@android:color/white"
                    app:fabSize="mini"
                    app:srcCompat="@drawable/ic_share_black_24dp" />

            </LinearLayout>

            <LinearLayout
                android:id="@+id/createLayout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="24dp"
                android:layout_marginEnd="24dp"
                android:layout_marginRight="24dp"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                android:visibility="invisible"
                app:layout_constraintBottom_toTopOf="@+id/baseFloatingActionButton"
                app:layout_constraintRight_toRightOf="@+id/activity_main">

                <TextView
                    android:id="@+id/createLabelTextView"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginEnd="8dp"
                    android:layout_marginRight="8dp"
                    android:background="@drawable/shape_fab_label"
                    android:elevation="2dp"
                    android:fontFamily="sans-serif"
                    android:padding="5dip"
                    android:text="Create"
                    android:textColor="@android:color/white"
                    android:typeface="normal" />

                <android.support.design.widget.FloatingActionButton
                    android:id="@+id/createFab"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:clickable="true"
                    android:onClick="@{FabHandler::onCreateFabClick}"
                    android:tint="@android:color/white"
                    app:fabSize="mini"
                    app:srcCompat="@drawable/ic_create_black_24dp" />

            </LinearLayout>

        </android.support.constraint.ConstraintLayout>

ये हैं एनिमेशन-

FAB मेनू का प्रारंभिक एनीमेशन:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true">
<scale
    android:duration="300"
    android:fromXScale="0"
    android:fromYScale="0"
    android:interpolator="@android:anim/linear_interpolator"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toXScale="1"
    android:toYScale="1" />
<alpha
    android:duration="300"
    android:fromAlpha="0.0"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:toAlpha="1.0" />

</set>

FAB मेनू का समापन एनीमेशन:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true">
<scale
    android:duration="300"
    android:fromXScale="1"
    android:fromYScale="1"
    android:interpolator="@android:anim/linear_interpolator"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toXScale="0.0"
    android:toYScale="0.0" />
<alpha
    android:duration="300"
    android:fromAlpha="1.0"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:toAlpha="0.0" />
</set>

फिर मेरी गतिविधि में मैंने FAB मेनू को दिखाने और छिपाने के लिए ऊपर दिए गए एनिमेशन का उपयोग किया है:

फैब मेनू दिखाएँ:

  private void expandFabMenu() {

    ViewCompat.animate(binding.baseFloatingActionButton).rotation(45.0F).withLayer().setDuration(300).setInterpolator(new OvershootInterpolator(10.0F)).start();
    binding.createLayout.startAnimation(fabOpenAnimation);
    binding.shareLayout.startAnimation(fabOpenAnimation);
    binding.createFab.setClickable(true);
    binding.shareFab.setClickable(true);
    isFabMenuOpen = true;

}

फैब मेनू बंद करें:

private void collapseFabMenu() {

    ViewCompat.animate(binding.baseFloatingActionButton).rotation(0.0F).withLayer().setDuration(300).setInterpolator(new OvershootInterpolator(10.0F)).start();
    binding.createLayout.startAnimation(fabCloseAnimation);
    binding.shareLayout.startAnimation(fabCloseAnimation);
    binding.createFab.setClickable(false);
    binding.shareFab.setClickable(false);
    isFabMenuOpen = false;

}

यहाँ गतिविधि वर्ग है -

package com.app.fabmenu;

import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.v4.view.ViewCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.OvershootInterpolator;

import com.app.fabmenu.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

private ActivityMainBinding binding;
private Animation fabOpenAnimation;
private Animation fabCloseAnimation;
private boolean isFabMenuOpen = false;

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

    binding = DataBindingUtil.setContentView(this,    R.layout.activity_main);
    binding.setFabHandler(new FabHandler());

    getAnimations();


}

private void getAnimations() {

    fabOpenAnimation = AnimationUtils.loadAnimation(this, R.anim.fab_open);

    fabCloseAnimation = AnimationUtils.loadAnimation(this, R.anim.fab_close);

}

private void expandFabMenu() {

    ViewCompat.animate(binding.baseFloatingActionButton).rotation(45.0F).withLayer().setDuration(300).setInterpolator(new OvershootInterpolator(10.0F)).start();
    binding.createLayout.startAnimation(fabOpenAnimation);
    binding.shareLayout.startAnimation(fabOpenAnimation);
    binding.createFab.setClickable(true);
    binding.shareFab.setClickable(true);
    isFabMenuOpen = true;


}

private void collapseFabMenu() {

    ViewCompat.animate(binding.baseFloatingActionButton).rotation(0.0F).withLayer().setDuration(300).setInterpolator(new OvershootInterpolator(10.0F)).start();
    binding.createLayout.startAnimation(fabCloseAnimation);
    binding.shareLayout.startAnimation(fabCloseAnimation);
    binding.createFab.setClickable(false);
    binding.shareFab.setClickable(false);
    isFabMenuOpen = false;

}


public class FabHandler {

    public void onBaseFabClick(View view) {

        if (isFabMenuOpen)
            collapseFabMenu();
        else
            expandFabMenu();


    }

    public void onCreateFabClick(View view) {

        Snackbar.make(binding.coordinatorLayout, "Create FAB tapped", Snackbar.LENGTH_SHORT).show();

    }

    public void onShareFabClick(View view) {

        Snackbar.make(binding.coordinatorLayout, "Share FAB tapped", Snackbar.LENGTH_SHORT).show();

    }


}

@Override
public void onBackPressed() {

    if (isFabMenuOpen)
        collapseFabMenu();
    else
        super.onBackPressed();
}
}

यहाँ स्क्रीनशॉट हैं

Android के नए Cursive Font परिवार में लेबल टेक्स्टव्यू के साथ फ्लोटिंग एक्शन मेनू

Android के नए रोबोटो फ़ॉन्ट परिवार में लेबल टेक्स्टव्यू के साथ फ्लोटिंग एक्शन मेनू



7

जब मैंने कुछ simillar इनबॉक्स फ़्लोटिंग एक्शन बटन बनाने की कोशिश की, तो मैंने स्वयं के कस्टम घटक बनाने के बारे में सोचा।

यह तय ऊंचाई (विस्तारित मेनू को शामिल करने के लिए) के साथ साधारण फ्रेम लेआउट होगा जिसमें एफएबी बटन और 3 अधिक एफएबी के तहत रखा जाएगा। जब आप FAB पर क्लिक करते हैं तो आप FAB के नीचे से अनुवाद करने के लिए बस अन्य बटन को चेतन करते हैं।

कुछ पुस्तकालय हैं जो ऐसा करते हैं (उदाहरण के लिए https://github.com/futuresimple/android-floating-action-button ), लेकिन यह हमेशा अधिक मज़ेदार होता है यदि आप इसे स्वयं बनाते हैं :)


बहुत बढ़िया स्पष्टीकरण! मैं उस लाइब्रेरी को खोज रहा हूं, लेकिन मुझे दो दृश्यों के बीच FAB को संरेखित करने के लिए इसका उपयोग करने में परेशानी हो रही है। इस सवाल में क्या पूछा गया है stackoverflow.com/questions/24459352/… । यह कैसे करना है पर कोई विचार? layout_anchorऔर layout_anchorGravityमेरे लिए काम नहीं कर रहे हैं
acrespo

Futuresimple की लाइब्रेरी अपने फ़्लोटिंगएशन
मेनु

7

आप FloatingActionMenu लाइब्रेरी का उपयोग कर सकते हैं या चरण-दर-चरण ट्यूटोरियल के लिए यहां क्लिक कर सकते हैं । ट्यूटोरियल का आउटपुट:

यहां छवि विवरण दर्ज करें


सरल और ठीक काम करता है। मैं यह सुझाव दूंगा कि यदि आप भविष्य में लिंक नीचे जाते हैं तो आप ट्यूटोरियल को लिंक करने के बजाय यहां विवरण जोड़ते हैं। एक और बात, मैंने अभी सीखा है कि पुस्तकालय अब दुख की बात नहीं है।
अहमद सलाह

3

मैं ऐसा करने के लिए इस लाइब्रेरी का उपयोग करता हूं: https://github.com/futuresimple/android-floating-action-button

उपयोग करने के लिए बहुत आसान;)

यहां छवि विवरण दर्ज करें


कुछ टिप्पणियां जो मैंने अन्य समान उत्तरों के लिए कीं। मुझे दो दृश्यों के बीच FAB को संरेखित करने के लिए इसका उपयोग करने में परेशानी हो रही है। इस सवाल में क्या पूछा गया है stackoverflow.com/questions/24459352/… । यह कैसे करना है पर कोई विचार? layout_anchorऔर layout_anchorGravityमेरे लिए काम नहीं कर रहे हैं
acrespo

0

कांस्ट्रेसेटसेट एनीमेशन के साथ एक ही परिणाम के लिए एक और विकल्प:

फेब एनीमेशन उदाहरण

1) सभी एनिमेटेड विचारों को एक कांस्ट्रेन्डलैट में रखें

2) इसे इस तरह कोड से चेतन करें (यदि आप कुछ और प्रभाव चाहते हैं तो यह आपके ऊपर है..यह केवल उदाहरण है)

menuItem1 और menuItem2 मेनू में पहले और दूसरे FABs है, descriptionItem1 और descriptionItem2 मेनू की बाईं करने के लिए वर्णन है, parentConstraintLayout जड़ ConstraintLayout जो सभी एनिमेटेड बार देखा गया है, है isMenuOpened कुछ समारोह राज्य में खुला / बंद ध्वज को बदलने के लिए है

मैंने एक्सटेंशन फ़ाइल में एनीमेशन कोड डाला लेकिन यह आवश्यक नहीं है।

fun FloatingActionButton.expandMenu(
    menuItem1: View,
    menuItem2: View,
    descriptionItem1: TextView,
    descriptionItem2: TextView,
    parentConstraintLayout: ConstraintLayout,
    isMenuOpened: (Boolean)-> Unit
) {
    val constraintSet = ConstraintSet()
    constraintSet.clone(parentConstraintLayout)

    constraintSet.setVisibility(descriptionItem1.id, View.VISIBLE)
    constraintSet.clear(menuItem1.id, ConstraintSet.TOP)
    constraintSet.connect(menuItem1.id, ConstraintSet.BOTTOM, this.id, ConstraintSet.TOP, 0)
    constraintSet.connect(menuItem1.id, ConstraintSet.START, this.id, ConstraintSet.START, 0)
    constraintSet.connect(menuItem1.id, ConstraintSet.END, this.id, ConstraintSet.END, 0)

    constraintSet.setVisibility(descriptionItem2.id, View.VISIBLE)
    constraintSet.clear(menuItem2.id, ConstraintSet.TOP)
    constraintSet.connect(menuItem2.id, ConstraintSet.BOTTOM, menuItem1.id, ConstraintSet.TOP, 0)
    constraintSet.connect(menuItem2.id, ConstraintSet.START, this.id, ConstraintSet.START, 0)
    constraintSet.connect(menuItem2.id, ConstraintSet.END, this.id, ConstraintSet.END, 0)

    val transition = AutoTransition()
    transition.duration = 150
    transition.interpolator = AccelerateInterpolator()

    transition.addListener(object: Transition.TransitionListener {
        override fun onTransitionEnd(p0: Transition) {
            isMenuOpened(true)
        }
        override fun onTransitionResume(p0: Transition) {}
        override fun onTransitionPause(p0: Transition) {}
        override fun onTransitionCancel(p0: Transition) {}
        override fun onTransitionStart(p0: Transition) {}
    })

    TransitionManager.beginDelayedTransition(parentConstraintLayout, transition)
    constraintSet.applyTo(parentConstraintLayout)
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.