Я работаю над чем-то похожим на это. Вот OnTouchListener, который я использую:
myOnTouchListener = new OnTouchListener() {
public boolean onTouch(View v, MotionEvent me){
if (me.getAction() == MotionEvent.ACTION_DOWN){
oldXvalue = me.getX();
oldYvalue = me.getY();
Log.i(myTag, "Action Down " + oldXvalue + "," + oldYvalue);
}else if (me.getAction() == MotionEvent.ACTION_MOVE ){
LayoutParams params = new LayoutParams(v.getWidth(), v.getHeight(),(int)(me.getRawX() - (v.getWidth() / 2)), (int)(me.getRawY() - (v.getHeight())));
v.setLayoutParams(params);
}
return true;
}
};
v - это представление, которое вы хотите переместить, в вашем случае вы бы заменили v своей кнопкой. Также обратите внимание, что для того, чтобы заставить это работать, я должен был использовать AbsoluteLayout в качестве родительского представления в моем XML-файле. Я знаю, что это устарело, но казалось более логичным использовать его, чем RelativeLayout и пытаться динамически устанавливать поля для перемещения представления. Формула, которую я использовал для новых позиций x и y, пытается сделать так, чтобы вид был в центре вашего пальца, пока вы двигаете его. Но это не совсем идеально, в зависимости от размера изображения оно все еще будет немного смещено от вашего пальца.