SpringAnimationのサンプル

## 記事の概要
SupportLibrary 25.3.0でSpringAnimationが追加されたのでサンプル書いてみました。
いまのところ、効果的な使いどころが分かってません。

## 公式ドキュメント
https://developer.android.com/preview/features/spring-animation.html

## ソースコード
1. build.gradleでDynamicAnimation取り込み

    ```:build.gradle
    compile 'com.android.support:support-dynamic-animation:25.3.0'
    ```
2. レイアウトファイル記述

    ```xml:activity_main.xml
    <?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="jp.sabakaido.dynamicanimation.MainActivity">

        <android.support.constraint.ConstraintLayout>

            <ImageView
                android:id="@+id/imageView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="8dp"
                android:layout_marginEnd="8dp"
                android:layout_marginStart="8dp"
                android:layout_marginTop="8dp"
                android:src="@mipmap/ic_launcher"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintVertical_bias="0.2" />

        </android.support.constraint.ConstraintLayout>
</layout>
```

3. SpringAnimationをメンバ変数に格納。
finalPositionはonCreateで0を入れといて、あとで上書く。(なんか微妙)

    ```java:MainActivity
        private SpringAnimation mAnimX;
        private SpringAnimation mAnimY;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);

            mBinding.imageView.setOnTouchListener(new DragListener());

            mAnimX = new SpringAnimation(mBinding.imageView, DynamicAnimation.X, 0);
            mAnimX.getSpring().setDampingRatio(SpringForce.DAMPING_RATIO_HIGH_BOUNCY);
            mAnimY = new SpringAnimation(mBinding.imageView, DynamicAnimation.Y, 0);
            mAnimY.getSpring().setDampingRatio(SpringForce.DAMPING_RATIO_HIGH_BOUNCY);
        }

        @Override
        public void onWindowFocusChanged(boolean hasFocus) {
            super.onWindowFocusChanged(hasFocus);

            // imageViewの位置がView表示後じゃないと取得できないのでonWindowFocusChangedでセット
            mAnimX.getSpring().setFinalPosition(mBinding.imageView.getLeft());
            mAnimY.getSpring().setFinalPosition(mBinding.imageView.getTop());
        }
```

4. DragListenerの実装。
ドラッグが終わるとSpringAnimationが発動するように。

    ```java:MainActivity
        /**
         * ドラッグイベントのリスナー
         */
        private class DragListener implements View.OnTouchListener {
            private int oldx;
            private int oldy;

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int x = (int) event.getRawX();
                int y = (int) event.getRawY();

                switch (event.getAction()) {
                    // 引っ張ったら付いてくる
                    case MotionEvent.ACTION_MOVE:
                        int left = v.getLeft() + (x - oldx);
                        int top = v.getTop() + (y - oldy);

                        v.layout(left, top, left + v.getWidth(), top + v.getHeight());
                        break;
　　　　　　　　　　　　　　　　    　　　　　　　　// 離すとfinalPositionにSpringAnimationで移動
                    case MotionEvent.ACTION_UP:
                        mAnimX.start();
                        mAnimY.start();
                        break;
                }

                oldx = x;
                oldy = y;

                return true;
            }
        }
```

## github
https://github.com/a2kaido/android-spring-animation-sample

## まとめ
割りと簡単に実装できました。
(実は、`DynamicAnimation.X`のところを`DynamicAnimation.TRANSLATION_X`と書いていてハマったりした)

少し遊び心をいれたいときにどうぞ。