アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

AndroidでカードUIの実装に便利なプラグイン

こんにちは、細井です。

Androidから少し離れている内に、GoogleMaterial DesignとかAndroid Studioを使え、とか言っていて取り残されています。。
この記事では、Material Designの概念のうち、カードUIをAndroidで実装する際に便利なプラグインを紹介します。

ListViewAnimations
https://github.com/nhaarman/ListViewAnimations
カードのスクロールにアニメーションを付けたり、カードのドラッグアンドドロップやスワイプでの削除を簡単に行えるようになります。
カードUIでは、スクロールで読み込む前のカードにはアニメーションを付けて、読み込んだ後のカードにはアニメーションを付けないことで、何処まで読み込んだか感覚的に分かるようにすることが推奨されているようです。
今回は、それも実現できるアニメーション付与の機能を試してみます。

StaggeredGridView
https://github.com/etsy/AndroidStaggeredGrid
カードをGridViewで複数列並べた時に、カードの高さが均一になってしまうのを解消してくれるGridViewです。

使ってみた
実際に使って、カードUIの一覧画面っぽいものを作ってみました。
アニメーションは、スクロール時に下からどんどん現れてくるような動きをします。



実装
どちらもGradleでモジュールをダウンロードできます。
build.gradleに以下のdependenciesを追加します。



dependencies {
    // ListViewAnimations
    compile 'com.nhaarman.listviewanimations:lib-core:3.1.0@aar'
    compile 'com.nhaarman.listviewanimations:lib-manipulation:3.1.0@aar'
    compile 'com.nhaarman.listviewanimations:lib-core-slh:3.1.0@aar'
    // Githubでは指定無しですが、無いと動かなかったです
    compile 'com.nineoldandroids:library:2.4.0'
    
    // StaggeredGridView
    compile 'com.etsy.android.grid:library:1.0.5'
    
    // Lollipopで追加されたCardViewも使ってみます
    // support-v7で用意されているので、下位バージョンでも使用できます
    compile "com.android.support:cardview-v7:+"
}


LayoutのxmlはMainActivityのものと、GirdViewに表示するカードのものを用意しました。

【activity_main.xml


<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="5dp">

    <com.etsy.android.grid.StaggeredGridView
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/grid_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:item_margin="5dp"
        app:column_count="2"/> <!-- GridViewの列数を指定 -->

</RelativeLayout>


【view_card.xml


<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    card_view:cardCornerRadius="3dp"> <!-- カードの角丸を指定 -->

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="10dp">

        <ImageView
            android:id="@+id/card_image"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:adjustViewBounds="true"
            android:src="@drawable/card1" />

        <TextView
            android:id="@+id/card_message"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/card_message_1"
            android:paddingTop="10dp"/>

    </LinearLayout>

</android.support.v7.widget.CardView>


次は、Activity側のソースになります。
基本的にはGridViewやAdapterのオブジェクトを置き換えるだけです。簡単。

【MainActivity.java


public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // GridViewの代わりに、StaggeredGridViewを使用
        StaggeredGridView gridView = (StaggeredGridView) findViewById(R.id.grid_view);

        // 適当なAdapterを作成
        MyAdapter myAdapter = new MyAdapter();

        // 作成したAdapterをListViewAnimationsのクラスに渡して、AnimationAdapterに
        SwingBottomInAnimationAdapter animationAdapter = new SwingBottomInAnimationAdapter(myAdapter);
        animationAdapter.setAbsListView(gridView);

        // StaggeredGridViewにAnimationAdapterをセット
        gridView.setAdapter(animationAdapter);
    }
    
    // BaseAdapterを継承した適当なAdapter
    private class MyAdapter extends BaseAdapter {
       ・・・
    }
}


ListViewAnimationsには、SwingBottomInAnimationAdapterクラス以外にも以下のクラスが用意されています。

・ AlphaAnimationAdapter
・ ScaleInAnimationAdapter
・ SwingLeftInAnimationAdapter
・ SwingRightInAnimationAdapter

クラス毎にアニメーションが異なります。
アニメーションの動作は、ListViewAnimationsのデモアプリで確認できます。

まとめ
既存のコードにも組み込みやすいプラグインなので、
あまり時間はかけられないけど、それっぽい画面を作りたい時には役立つと思います!