Há mais de um dia procuro uma solução para este problema, mas nada ajuda, nem mesmo as respostas aqui. A documentação também não explica nada.
Estou simplesmente tentando obter uma rotação na direção de outro objeto. O problema é que o bitmap não é girado em torno de um ponto fixo, mas sim em torno dos bitmaps (0,0).
Aqui está o código com o qual estou tendo problemas:
Matrix mtx = new Matrix();
mtx.reset();
mtx.preTranslate(-centerX, -centerY);
mtx.setRotate((float)direction, -centerX, -centerY);
mtx.postTranslate(pivotX, pivotY);
Bitmap rotatedBMP = Bitmap.createBitmap(bitmap, 0, 0, spriteWidth, spriteHeight, mtx, true);
this.bitmap = rotatedBMP;
A parte estranha é que não importa como eu altero os valores em pre
/ postTranslate()
e os argumentos flutuantes em setRotation()
. Alguém pode me ajudar e me empurrar na direção certa? :)
new
matriz recém- editada. Já é a identidade.Respostas:
Espero que a seguinte sequência de código o ajude:
Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, targetHeight, config); Canvas canvas = new Canvas(targetBitmap); Matrix matrix = new Matrix(); matrix.setRotate(mRotation,source.getWidth()/2,source.getHeight()/2); canvas.drawBitmap(source, matrix, new Paint());
Se você verificar o seguinte método de
~frameworks\base\graphics\java\android\graphics\Bitmap.java
public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
isso explicaria o que ele faz com rotação e translação.
fonte
Editado : código otimizado.
public static Bitmap RotateBitmap(Bitmap source, float angle) { Matrix matrix = new Matrix(); matrix.postRotate(angle); return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true); }
Para obter bitmap de recursos:
Bitmap source = BitmapFactory.decodeResource(this.getResources(), R.drawable.your_img);
fonte
Voltei a esse problema agora que estamos finalizando o jogo e só pensei em postar o que funcionou para mim.
Este é o método para girar a Matriz:
this.matrix.reset(); this.matrix.setTranslate(this.floatXpos, this.floatYpos); this.matrix.postRotate((float)this.direction, this.getCenterX(), this.getCenterY());
(
this.getCenterX()
é basicamente a posição X dos bitmaps + a largura dos bitmaps / 2)E o método para desenhar o bitmap (chamado por meio de uma
RenderManager
classe):canvas.drawBitmap(this.bitmap, this.matrix, null);
Portanto, é bastante simples, mas acho um pouco estranho que não consegui fazê-lo funcionar por
setRotate
seguido depostTranslate
. Talvez alguns saibam por que isso não funciona? Agora todos os bitmaps giram adequadamente, mas não sem uma pequena diminuição na qualidade do bitmap: /De qualquer forma, obrigado pela ajuda!
fonte
Você também pode girar o
ImageView
usando umRotateAnimation
:RotateAnimation rotateAnimation = new RotateAnimation(from, to, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); rotateAnimation.setInterpolator(new LinearInterpolator()); rotateAnimation.setDuration(ANIMATION_DURATION); rotateAnimation.setFillAfter(true); imageView.startAnimation(rotateAnimation);
fonte
Você pode usar algo como o seguinte:
Matrix matrix = new Matrix(); matrix.setRotate(mRotation,source.getWidth()/2,source.getHeight()/2); RectF rectF = new RectF(0, 0, source.getWidth(), source.getHeight()); matrix.mapRect(rectF); Bitmap targetBitmap = Bitmap.createBitmap(rectF.width(), rectF.height(), config); Canvas canvas = new Canvas(targetBitmap); canvas.drawBitmap(source, matrix, new Paint());
fonte
Veja a amostra do Google chamada Lunar Lander, a imagem da nave ali é girada dinamicamente.
Amostra de código do módulo lunar
fonte
Usei essas configurações e ainda tenho o problema de pixelização:
Bitmap bmpOriginal = BitmapFactory.decodeResource(this.getResources(), R.drawable.map_pin); Bitmap targetBitmap = Bitmap.createBitmap((bmpOriginal.getWidth()), (bmpOriginal.getHeight()), Bitmap.Config.ARGB_8888); Paint p = new Paint(); p.setAntiAlias(true); Matrix matrix = new Matrix(); matrix.setRotate((float) lock.getDirection(),(float) (bmpOriginal.getWidth()/2), (float)(bmpOriginal.getHeight()/2)); RectF rectF = new RectF(0, 0, bmpOriginal.getWidth(), bmpOriginal.getHeight()); matrix.mapRect(rectF); targetBitmap = Bitmap.createBitmap((int)rectF.width(), (int)rectF.height(), Bitmap.Config.ARGB_8888); Canvas tempCanvas = new Canvas(targetBitmap); tempCanvas.drawBitmap(bmpOriginal, matrix, p);
fonte
matrix.reset(); matrix.setTranslate( anchor.x, anchor.y ); matrix.postRotate((float) rotation , 0,0); matrix.postTranslate(positionOfAnchor.x, positionOfAnchor.x); c.drawBitmap(bitmap, matrix, null);
fonte