■実装
DraggableView.java
package info.justoneplanet.android.sample.drag; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; public class DraggableView extends View { @SuppressWarnings("unused") private static final String TAG = DraggableView.class.getSimpleName(); private final DraggableView self = this; private int offsetX; private int offsetY; private int currentX; private int currentY; public DraggableView(Context context) { super(context); } public DraggableView(Context context, AttributeSet attrs) { super(context, attrs); } public DraggableView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onTouchEvent(MotionEvent event) { int x = (int) event.getRawX();// touch eventが発生したx座標 int y = (int) event.getRawY();// touch eventが発生したy座標 /* (2) 1つ前の値であるoffsetから * 現在ドラッグしている座標を引いて差を出し * 現在の座標に加算する * 最後にoffset値を更新する */ if (event.getAction() == MotionEvent.ACTION_MOVE) { Log.d("ACTION_MOVE", "ACTION_MOVE"); int diffX = x - offsetX; int diffY = y - offsetY; currentX = currentX + diffX; currentY = currentY + diffY; layout(currentX, currentY, currentX + getWidth(), currentY + getHeight()); offsetX = x; offsetY = y; } //...(1) タッチした時の値を初期値にする else if (event.getAction() == MotionEvent.ACTION_DOWN) { Log.d("ACTION_DOWN", "ACTION_DOWN"); offsetX = x; offsetY = y; } else if (event.getAction() == MotionEvent.ACTION_UP) { Log.d("ACTION_UP", "ACTION_UP"); } return true; } }
ACTION_MOVEの方が実行回数が大きいので先に記述する。
main.xml
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <info.justoneplanet.android.sample.drag.DraggableView android:layout_width="100dip" android:layout_height="100dip" android:background="#ff00ff00"> </info.justoneplanet.android.sample.drag.DraggableView> </FrameLayout>
MainActivity.javaは特に何も変更していない。Viewなので継承して使える。ImageViewとかでも同じように実装できる。