LoginSignup
3

More than 5 years have passed since last update.

SpringAnimationのサンプル

Last updated at Posted at 2017-05-25

記事の概要

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

公式ドキュメント

ソースコード

  1. build.gradleでDynamicAnimation取り込み

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

    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を入れといて、あとで上書く。(なんか微妙)

    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が発動するように。

    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

まとめ

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3