এখন যে অ্যান্ড্রয়েড ডিজাইন সাপোর্ট লাইব্রেরিটি বাইরে চলে গেছে, কেউ কি ইনবক্স অ্যাপে থাকা ফ্যাবের মতো এটির সাথে কীভাবে প্রসারিত ফ্যাব মেনুটি প্রয়োগ করতে পারে তা জানেন?
এর মতো দেখতে হবে:
এখন যে অ্যান্ড্রয়েড ডিজাইন সাপোর্ট লাইব্রেরিটি বাইরে চলে গেছে, কেউ কি ইনবক্স অ্যাপে থাকা ফ্যাবের মতো এটির সাথে কীভাবে প্রসারিত ফ্যাব মেনুটি প্রয়োগ করতে পারে তা জানেন?
এর মতো দেখতে হবে:
উত্তর:
বর্তমানে, ডিজাইন লাইব্রেরিতে কোনও উইজেট সরবরাহ করা হয়নি। এটি দ্রুত এবং সহজেই করার একমাত্র উপায় হ'ল তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করে।
আপনি অবশ্যই ডিজাইন লাইব্রেরিটি ব্যবহার করে এটি করতে পারেন তবে এটি একটি বিশাল কাজ হবে এবং এতে অনেক সময় প্রয়োজন। আমি কয়েকটি দরকারী গ্রন্থাগার উল্লেখ করেছি, এটি আপনাকে এটি অর্জনে সহায়তা করতে পারে।
আমি চতুর্থটি ব্যবহার করছি।
কোনও লাইব্রেরি ব্যবহার না করে অ্যানিমেটিং এফএবি মেনু বাস্তবায়নের জন্য বা অ্যানিমেশনগুলির জন্য বিশাল এক্সএমএল কোডটি লেখার জন্য আরও ভাল পন্থা পেয়েছি। আশা করি এটি ভবিষ্যতে এমন কারও জন্য সহায়তা করবে যার এটিকে বাস্তবায়নের জন্য সহজ পদ্ধতির প্রয়োজন।
কেবল animate().translationY()
ফাংশন ব্যবহার করে, আপনি আমার নীচের কোডটিতে যে কোনও দৃশ্য আপ বা ডাউন সঞ্চারিত করতে পারেন, গিথুবটিতে সম্পূর্ণ কোডটি চেক করুন । আপনি যদি কোটলিনে একই কোডটি সন্ধান করছেন, আপনি কোটলিন কোড রেপো অ্যানিমেটিং এফএবি মেনু চেকআউট করতে পারেন ।
প্রথমে আপনার সমস্ত এফএবি একই স্থানে সংজ্ঞায়িত করুন যাতে তারা একে অপরকে ওভারল্যাপ করে, শীর্ষে एफএবি মনে রাখবেন যে আপনি ক্লিক করতে এবং অন্যকে প্রদর্শন করতে চান। উদাহরণ:
<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" />
এখন আপনার জাভা ক্লাসে আপনার সমস্ত এফএবি সংজ্ঞায়িত করুন এবং নীচের মত প্রদর্শিত ক্লিক করুন:
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()
আপনার FAB অ্যানিমেট করতে, আমি আপনাকে শুধুমাত্র একটি int- এ ব্যবহার উচ্চ রেজল্যুশন বা কম রেজোলিউশনে প্রদর্শন সামঞ্জস্য প্রভাবিত হবে যেহেতু ডিপি এই পদ্ধতির বৈশিষ্ট্য ব্যবহার করতে পছন্দ করেন। নিচে দেখানো হয়েছে:
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);
}
নীচে প্রদর্শিত হিসাবে পুনরায়-> মান-> dimens.xML এর ভিতরে উল্লিখিত মাত্রাটি সংজ্ঞায়িত করুন:
<dimen name="standard_55">55dp</dimen>
<dimen name="standard_105">105dp</dimen>
<dimen name="standard_155">155dp</dimen>
এগুলি সমস্তই আশা করে যে এই সমাধান ভবিষ্যতে লোকদের সহায়তা করবে, যারা সহজ সমাধানের সন্ধান করছেন।
সম্পাদিত
আপনি যদি এফএবির উপর লেবেল যুক্ত করতে চান তবে কেবল একটি অনুভূমিক লিনিয়ারলআউটটি নিন এবং লেবেল হিসাবে পাঠ্যদর্শন দিয়ে এফএবি রাখুন এবং লেআউটগুলি অ্যানিমেট করে যদি কোনও সমস্যা দেখা দেয় তবে আপনি গিথুবে আমার নমুনা কোডটি পরীক্ষা করতে পারেন, আমি সমস্ত পশ্চাদপটে সামঞ্জস্যতা পরিচালনা করেছি যে নমুনা কোড সমস্যা। গিথুবে FABMenu এর জন্য আমার নমুনা কোডটি পরীক্ষা করুন
ব্যাকপ্রেসে এফএবি বন্ধ করতে, নীচে প্রদর্শিত হিসাবে ব্যাকপ্রেস () টি ওভাররাইড করুন:
@Override
public void onBackPressed() {
if(!isFABOpen){
this.super.onBackPressed();
}else{
closeFABMenu();
}
}
স্ক্রিনশটটির শিরোনামটিও এফএবির সাথে রয়েছে, কারণ আমি এটি আমার নমুনা অ্যাপ্লিকেশনটি ইঙ্গিথব থেকে নিয়েছি
প্রথমে আপনার ক্রিয়াকলাপের লেআউট এক্সএমএল ফাইলটিতে মেনু লেআউটগুলি তৈরি করুন। উদাহরণস্বরূপ অনুভূমিক প্রবণতা সহ রৈখিক বিন্যাস এবং লেবেলের জন্য একটি টেক্সটভিউ অন্তর্ভুক্ত তারপর টেক্সটভিউয়ের পাশে একটি ফ্লোটিং অ্যাকশন বোতাম।
আপনার প্রয়োজন এবং সংখ্যা অনুযায়ী মেনু লেআউট তৈরি করুন।
একটি বেস ফ্লোটিং অ্যাকশন বোতাম তৈরি করুন এবং তার ক্লিক ক্লিক করে মেনু বিন্যাসের দৃশ্যমানতা পরিবর্তন করুন।
অনুগ্রহ করে নীচের কোডটি পরীক্ষা করুন এবং আরও তথ্যের জন্য গিথুব থেকে আমার প্রকল্পটি চেকআউট করুন
<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>
এগুলি অ্যানিমেশনগুলি-
এফএবি মেনুর খোলার অ্যানিমেশন:
<?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>
এফএবি মেনুর ক্লোজিং অ্যানিমেশন:
<?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>
তারপরে আমার ক্রিয়াকলাপে আমি কেবল এএফএবি মেনুটি দেখানোর জন্য এবং লুকানোর জন্য উপরের অ্যানিমেশনগুলি ব্যবহার করেছি:
ফ্যাব মেনু প্রদর্শন করুন:
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();
}
}
এখানে স্ক্রিনশট দেওয়া আছে
মেটেরিয়াল ডিজাইনের নির্দেশিকা থেকে স্পিড ডায়াল প্রয়োগকারী আরও একটি গ্রন্থাগার :
আমি যখন ইনবক্সে ভাসমান অ্যাকশন বোতামটিতে কিছু সিমিলার তৈরি করার চেষ্টা করেছি তখন আমি নিজের কাস্টম উপাদান তৈরি করার কথা ভেবেছিলাম।
এটি স্থির উচ্চতা (প্রসারিত মেনু ধারণ করতে) সহ সহজ ফ্রেম বিন্যাস হবে এবং এফএবির অধীনে আরও 3 টি স্থাপন করা হবে। আপনি যখন এফএবি-তে ক্লিক করেন আপনি কেবল এফএবির অধীন থেকে অনুবাদ করতে অন্য বোতামগুলি সঞ্চারিত করতে পারেন।
কিছু লাইব্রেরি রয়েছে যা এটি করে (উদাহরণস্বরূপ https://github.com/futuresimple/android-floating-action-bton ) তবে এটি নিজের দ্বারা তৈরি করা থাকলে এটি সবসময়ই বেশি মজাদার :)
layout_anchor
এবং layout_anchorGravity
আমার জন্য কাজ করছে না
আপনি ফ্লোটিংএ্যাকশনমেনু লাইব্রেরি ব্যবহার করতে পারেন বা ধাপে ধাপে টিউটোরিয়াল পেতে এখানে ক্লিক করতে পারেন । টিউটোরিয়াল আউটপুট:
আমি এই লাইব্রেরিটি এটি করতে ব্যবহার করি: https://github.com/futuresimple/android-floating-action-button
ব্যবহারের জন্য খুব সহজ;)
layout_anchor
এবং layout_anchorGravity
আমার জন্য কাজ করছে না
কনস্ট্রেন্টসেট অ্যানিমেশন সহ একই ফলাফলের জন্য অন্য একটি বিকল্প:
1) সমস্ত অ্যানিমেটেড ভিউগুলিকে একটি কনস্ট্রেন্টলয়েটে রাখুন
২) এটিকে কোড থেকে এনিমেট করুন (যদি আপনি এর উপরে আরও কিছু প্রভাব চান তবে এটি কেবল উদাহরণ)
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)
}