2014-08-31 4 views
0

Я борюсь с растровыми вращениями. Я хочу повернуть графику вокруг альтернативной оси, но я могу только заставить ее вращаться вокруг центральной точки независимо от того, что я делаю, добавляя postTranlate. preTranslate, set Translate в любом порядке не работает. Я также попробовал postRotate (45,0,0), но он всегда вращается вокруг центра. Приведенный ниже код Интернета, что бы я сделал, чтобы изменить его точку поворота, код ниже использует значок запуска, который является квадратом. Я использую длинную тонкую графику, например стрелку.Вращение вокруг чередующейся оси

// Rotate image to 45 degrees. 

public void RotateImage(){ 
    ImageView image; 
    Bitmap bMap; 
    Matrix matrix; 

    //Get ImageView from layout xml file 
    image = (ImageView) findViewById(R.id.imageView1); 

    //Decode Image using Bitmap factory. 
    bMap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); 

    //Create object of new Matrix. 
    matrix = new Matrix(); 

    //set image rotation value to 45 degrees in matrix. 
    matrix.postRotate(45); 

    //Create bitmap with new values. 
    Bitmap bMapRotate = Bitmap.createBitmap(bMap, 0, 0, 
      bMap.getWidth(), bMap.getHeight(), matrix, true); 

    //put rotated image in ImageView. 
    image.setImageBitmap(bMapRotate); 
} 

Я попытался код ниже, но его все еще вращается вокруг центра или, по крайней мере, кажется слишком

public void RotateImage{ 

    ImageView image; 
    Bitmap bMap; 
    Matrix matrix; 

    //Get ImageView from layout xml file 
    image = (ImageView) findViewById(R.id.imageView); 

    //Decode Image using Bitmap factory. 
    bMap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); 

    //Create object of new Matrix. 
    matrix = new Matrix(); 

    //set image rotation value to 45 degrees in matrix. 
    matrix.setTranslate(-100,-200); 
    matrix.postRotate(angle); 
    matrix.postTranslate(100,200); 
    //Create bitmap with new values. 
    Bitmap bMapRotate = Bitmap.createBitmap(bMap, 0, 0, 
      bMap.getWidth(), bMap.getHeight(), matrix, true); 

    //put rotated image in ImageView. 
    image.setImageBitmap(bMapRotate); 

Благодарности

ответ

0

Если вы хотите, чтобы ваш Bitmap вращаться на 45 градусов вокруг оси х с pivot (a, b), вы можете позвонить по телефону matrix.rotate(45, a, b)

+0

матрица представляется, не имеет поворот метода, который я думаю, вы могли бы означать postRotate (45, a, b), который по-прежнему вращается вокруг центра, документация показывает, что это будет работать, но моя всегда появляется в середине. Я думаю, что представление может быть повторно запущено, но просто не может его обработать. – user3129787

+0

@ user3129787 Можете ли вы предоставить примерные значения, которые вы используете? Также разместите несколько снимков экрана для различных значений a и b. –

0

Возможно, вы хотите использовать класс камеры для поворота вокруг оси X, Y или Z:

matrix = new Matrix(); 

Camera camera = new Camera(); 
camera.save(); 
camera.rotateX(45f); 
camera.getMatrix(matrix); 
camera.restore(); 
+0

К какому классу 'Camera' вы относитесь? –

+0

android.graphics.Camera – Simas

+0

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

0

Как я понимаю, ваш вопрос заключается в том, что вы хотите повернуть изображение вокруг какой-либо точки, скажем (x, y). Концептуально вам необходимо выполнить следующие преобразования на изображении:

  1. Перевести на (-x, -y)
  2. Поворот на 45 градусов
  3. Перевести на (x, y)
+0

, как она отличается от поворота с точкой поворота? – pskink

+0

@pskink То же самое. Это то, что означает документация для 'postRotate()'? IMO, документы являются загадочными или же используют математическую нотацию, с которой я не знаком. –

+0

Я добавил ниже, но он остается центрированным. Я действительно не понимаю PRE, Post, Set prefix, поэтому просто угадываю, но он по-прежнему вращается вокруг центра. matrix.setTranslate (-100, -200); матрица.postRotate (угол); matrix.postTranslate (100,200); – user3129787

0

Вы можете использовать этот метод, чтобы повернуть объект из центр создать этот метод в классе спрайтов

public void paintFromCenter(float angle, Canvas c) { 
    Bitmap b = sprite; 
    Bitmap h = b; 
    // Canvas canvas = new Canvas(a); 
    Matrix matrix = new Matrix(); 
    matrix.postRotate(angle, h.getWidth()/2, h.getHeight()); 
    matrix.postTranslate(getX(), getY()); 
    // canvas.drawBitmap(bitmap, matrix, new Paint()); 
    Bitmap bmp2 = Bitmap.createBitmap(h, 0, 0, frameWidth, frameHeight, 
      matrix, true); 
    c.drawBitmap(h, matrix, null); 
    // g.getCanvas().drawBitmap(bmp2, getX(), getY(), null); 
} 

Сейчас в onTouchEvent()

public boolean onTouchEvent(MotionEvent event) { 
    if (event.getAction() == MotionEvent.ACTION_MOVE) { 

     evX = (int) event.getX(); 
     evY = (int) event.getY(); 
     int initX = objectSprite.getX(); 
     int inity = objectSprite.getY(); 

     if ((evX > objectSprite.getX() 
       && evX < objectSprite.getX() + objectSprite.getWidth() 
       && evY > objectSprite.getY() && evY < objectSprite.getY() 
       + objectSprite.getHeight())) { 
      if (angle < 90) { 
       angle += 5; 
      } else if (angle < -180) 
       angle -= 5; 

     } 
} 

    return true; 
} 

в розыгрыше() метод окрасить изображение/объект

private void draw(Canvas canvas) { 
objectSprite.paintFromCenter(angle, canvas); 
} 

попробуйте

Смежные вопросы