Почему motionEvent.getX() возвращает несовместимые значения при использовании setScaleX()?
У меня дочерний вид находится в ViewGroup. Я хотел бы масштабировать (масштабировать) ребенка с щепоткой. Я использую setScaleX/Y() для масштабирования ребенка. Шкала рассчитывается от расстояния между двумя указателями в OnTouch(). Но когда я устанавливаю масштаб дочернего элемента, это делает motionEvent.getX() непоследовательным, что делает масштаб непоследовательным:
case MotionEvent.ACTION_MOVE:
p1.set(ev.getX(firstPointerIndex), v.getY(firstPointerIndex));
Log.d(TAG,"Touch xy: " + ev.getX(firstPointerIndex) + "," + ev.getY(firstPointerIndex));
this.setScaleX(scale);
this.setScaleY(scale);
break;
Выход
Это вывод одного указателя:
12-09 11:55:14.828: D/IconItem(14408): Touch xy:54.622437, 135.79865
12-09 11:55:14.843: D/IconItem(14408): Touch xy:35.761047, 192.07361
12-09 11:55:14.863: D/IconItem(14408): Touch xy:54.669342, 135.65869
12-09 11:55:14.878: D/IconItem(14408): Touch xy:35.85121, 191.8046
12-09 11:55:14.898: D/IconItem(14408): Touch xy:54.715958, 135.51959
12-09 11:55:14.898: D/IconItem(14408): Touch xy:35.94078, 191.53735
12-09 11:55:14.913: D/IconItem(14408): Touch xy:54.776947, 135.33765
Вопрос
Проблема заключается в скачках 35-54 по координате х или 135-191 по координате у. Я не могу понять, откуда эти прыжки. Когда я не использую setScaleX/Y(), ev.getX/T() согласованы - никаких переходов. Может ли кто-нибудь зажечь меня? Разве я не должен использовать эти методы шкалы? Они влияют на ev.getX/Y()? Как я могу реализовать увеличение (с помощью щепотки) вида другим способом?
1 ответ
Да, каждое событие движения задается в координатах вида с учетом матрицы вида (которая, в свою очередь, включает масштаб). Вы можете попробовать сделать масштабирование через canvas.scale()
вместо масштабирования вида, как в "Осмыслении мультитача", или, возможно, путем захвата событий MotionEvents в другом представлении, которое не подвергается операции масштабирования.