Android Design Support Libraryが公開されたので、Inbox Appのファブのように、拡張Fabメニューを実装する方法を誰かが知っていますか?
このようになります:
現在、デザインライブラリにウィジェットはありません。それを素早く簡単にする唯一の方法はサードパーティのライブラリを使うことです。
デザインライブラリを使用してこれを行うこともできますが、それは大変な作業になり、多くの時間がかかります。私はあなたがこれを達成するのを助けることができるいくつかの役に立つライブラリを述べました。
私は4番目のものを使っています。
これに答えるのは少し遅れますが、ライブラリを使用せずにアニメーションFABメニューを実装したり、アニメーション用の巨大なxmlコードを書いたりするためのより良いアプローチを得ました。これを実装するための簡単な方法が必要な人にとってこれが将来役立つことを願っています。
したがって、animate()、translationY()関数を使用するだけで非常に簡単になり、下のコードで行ったようにFABを上下にアニメートできます。 githubで完全なコードを確認します 。
最初にすべての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" />
今すぐあなたのJavaクラスでちょうどあなたのすべての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();
}
}
});
FABをアニメートするにはanimation()。translationY()を使用します。intを使用すると高解像度または低解像度のディスプレイの互換性が損なわれるため、このメソッドの属性をDPで使用することをお勧めします。以下に示すように:
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-> values-> dimens.xmlの中に上記のディメンションを定義します。
<dimen name="standard_55">55dp</dimen>
<dimen name="standard_105">105dp</dimen>
<dimen name="standard_155">155dp</dimen>
この解決策が、将来的に簡単な解決策を探している人々に役立つことを願っています。
編集済み
もしあなたがFABの上にラベルを追加したいならそれから単純に水平のLinearLayoutを取り、ラベルとしてtextviewでFABを置き、そしてこれをする何か問題を見つけるならばレイアウトをアニメートする、あなたはgithubで私のサンプルコードをチェックできる。そのサンプルコードの問題。 GithubでFABMenuのサンプルコードを確認してください
backpressでFABを閉じるには、次に示すようにonBackPress()をオーバーライドします。
@Override
public void onBackPressed() {
if(!isFABOpen){
this.super.onBackPressed();
}else{
closeFABMenu();
}
}
私は自分の サンプルアプリの現在のingithub からそれを取っているので、スクリーンショットもFABと同じタイトルを持っています
まず、アクティビティレイアウトの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;
}
これがActivityクラスです -
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();
}
}
これがスクリーンショットです
私はインボックスフローティングアクションボタンに似た何かを作成しようとしたとき、私は自分自身のカスタムコンポーネントを作成することを考えました。
それは、FABボタンを含み、さらに3つがFABの下に配置された、固定された高さ(拡張メニューを含む)の単純なフレームレイアウトです。 FABをクリックすると、他のボタンを動かしてFABの下から上に移動するだけです。
それをするいくつかのライブラリがあります(例えば https://github.com/futuresimple/Android-floating-action-button )、しかしそれは常にあなたが自分でそれを作成した場合、もっと楽しく:)
あなたはFloatingActionMenuライブラリを使うことができます、または ここをクリック ステップバイステップのチュートリアルのために。チュートリアルの出力:
私はこれを行うためにこのライブラリを使用します。 https://github.com/futuresimple/Android-floating-action-button
使い方はとても簡単です。