event.getX()
возвращает координаты касания относительно вашего вида (кнопка), event.getRawX()
возвращает координаты касания относительно дисплея, поэтому я думаю, что первый способ является правильным, если вы установите отступ для кнопка вместо макета. Но у вас все равно будет проблема «прыжка», потому что вы должны касаться кнопки, а не ее края, и при первом движении край будет помещен под ваш палец.
Я бы попробовал использовать GestureDetector
, его OnGestureListener
имеет метод onScroll()
, который дает вам расстояние прокрутки (он запоминает последнюю позицию и дает относительное движение), так что вы можете добавить это значение для отступа, то есть вы перетаскиваете 10px => добавляете 10px отступа.
пример кода:
private GestureDetector gd =
new GestureDetector(getContext(), new SimpleOnGestureListener() {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
setPadding((int)(getPaddingLeft()+distanceX),0,0,0);
}
@Override
public boolean onDown(MotionEvent e) {
return true; // else no event will be handled
}
Я бы также добавил несколько проверок для предотвращения отрицательных или чрезмерных заполнений.