2015-05-05 3 views
1

У меня есть растровое изображение, которое я хотел бы повернуть вокруг точки на холсте. Точка, которую я хочу повернуть, не является центром растрового изображения. Я использую матрицу. Вот пример того, что у меня есть.Поворот растрового изображения вокруг точки NOT center для растрового изображения

Bitmap image = ContentManager.getInstance().getImage(imageId); 
    Matrix matrix = new Matrix(); 
    matrix.setTranslate(-image.getWidth()/2f, -image.getHeight()/2f); 
    matrix.postRotate(rotationDegrees); 
    matrix.postTranslate(x/scaleX, y/scaleY); 
    matrix.postScale(scaleX, scaleY); 
    paint.setAlpha(alpha); 
    canvas.drawBitmap(image, matrix, paint); 

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

.

Я попробовал все, что я могу думать от установки

matrix.setTranslate(-image.getWidth()/2f, -image.getHeight()/2f); 

в

matrix.setTranslate(pivotPoint.x, pivotPoint.y); 

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

ответ

0

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

float angle; 
    float radius; 

    Bitmap wheelSelectBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image); 
    Matrix matrix = new Matrix(); 

    Point pivotPoint = new Point(); 
    pivotPoint.set(pivotPoint.x, pivotPoint.y) 
    Point newCenter = new Point(); 
    newCenter.set((int)(pivotPoint.x + (radius * Math.cos(angle)), (int)(pivotPoint.y - (radius * Math.sin(angle))); 

    matrix.postTranslate(newCenter.x - (bitmap.getWidth()/2f), newCenter.y - (bitmap.getHeight()/2f)); 
    matrix.postRotate(angle, newCenter.x, newCenter.y); 

    Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), null, true); 
    canvas.drawBitmap(bitmap, matrix, null); 

Это может быть не идеально, но работа по этому пути решила проблему для меня и остановила растровые изображения, пролетая по всему магазину. Он также вращается по часовой стрелке по умолчанию в отличие от вашей диаграммы, поэтому просто используйте -angle для counter-CW. Не уверен, что здесь происходит, как этот код определенно не удалось получить желаемый эффект для меня:

matrix.postTranslate(pivotPoint.x, pivotPoint.y); 
matrix.postRotate(angle); 
matrix.postTranslate(radius - (bitmap.getWidth()/2f), -bitmap.getHeight()/2f); 

Cant увидеть, что не так с логикой здесь? Но в моем случае растровое изображение не было видно в представлении здесь.

0

При вращении объекта он будет вращаться вокруг начала координат (в верхнем левом углу). Сначала вы должны перевести растровое изображение, чтобы точка поворота становилась (0, 0), поворачивайте растровое изображение, а затем переводите обратно в исходное положение.

вы могли бы попробовать что-то вроде этого:

matrix.setTranslate(-px, -py); 
matrix.postRotate(rotationDegrees); 
matrix.setTranslate(px, py); 
// Then do other things. 
Смежные вопросы