Рисование линии следующим пальцем - motionevent.getX () и getY () неверное ОБНОВЛЕНИЕ
ОБНОВЛЕНИЕ: пожалуйста, прочитайте весь вопрос снова :-)
Фон:
Я создал сетку точек, создав пользовательский вид, а затем добавив эти виды вTableLayout
, Цель состоит в том, чтобы я смог нарисовать линию от одной из этих точек до другой точки таким образом, чтобы при нажатии точки линия начиналась от центра нажатой точки до точки, где в данный момент находится палец. трогательный. Когда палец перетаскивается на другую точку, линия заканчивается в центре этой точки. В результате получается линия, проведенная от центра нажатой точки к центру точки, которую перетащил палец.
Чтобы создать линию, проходящую черезTableLayout
, Я создал новый пользовательский вид, который просто создал линию между точками сcanvas.drawLine()
метод. Затем я создалFrameLayout
в котором я положил TableLayout и LineView. Это означало, что вид линии может быть нарисован поверх TableLayout.
Текущая ситуация:
Я добавил сенсорный слушатель в класс DotView, чтобы он мог иметь свой собственный «сенсорный отзыв », В упражнении есть еще один сенсорный слушатель, которого я пытаюсь использовать, чтобы получить точки, необходимые для подведения черты. Насколько я могу судить, сенсорные слушатели работают нормально - они не мешают друг другу.
Проблема в получении правильных координат для построения линии. Я пробовал несколько способов получить координаты центра точки, которая была нажата (начальная точка линии), но мне все еще не удалось это. Этот вопрос, имеет больше информации:Получить координаты центра вида , Вторая часть - это получение правильной конечной точки линии. Для целей этого вопроса я бы хотел, чтобы конец строки следовал за положением пальца. Я думал, что это так же просто, какmotionevent.getX() / getY()
но это еще нет работал. Вместо этого произошло то, что между координатами в масштабе относительно макета точки и координатами относительно всего макета / экрана произошла путаница.
Проще говоря: значения getX () и getY () неверны, и это то, что я пытаюсь решить здесь.
Как показано на скриншотах, когда я нажимаю на точку, начальная точка линии находится примерно в правильном месте, но конечная точка находится далеко. Я могу'действительно объясняю почему.
я пыталсяgetRawX()
а такжеgetRawY()
и они возвращают гораздо более точные значения, но они все еще неверны по количеству заполнения (или что-то в этом роде - я нет 100% понимаю).
Это показывает мой код
В моем :Activity
LineView test;
FrameLayout fl;
float startPointX = 0;
float startPointY = 0;
// Removed
@Override
public boolean onTouch(View view, MotionEvent event) {
float eventX = event.getX();
float eventY = event.getY();
int[] loc = new int[2];
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (view instanceof DotView) {
DotView touchedDv = (DotView) view;
int dotColor = touchedDv.getColor();
test.setColor(dotColor);
float[] f = touchedDv.getDotCenterLocationOnScreen();
startPointX = f[0];
startPointY = f[1];
test.setPoints(startPointX, startPointY, eventX, eventY);
fl.addView(test);
}
vib.vibrate(35);
return false;
case MotionEvent.ACTION_MOVE:
test.setPoints(startPointX, startPointY, eventX, eventY);
break;
case MotionEvent.ACTION_UP:
fl.removeView(test);
return false;
default:
return false;
}
return true;
}
И наконец то:LineView
public class LineView extends View {
public static final int LINE_WIDTH = 10;
Paint paint = new Paint();
float startingX, startingY, endingX, endingY;
public LineView(Context context) {
super(context);
paint.setColor(Color.MAGENTA);
paint.setStrokeWidth(LINE_WIDTH);
}
public void setPoints(float startX, float startY, float endX, float endY) {
startingX = startX;
startingY = startY;
endingX = endX;
endingY = endY;
invalidate();
}
@Override
public void onDraw(Canvas canvas) {
canvas.drawLine(startingX, startingY, endingX, endingY, paint);
}
ЗАМЕТКИ:
Я звоню в верхнюю левую точку."dot 1"
Снимки экрана могут быть не совсем точными, так как мой палец слегка двигается, когда я делаю снимок экрана, но описанное мной поведение происходит.
Если понадобится любая другая информация / код, я с радостью предоставлю ее.
Спасибо, что нашли время, чтобы прочитать это - извините, это так долго!