記事の概要
SupportLibrary 25.3.0でSpringAnimationが追加されたのでサンプル書いてみました。
いまのところ、効果的な使いどころが分かってません。
公式ドキュメント
ソースコード
-
build.gradleでDynamicAnimation取り込み
build.gradlecompile 'com.android.support:support-dynamic-animation:25.3.0'
-
レイアウトファイル記述
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>
-
SpringAnimationをメンバ変数に格納。
finalPositionはonCreateで0を入れといて、あとで上書く。(なんか微妙)MainActivityprivate 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()); }
-
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
と書いていてハマったりした)
少し遊び心をいれたいときにどうぞ。