Выпуск вращающегося растрового изображения в Android - PullRequest
0 голосов
/ 10 ноября 2011

У меня проблема с получением правильного поворота растрового изображения.У меня есть SurfaceView с несколькими растровыми изображениями.Эти растровые изображения существуют внутри массива и с помощью цикла for я вызываю canvas.drawBitmap для каждого из них в методе onDraw.

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawColor(Color.BLACK);

    for (int i = 0; i < jumper.size(); i++) {
        canvas.drawBitmap(jumper.get(i).getGraphic(), jumper.get(i)
                .getCoordinates().getX(), jumper.get(i).getCoordinates()
                .getY(), null);
    }
}

Я пытаюсь заставить пользователя выбрать конкретное растровое изображение (одно из многих), а затем повернуть это растровое изображение, пока пользователь проводит пальцем по экрану.Итак, вот код вращения.На данный момент я просто использую значок андроида по умолчанию (72x72px), существующий в произвольной позиции где-то рядом с центром экрана.

private void rotateJumper(int direction) {
    Matrix matrix = new Matrix();
    Bitmap source = jumper.get(selectedJumperPos).getGraphic();
    matrix.postRotate(direction, source.getWidth() / 2, 
            source.getHeight() / 2);
    int x = 0;
    int y = 0;
    int width = 72;
    int height = 72;
    Bitmap tempBitmap = Bitmap.createBitmap(source, x, y, width, height,       
            matrix, true);
    jumper.get(selectedJumperPos).setGraphic(tempBitmap);
}

Целочисленное направление равно +1 или -1 в зависимости от направленияперетаскивания пальца.Таким образом, изображение должно поворачиваться на 1 градус для каждого события MotionEvent.ACTION_MOVE.

Вот проблемы:

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

Буду признателен за любую помощь, которую вы мне можете оказать.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 10 ноября 2011

Используйте матрицу для рисования существующего растрового изображения на холсте вместо создания нового растрового изображения:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawColor(Color.BLACK);

    for (int i = 0; i < jumper.size(); i++) {
        canvas.drawBitmap(jumper.get(i).getGraphic(), jumper.get(i).getMatrix(), null);
    }
}

private void rotateJumper(int direction) {
    Matrix matrix = jumper.get(selectedJumperPos).getMatrix();
    if(matrix == null) {
        matrix = new Matrix();
        matrix.setTranslate(jumper.get(...).getCoord...().getX(), jumper.get(..).getCoord...().getY());
        jumper.get(selectedJumperPos).setMatrix(matrix);
    }
    Bitmap source = jumper.get(selectedJumperPos).getGraphic();
    matrix.postRotate(direction, source.getWidth() / 2, 
            source.getHeight() / 2);

}
0 голосов
/ 10 ноября 2011

Прошу прощения за довольно оффтопный ответ, но ваш за-тупик привлек мое внимание.Может быть возможно записать его в «более читабельном» формате;

for (YourJumperItem item : jumper) {
    canvas.drawBitmap(
        item.getGraphic(), item.getCoordinates().getX(),
        item.getCoordinates().getY(), null );
}

Где YourJumperItem - это тип класса, который содержит ваш массив перемычек.К сожалению, мало что могу сказать о вращении растровых изображений, я просто рекламирую этот удобный способ написания -loops.

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