2012-01-03 10 views
22

voglio per ruotare l'immagine secondo un angolo specifico in Android, qualche cosa come una bussola ...Rotazione Immagine su una tela in Android

ho questo codice ... funziona su drawPath() ma voglio sostituire il percorso e la cosa del disegno con l'immagine .. Ho provato a creare un'immagine bitmap, DrawBitmapImage, ma l'immagine non ruota come il percorso .. Qualche aiuto per favore?

public void draw(Canvas canvas) { 
    double angle = calculateAngle(currentLongitude, currentLatitude, targetLongitude, targetLatitude); 

    //Correction; 
    angle-=90; 

    //Correction for azimuth 
    angle-=azimuth; 

    if((getContext() instanceof Activity) && ((Activity)getContext()).getWindowManager().getDefaultDisplay().getOrientation()==Configuration.ORIENTATION_PORTRAIT)angle-=90; 

    while(angle<0)angle=angle+360; 

    Rect rect = canvas.getClipBounds(); 

    int height = rect.bottom-rect.top; 
    int width = rect.right-rect.left; 
    int left = rect.left; 
    int top = rect.top; 

    if(height>width){ 
     top+=(height-width)/2; 
     height=width; 
    } 
    if(width>height){ 
     left+=(width-height)/2; 
     width=height; 
    } 

    float centerwidth = width/2f; 
    float centerheight = height/2f; 

    Paint p = new Paint(); 
    p.setColor(color); 
    p.setStyle(Paint.Style.FILL); 
    p.setAntiAlias(true); 

    float startX = left+(float)(centerwidth+Math.cos(deg2rad(angle))*width/3.0); 
    float startY = top+(float)(centerheight+Math.sin(deg2rad(angle))*height/3.0); 

    Path path = new Path(); 
    path.moveTo(
      startX, 
      startY); 
    path.lineTo(
      left+(float)(centerwidth+Math.cos(deg2rad(angle+140))*width/4.0), 
      top+(float)(centerheight+Math.sin(deg2rad(angle+140))*height/4.0)); 
    path.lineTo(
      left+(float)centerwidth, 
      top+(float)centerheight 
      ); 
    path.lineTo(
      left+(float)(centerwidth+Math.cos(deg2rad(angle+220))*width/4.0), 
      top+(float)(centerheight+Math.sin(deg2rad(angle+220))*height/4.0) 
      ); 

    path.lineTo(
      startX, 
      startY 
      ); 




    canvas.drawPath(path, p); 
} 

risposta

48

È possibile ruotare il bitmap quando si disegna utilizzando una matrice:

Matrix matrix = new Matrix(); 
matrix.setRotate(angle, imageCenterX, imageCenterY); 
yourCanvas.drawBitmap(yourBitmap, matrix, null); 

Puoi farlo anche ruotando la tela prima del disegno:

yourCanvas.save(Canvas.MATRIX_SAVE_FLAG); //Saving the canvas and later restoring it so only this image will be rotated. 
yourCanvas.rotate(-angle); 
yourCanvas.drawBitmap(yourBitmap, left, top, null); 
yourCanvas.restore(); 

Scegli quello che fa al caso tuo.

+0

@Jave, penso che il primo approccio possa essere utilizzato, in particolare, dove si desidera ruotare un'immagine o una bitmap attorno all'asse xe/o all'asse y poichè 'Canvas' non ha metodi di rotazione diversi da quello che lo fa nel piano XY. Penso che si possa ottenere un oggetto 'Camera' e realizzare le trasformazioni 3D necessarie e infine usare' getMatrix' passando l'istanza 'Matrix' per ottenere la corrispondente rappresentazione' Matrix'. Infine, passa questo 'Matrix' al metodo' drawBitmap'. In particolare, [qui] (http://stackoverflow.com/questions/32554925/android-animate-rotation-of-map-marker-around-x-and-y-axis): qualsiasi idea. Grazie! –

3

Devi prima ruotare la tela e poi disegnare quello che vuoi. Quindi l'oggetto disegnato apparirà come ruotato sullo schermo.

canvas.rotate(45); // degrees to rotate 

prova questo suo buon modo.

controllare questo tutorial potrete ottenere informazioni su come disegnare bitmap e come ruotare tela

Check complete tutorial

+0

Ruota la tela in base all'angolo? E allora? Basta creare Bitmap e disegnarlo – Reham

+0

sembra che tu non abbia letto le informazioni disponibili sul sito web di Android Developers. Nella classe Canvas sono disponibili molte funzioni per disegnare Bitmap. Devi chiamare qualsiasi drwaBitmap() dopo canvas.rotate() in base alle tue esigenze. –

+0

@Reham verifica nuova risposta –

1

@Reham: Guardate questo codice di esempio riportato di seguito,

public class bitmaptest extends Activity { 
@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    LinearLayout linLayout = new LinearLayout(this); 

    // load the origial BitMap (500 x 500 px) 
    Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(), 
      R.drawable.android); 

    int width = bitmapOrg.width(); 
    int height = bitmapOrg.height(); 
    int newWidth = 200; 
    int newHeight = 200; 

    // calculate the scale - in this case = 0.4f 
    float scaleWidth = ((float) newWidth)/width; 
    float scaleHeight = ((float) newHeight)/height; 

    // createa matrix for the manipulation 
    Matrix matrix = new Matrix(); 
    // resize the bit map 
    matrix.postScale(scaleWidth, scaleHeight); 
    // rotate the Bitmap 
    matrix.postRotate(45); 

    // recreate the new Bitmap 
    Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, 
         width, height, matrix, true); 

    // make a Drawable from Bitmap to allow to set the BitMap 
    // to the ImageView, ImageButton or what ever 
    BitmapDrawable bmd = new BitmapDrawable(resizedBitmap); 

    ImageView imageView = new ImageView(this); 

    // set the Drawable on the ImageView 
    imageView.setImageDrawable(bmd); 

    // center the Image 
    imageView.setScaleType(ScaleType.CENTER); 

    // add ImageView to the Layout 
    linLayout.addView(imageView, 
      new LinearLayout.LayoutParams(
        LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT 
      ) 
    ); 

    // set LinearLayout as ContentView 
    setContentView(linLayout); 
} 
} 

è necessario utilizzare la matrice per ruotare l'immagine guardare le linee

matrix.postRotate(45); - 

questo ruotare l'immagine di 45 gradi

Spero che questo ti aiuti ... thx

+0

Penso che tu abbia digitato 'bitmapOrg.width()' per 'bitmapOrg.getWidth()'. –

1

Utilizzare il seguente codice. ha funzionato per me

rotazione float = 30,0f;

 Bitmap bitmap = your bitmap 
    Rect rect = new Rect(100,100,bitmap.width, bitmap.height); 
    Matrix matrix = new Matrix(); 
    float px = rect.exactCenterX(); 
    float py = rect.exactCenterY(); 
    matrix.postTranslate(-bitmap.getWidth()/2, -bitmap.getHeight()/2); 
    matrix.postRotate(rotation); 
    matrix.postTranslate(px, py); 
    canvas.drawBitmap(bitmap, matrix, null); 
    matrix.reset(); 
    invalidate(); 
+0

Questo è bello. Ho appena apportato una piccola modifica per farlo partire da 0,0 – MSaudi

+0

Sicuro. Rect rect = new Rect (0, 0, bitmap.width, bitmap.height); – Sakthi

1

Questo è l'unico che ha funzionato per me senza problemi.

private Bitmap rotateBitmap(Bitmap bitmap, int rotationAngleDegree){ 

     int w = bitmap.getWidth(); 
     int h = bitmap.getHeight(); 

     int 

newW=w, newH=h; 
    if (rotationAngleDegree==90 || rotationAngleDegree==270){ 
     newW = h; 
     newH = w; 
    } 
    Bitmap rotatedBitmap = Bitmap.createBitmap(newW,newH, bitmap.getConfig()); 
    Canvas canvas = new Canvas(rotatedBitmap); 

    Rect rect = new Rect(0,0,newW, newH); 
    Matrix matrix = new Matrix(); 
    float px = rect.exactCenterX(); 
    float py = rect.exactCenterY(); 
    matrix.postTranslate(-bitmap.getWidth()/2, -bitmap.getHeight()/2); 
    matrix.postRotate(rotationAngleDegree); 
    matrix.postTranslate(px, py); 
    canvas.drawBitmap(bitmap, matrix, new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG | Paint.FILTER_BITMAP_FLAG)); 
    matrix.reset(); 

    return rotatedBitmap; 
}