MaterialDesignのLoading中のProgressを作る
Motivation
Material Designのガイドラインのコレが気に入ったので、汎用的に使えるようにFragmentで書いてみた。
Progress & activity - Components - Google design guidelines
- Motivation
- Progress Barを実装する
- FadeIn/FadeOutを実装する
- Activityからの呼び出し時(Replace/Add)にsetTransitionする
- サンプルコード
Progress Barを実装する
Material DesignのProgress BarはSupportLibraryに実装されているものを持ってくればOK。
具体的にはappcompat-v7のstyle="@style/Widget.AppCompat.ProgressBar.Horizontal"
を利用する。
<ProgressBar android:id="@+id/progress_bar" android:layout_below="@+id/text" android:layout_centerHorizontal="true" android:layout_marginTop="16dp" style="@style/Widget.AppCompat.ProgressBar.Horizontal" android:layout_width="144dp" android:layout_height="wrap_content" android:indeterminate="true"/>
また、テキストについてはtextAppearanceに"@style/TextAppearance.AppCompat.XXXX"
を利用すると良い。
XXXXの部分は、ここを参考にして決める。
ここでは、Fragmentの形式で実装したので上記を持つFragmentを生成する。
テンプレと大差無い状態。
public class LoadingFragment extends Fragment { public LoadingFragment() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_loading, container, false); } @Override public void onDetach() { super.onDetach(); } }
FadeIn/FadeOutを実装する
Fragmentに実装したので、FragmentTransactionを利用して開始時と置き換え時にアニメーションを行う。
FragmentTransactionを利用したアニメーションを作る場合は、FragmentTransaction.setTransitionを使う。
setTransitionに設定したint値に対し、開始/終了時にFragment.onCreateAnimation()が呼び出されるようになる。
まず、Fragment.onCreateAnimation()の実装を行う。
@Override public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) { if(transit == FragmentTransaction.TRANSIT_FRAGMENT_OPEN){ if(enter){ return AnimationUtils.loadAnimation(getActivity(), android.R.anim.fade_in); }else{ return AnimationUtils.loadAnimation(getActivity(), android.R.anim.fade_out); } } return super.onCreateAnimation(transit, enter, nextAnim); }
メソッドの引数のtransitにsetTransitionに指定したint値が指定子として入力される。
また、引数のenterに開始時か終了時かを判断するためのboolean値が入力される。
これらを用いて、Animationクラスを返せば、そのときに指定したアニメーションが実行されるようになる。
Activityからの呼び出し時(Replace/Add)にsetTransitionする
最後にreplace/addする際に、setTransitionすれば期待通りに動作する。
呼び出し時のコードはこちら
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBinding = DataBindingUtil.setContentView(MainActivity.this, R.layout.activity_main); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .replace(R.id.fragment_container, new LoadingFragment()) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) .commit(); } getSomething(); }
setTransitionにFragmentTransaction.TRANSIT_FRAGMENT_OPENを指定している。
それは前述の通り、Fragment.onCreateAnimationでの判断条件に利用している。
サンプルコード
だいたい期待通りに動いている。