Android: Как правильно масштабировать мышь/сенсорный ввод?
У меня есть игра для android, где холст масштабируется так, чтобы он выглядел одинаково на всех устройствах, использующих этот код:
canvas.scale((float)(getWidth()/(double)WIDTH), (float)(getHeight()/(double)HEIGHT))
где ширина и высота равны 1920 и 1080 соответственно. Моя проблема заключается в том, что для всех моих сенсорных столкновений (то есть пользователь, прикасающийся к фигуре) обрабатываются пути и области:
public static boolean collided(Path a, Path b) { Region clip = new Region(0,0,3000, 3000); Region rA = new Region(); rA.setPath(a, clip); Region rB = new Region(); rB.setPath(b, clip); return !rA.quickReject(rB) && rA.op(rB, Region.Op.INTERSECT); }
Теперь у меня также есть другой метод масштабирования (который едва ли имеет какой-либо эффект от того, что я могу сказать, но иногда имеет влияние) для масштабирования координат и измерений:
public static double scale(double x) { return dpToPx(x)/Resources.getSystem().getDisplayMetrics().density; }
Моя проблема в том, что при всем этом масштабировании я не могу заставить мышь находиться в правильном положении. Вот код, который я использую для создания пути мыши, который обрабатывает столкновение между мышью и другими фигурами:
mouse.set(x, y); mousePath.reset(); mousePath.addRect(mouse.x - 10, mouse.y - 10, mouse.x + 10, mouse.y + 10, Path.Direction.CW);
Однако поле mousePath оказывается далеко не там, где на самом деле находится мышь/касание. Он становится все дальше от прикосновения, чем дальше прикосновение от (0,0).
Что я уже пробовал:
масштабирование координат (x,y) различным образом и использование матрицы на пути, как показано ниже.
Попробуйте 1
mouse.set(scale(x), scale(y)); mousePath.reset(); mousePath.addRect(mouse.x - 10, mouse.y - 10, mouse.x + 10, mouse.y + 10, Path.Direction.CW);
Попробуйте 2
mouse.set(x,y); mousePath.reset(); mousePath.addRect(mouse.x - 10, mouse.y - 10, mouse.x + 10, mouse.y + 10, Point.Direction.CW); Matrix matrix = new Matrix(); matrix.setScale((float)(getWidth()/(double)WIDTH), (float)(getHeight()/(double)HEIGHT); mousePath.transfrom(matrix);
Каждый из них дал разные результаты, которые были очень неправильными, и я в растерянности. Пожалуйста помочь