अब जब एंड्रॉइड डिज़ाइन सपोर्ट लाइब्रेरी बाहर हो गई है, तो क्या कोई जानता है कि इसके साथ फैब मेनू को इनबॉक्स ऐप पर फैब की तरह कैसे लागू किया जाए?
इस तरह दिखना चाहिए:
अब जब एंड्रॉइड डिज़ाइन सपोर्ट लाइब्रेरी बाहर हो गई है, तो क्या कोई जानता है कि इसके साथ फैब मेनू को इनबॉक्स ऐप पर फैब की तरह कैसे लागू किया जाए?
इस तरह दिखना चाहिए:
जवाबों:
वर्तमान में, डिज़ाइन लाइब्रेरी में कोई विजेट प्रदान नहीं किया गया है। इसे जल्दी और आसानी से करने का एकमात्र तरीका तीसरे पक्ष के पुस्तकालयों का उपयोग करना है।
आप स्पष्ट रूप से डिज़ाइन लाइब्रेरी का उपयोग करके भी ऐसा कर सकते हैं, लेकिन यह एक बहुत बड़ा काम होगा और इसके लिए बहुत समय की आवश्यकता होगी। मैंने कुछ उपयोगी पुस्तकालयों का उल्लेख किया है, जो आपको इसे प्राप्त करने में मदद कर सकते हैं।
म 4 एक का उपयोग कर रहा हूं।
किसी भी पुस्तकालय का उपयोग किए बिना या एनिमेशन के लिए विशाल 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();
}
}
स्क्रीनशॉट में एफएबी के साथ शीर्षक भी है, क्योंकि मैं इसे अपने नमूना ऐप में मौजूद इन्थिथब से लेता हूं
सबसे पहले अपने एक्टिविटी लेआउट 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();
}
}
यहाँ स्क्रीनशॉट हैं
सामग्री डिज़ाइन दिशा-निर्देशों से स्पीड डायल लागू करने वाला एक और पुस्तकालय :
जब मैंने कुछ simillar इनबॉक्स फ़्लोटिंग एक्शन बटन बनाने की कोशिश की, तो मैंने स्वयं के कस्टम घटक बनाने के बारे में सोचा।
यह तय ऊंचाई (विस्तारित मेनू को शामिल करने के लिए) के साथ साधारण फ्रेम लेआउट होगा जिसमें एफएबी बटन और 3 अधिक एफएबी के तहत रखा जाएगा। जब आप FAB पर क्लिक करते हैं तो आप FAB के नीचे से अनुवाद करने के लिए बस अन्य बटन को चेतन करते हैं।
कुछ पुस्तकालय हैं जो ऐसा करते हैं (उदाहरण के लिए https://github.com/futuresimple/android-floating-action-button ), लेकिन यह हमेशा अधिक मज़ेदार होता है यदि आप इसे स्वयं बनाते हैं :)
layout_anchor
और layout_anchorGravity
मेरे लिए काम नहीं कर रहे हैं
आप FloatingActionMenu लाइब्रेरी का उपयोग कर सकते हैं या चरण-दर-चरण ट्यूटोरियल के लिए यहां क्लिक कर सकते हैं । ट्यूटोरियल का आउटपुट:
मैं ऐसा करने के लिए इस लाइब्रेरी का उपयोग करता हूं: https://github.com/futuresimple/android-floating-action-button
उपयोग करने के लिए बहुत आसान;)
layout_anchor
और layout_anchorGravity
मेरे लिए काम नहीं कर रहे हैं
कांस्ट्रेसेटसेट एनीमेशन के साथ एक ही परिणाम के लिए एक और विकल्प:
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)
}