Я попытался добавить механизм Drag & Drop в свой проект.
То, как я это делаю, - это в основном выполнение двух операций каждый раз, когда происходит событие касания:
сначала обновляю параметры, которые я использую внутри onLayout () в соответствии с событием касания
секунда, вызывая requestLayout () для обновления.
(я пробовал это как с методами OnTouchListener, так и с OnTouchEvent () в View, как в следующем коде)
Проблема в том, что результат на экране был не очень хорошим.
это создавало ощущение, будто существует некоторая разрывная проблема с перетаскиваемым видом (новый чертеж начинается раньше, чем заканчивается)
код выглядит примерно так (упрощенная версия):
public class DragAndDrop extends ViewGroup
{
View touchView;
float touchX;
float touchY;
static int W = 180;
static int H = 120;
public DragAndDrop(Context context)
{
super(context);
touchView = new View(context);
touchView.setBackgroundColor(0xaaff9900);
addView(touchView);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b)
{
float width = r - l;
float height = b - t;
int centerX = (int) (touchX - W / 2);
int centerY = (int) (touchY - H / 2);
touchView.layout(centerX, centerY, centerX + W, centerY + H);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
touchX = event.getX();
touchY = event.getY();
requestLayout();
return true;
}
}
после исследования я обнаружил, что проблема заключается в вызове requestLayout () метода внутри методов touchListener.
Я перевел этот вызов на таймер, который периодически его срабатывал, и результат был намного лучше.
Кто-нибудь еще испытывал это и знает, как лучше это сделать, не используя таймер?
Я предпочитаю избегать обновления все время больше, чем необходимо.
Спасибо за вашу помощь!