Как сделать тест на удар по повернутому изображению в Android? - PullRequest
1 голос
/ 04 октября 2011

Я пытаюсь выполнить тест на удар по повернутому объекту изображения, нарисованному на холсте при виде поверхности.Когда изображение не вращается, мы можем напрямую использовать left, top, width и height в качестве границ, чтобы проверить, находится ли точка внутри прямоугольника изображения.Но как это сделать, когда объект повернут на некоторый угол?

Я использую: canvas.rotate(angle, pivotX ,pivotY);, чтобы нарисовать повернутое изображение.

Я не смог повернуть повернутые влево и вверхобъект изображения.Я попытался взять оригинал слева и сверху от изображения, и когда я нажимаю на экран, я поворачиваю точку касания назад на тот же угол, используя:

angledTouchX = (float) (eventX * Math.cos(-objectAngle) - eventY * Math.sin(-objectAngle));
angledTouchY  = (float) (eventY * Math.sin(-objectAngle) + eventX * Math.cos(-objectAngle));

Это не работает, потому что вращает точку относительно (0, 0), но я хочу, чтобы это было в центре объекта изображения.

Ответы [ 2 ]

1 голос
/ 20 июля 2014

Работал над похожей проблемой. В моем случае я хочу сделать самое горячее между точкой касания и повернутым и масштабированным видом. Поэтому я преобразовываю систему координат точки касания в соответствии с поворотом вида и проверяю, находится ли она внутри границы без вращения.

Шаг

  1. Получить точку касания в системе координат экрана, полученную от event.getRawX() и event.getRawY()

  2. Целевое местоположение просмотра на экране, полученное от

     int location[] = new int[2];
     view.getLocationOnScreen(location);
     int viewX = location[0];
     int viewY = location[1];
    
  3. Создать вектор, как если бы исходная точка вида была источником пространства

    float[] vec = new float[2];
    vec[0] = event.getRawX() - viewX;
    vec[1] = event.getRawY() - viewY;
    
  4. Поворот вектора

    Matrix matrix = new Matrix();
    matrix.setRotate(-1 * view.getRotation());
    matrix.mapVectors(vec);
    
  5. Изменить повернутый вектор на экранное пространство

    vec[0] = vec[0] + viewX;
    vec[1] = vec[1] + viewY;
    
  6. Проверьте, находится ли повернутая координата касания в не повернутой границе

    if(( vec[0] > viewX 
        && vec[0] < (viewX + (view.getWidth() * view.getScaleX()) )) 
        &&( vec[1] > viewY 
        && vec[1] < (viewY + (view.getHeight() * view.getScaleY()) ))){
            isPointInTextView = true;
    } else {
            isPointInTextView = false;
    }
    
1 голос
/ 04 октября 2011

Вы должны работать с ним математически. Лучший способ сделать это, прежде чем вращать холст, изменить положение по ширине / 2, высоте / 2. Затем примените вращение и, наконец, вернитесь на предыдущую позицию по ширине / 2, высоте / 2. Тогда ваша картинка будет всегда вращаться из центра. Но все равно после поворота ваше новое изображение будет иметь новый размер, который будет соответствовать выравниванию прямоугольника по сторонам экрана.

...