Поворот растрового изображения в Android вокруг точки без анимации зрения - PullRequest
0 голосов
/ 25 июня 2010

Я нашел несколько хороших ресурсов для поворота растрового изображения в Android здесь и в других местах сети.Я близок к тому, чтобы заставить мой код работать, но, видимо, я не совсем понимаю, как работают Matrix Translations.Ниже приведены три основные функции из моего класса спрайтов.Они прекрасно работали до того, как я добавил вещи для облегчения вращения матрицы (а именно в onDraw я назвал рисование только с x, y и без матрицы).Я написал тестовый код, чтобы добавить спрайт, и несколько раз повернуть его от 0 до 360 и снова вернуться к 0.Это приводит к тому, что он вращается вокруг своей орбиты в нечетной точке.На самом деле я хочу, чтобы он просто сидел и вращался:

public void Rotate_Sprite(int transform, int deg)
    {
        int spriteCenterX = x+(width/2);
                int spriteCenterY = y+(height/2);
        mMatrix.setRotate(deg, spriteCenterX, spriteCenterY);
        }

public void Draw_Sprite(Canvas c) { 
//c.drawBitmap(images[curr_frame], x, y, null); //this worked great esp in move sprite
    c.drawBitmap(images[curr_frame], mMatrix, null);
}

public void Create_Sprite(blah blah) {

    ...
    ...
    mMatrix = new Matrix();
    mMatrix.reset();
}

public int Move_Sprite() {
    //with the matrix stuff, I assume I need a translate.  But it does't work right 
    //for me at all.
    int lastx=this.x;
    int lasty=this.y;
    this.x+=this.vx;
    this.y+=this.vy;
    mMatrix.postTranslate(lastX-x,lastY-y); //doesn't work at all
}

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

Ответы [ 3 ]

1 голос
/ 30 июня 2010

Попробуйте это:

mMatrix.setTranslate(objectX,objectY);
mMatrix.postRotate(Degrees, objectXcenter, objectYcenter);

Обычно вам нужно сначала перевести растровое изображение в нужное место, установить его там, а затем повернуть на N градусов вокруг его центра.

1 голос
/ 10 февраля 2011

Для тех, кто находит это и пытается сделать то же самое:

Я вращаю свои изображения следующим образом:

//create all your canvases and bitmaps and get sizes first
Bitmap minBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.minute);
minCanvas..setBitmap(minBitmap);
int height = min.getHeight();
int width = min.getWidth();
//Bitmap minBitmap = Bitmap(width, height, Bitmap.Config.ARGB_8888); //not using in example


//The basically applies the commands to the source bitmap and creates a new bitmpa.  Check the order of width and height, mine was a square.
minMatrix.setRotate(minDegrees, width/2, height/2);
Bitmap newMin = Bitmap.createBitmap(minBitmap, 0, 0, (int) width, (int) height, minMatrix, true);

//apply this to a canvas.  the reason for this is that rotating an image using Matrix changes the size of the image and this will trim it and center it based on new demensions.
minCanvas2.drawBitmap(newMin, width/2 - newMin.getWidth()/2, height/2 - newMin.getHeight()/2, null);

//Then you can use it the way you want, but I create a bitmap from the canvas
minCanvas2.setBitmap(minBitmap);

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

HTH

1 голос
/ 25 июня 2010

Я не работал на андроиде, и прошло довольно много времени с тех пор, как я последний раз работал с матрицами, но звучит так, будто вращение работает нормально, и вы просто забыли перевести, поэтому точка вращения вокруг равна 0, 0.То, что вы захотите сделать, если это на самом деле проблема, это перевести спрайт так, чтобы его местоположение в мире было 0,0;вращать спрайт;затем переведите его НАЗАД туда, где он был раньше.Все это должно произойти до рисования этого кадра, поэтому сам перевод никогда не будет виден.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...