Szukałem rozwiązania tego problemu przez ponad dzień, ale nic nie pomaga, nawet odpowiedzi tutaj. Dokumentacja też niczego nie wyjaśnia.
Po prostu próbuję uzyskać obrót w kierunku innego obiektu. Problem polega na tym, że mapa bitowa nie jest obracana wokół ustalonego punktu, ale raczej wokół map bitowych (0,0).
Oto kod, z którym mam problem:
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;
Dziwne jest to, że nie ma znaczenia, w jaki sposób zmienię wartości w pre
/ postTranslate()
i argumenty float w setRotation()
. Czy ktoś może mi pomóc i popchnąć mnie we właściwym kierunku? :)
new
wyedytowanej matrycy. To już tożsamość.Odpowiedzi:
Mam nadzieję, że pomoże ci następująca sekwencja kodu:
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());
Jeśli zaznaczysz następującą metodę z
~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)
to wyjaśniałoby, co robi z rotacją i translacją.
źródło
Edytowano : zoptymalizowany kod.
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); }
Aby uzyskać Bitmapę z zasobów:
Bitmap source = BitmapFactory.decodeResource(this.getResources(), R.drawable.your_img);
źródło
Wróciłem do tego problemu teraz, kiedy finalizujemy grę i po prostu pomyślałem, że opublikuję, co mi pomogło.
Oto metoda obracania Matrycy:
this.matrix.reset(); this.matrix.setTranslate(this.floatXpos, this.floatYpos); this.matrix.postRotate((float)this.direction, this.getCenterX(), this.getCenterY());
(
this.getCenterX()
to w zasadzie pozycja X map bitowych + szerokość map bitowych / 2)I metoda rysowania mapy bitowej (wywoływanej przez
RenderManager
klasę):canvas.drawBitmap(this.bitmap, this.matrix, null);
Więc jest to pozornie proste, ale wydaje mi się to trochę dziwne, że nie mogłem go uruchomić,
setRotate
a następniepostTranslate
. Może niektórzy wiedzą, dlaczego to nie działa? Teraz wszystkie mapy bitowe obracają się prawidłowo, ale nie jest to pozbawione niewielkiego spadku jakości mapy bitowej: /W każdym razie dziękuję za pomoc!
źródło
Możesz również obrócić
ImageView
za pomocąRotateAnimation
: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);
źródło
Możesz użyć czegoś takiego jak:
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());
źródło
Spójrz na próbkę z Google o nazwie Lunar Lander, tam obraz statku jest dynamicznie obracany.
Przykładowy kod Lunar Lander
źródło
Użyłem tej konfiguracji i nadal mam problem z pikselizacją:
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);
źródło
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);
źródło