5つの異なるフラグメントを持つTabLayoutを使用しています。これらのフラグメントの3つでAndroid.support.design.widget.FloatingActionButton
が表示されます。現在、タブが変更されたときにFABの可視性を設定するだけですが、FABが出入りするアニメーションを作成したいと考えています。 Androidでこれを実現するにはどうすればよいですか?
FloatingActionButton
を拡張したくなかったので、次のようにしました。
FloatingActionButton createButton;
// ...
Animation makeInAnimation = AnimationUtils.makeInAnimation(getBaseContext(), false);
makeInAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationEnd(Animation animation) { }
@Override
public void onAnimationRepeat(Animation animation) { }
@Override
public void onAnimationStart(Animation animation) {
createButton.setVisibility(View.VISIBLE);
}
});
Animation makeOutAnimation = AnimationUtils.makeOutAnimation(getBaseContext(), true);
makeOutAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationEnd(Animation animation) {
createButton.setVisibility(View.INVISIBLE);
}
@Override
public void onAnimationRepeat(Animation animation) { }
@Override
public void onAnimationStart(Animation animation) { }
});
// ...
if (createButton.isShown()) {
createButton.startAnimation(makeOutAnimation);
}
// ...
if (!createButton.isShown()) {
createButton.startAnimation(makeInAnimation);
}
縮小/ポップの非表示/表示アニメーションは、新しいバージョンのサポートライブラリによって自動的に処理されます。
fab.show();またはfab.hide();
設計サポートライブラリリビジョン22.2.1(2015年7月)では、FloatingActionButton
クラスにhide()
およびshow()
メソッドが追加されたため、今後これらを使用できます。
http://developer.Android.com/tools/support-library/index.html
このようなものが欲しいの?ただし、onScrollListener
でアニメーション化する代わりに、onCreateView
またはonCreate
メソッドでアニメーション化できます。これに従います-> フローティングアクションボタンの実装–パート2
基本的にコードはこれだけを合計します
非表示にするアニメーション
FloatingActionButton floatingActionButton = (FloatingActionButton) getActivity().findViewById(R.id.fab);
floatingActionButton.animate().translationY(floatingActionButton.getHeight() + 16).setInterpolator(new AccelerateInterpolator(2)).start();
そして
アニメーションを表示に戻す
FloatingActionButton floatingActionButton = (FloatingActionButton) getActivity().findViewById(R.id.fab);
floatingActionButton.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2)).start();
ただし、非表示にするためだけにアニメーション化したくないので、「Animate to Hide」は次のようになります。
FloatingActionButton floatingActionButton = (FloatingActionButton) getActivity().findViewById(R.id.fab);
floatingActionButton.setTranslationY(floatingActionButton.getHeight() + 16);
'Animate to Hide'でそれをonCreateView
またはonCreate
メソッドに配置すると、このフラグメントを作成するときにFABが非表示になり、ハンドラーと実行可能オブジェクトを追加して 'Animateをトリガーします。 1〜2秒後に「表示」に戻ってアニメーションを表示します
または、短いアニメーションの時間を使用できます
int mShortAnimationDuration = getResources().getInteger(
Android.R.integer.config_shortAnimTime);
私はonScrollでこれを試しましたが、onCreateView
またはonCreate
は試していませんが、うまくいくと思います
-[〜#〜]編集[〜#〜]-
このコードを試してください;)
public class DummyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
int mShortAnimationDuration = getResources().getInteger(
Android.R.integer.config_shortAnimTime);
FloatingActionButton floatingActionButton = (FloatingActionButton) getActivity().findViewById(R.id.fab);
floatingActionButton.setTranslationY(floatingActionButton.getHeight() + 16);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
FloatingActionButton floatingActionButton = (FloatingActionButton) getActivity().findViewById(R.id.fab);
floatingActionButton.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2)).start();
}, mShortAnimationDuration);
}
}
}
最も簡単な方法は、FloatingActionButtonクラスを拡張して、setVisibilityをオーバーライドすることです。このような:
public void setVisibility(final int visibility) {
if (getVisibility() != View.VISIBLE && visibility == View.VISIBLE && inAnim != null) {
animator = // create your animator here
super.setVisibility(visibility);
} else if (getVisibility() == View.VISIBLE && visibility != View.VISIBLE) {
AnimatorListenerAdapter listener = new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animator) {
Button.super.setVisibility(visibility);
}
});
animator = // create your animator here
animator.addListener(listener);
}
}
上記のコードは my library のButtonクラスから取得されます。ソースにはサンプル実装があります。