2012-04-02 18 views
10

Ho bisogno di creare una bussola su un'app su cui sto lavorando. Così ho provato a creare una nuova vista chiamata CompassView che estende sostanzialmente la visualizzazione di immagini, mostra una bitmap che ha puntato su est ovest nord sud, utilizza i sensori per trovare i gradi a cui punta il telefono e ruota l'immagine di conseguenza in modo che possa creare una vera bussola. Ma il problema è che se provo a ruotare l'immagine ad alcuni angoli come 45 gradi, si restringe. Ecco alcune immagini per spiegarlo meglio.Ruota immagine senza restringere su Android

This is normal

This is shrinked

Come si può vedere, la seconda immagine è rimpiccioliti giù quando provo a ruotare attorno 45. Quello che voglio fare è questo: this

Ecco il codice attualmente in uso:

 Bitmap bMap = BitmapFactory.decodeResource(getResources(), 
       R.drawable.compass); 
     Matrix xMatrix = new Matrix(); 
     xMatrix.reset(); 
     xMatrix.postRotate(360-mValue, 75, 75); //This is 75 because 150 is the image width 
     Bitmap bMapRotate = Bitmap.createBitmap(bMap, 0, 0, 
       bMap.getWidth(), bMap.getHeight(), xMatrix, true); 
     setImageBitmap(bMapRotate); 

Qualsiasi aiuto sarebbe opportuno ated. Grazie

EDIT: (SOLUTION) Ho finalmente funzionato grazie alla risposta accettata. Ecco il codice che sto usando per chi vuole sapere come funzionava:

RotateAnimation rAnimAntiClockWise = new RotateAnimation(
        360 - mValue, 360 - event.values[0], 
        Animation.RELATIVE_TO_SELF, 0.5f, 
        Animation.RELATIVE_TO_SELF, 0.5f); 
//mValue is the angle in degrees and i subtracted it from 360 to make it anticlockwise, and event.values[0] is the same thing as mValue 
rAnimAntiClockWise.setFillAfter(true); 
rAnimAntiClockWise.setInterpolator(new LinearInterpolator()); 
rAnimAntiClockWise.setDuration(0); 
startAnimation(rAnimAntiClockWise); 

risposta

4

È possibile utilizzare un trucco alternativo che funzionerà allo stesso modo della rotazione e non ridimensiona l'immagine. Realmente ruoto l'immagine con un angolo di 45 gradi e rimango le modifiche dopo l'animazione.

rAnimAntiClockWise = new RotateAnimation(0.0f, 45.0f, 
       Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 
       0.5f); 
     rAnimAntiClockWise.setFillAfter(true); 
     rAnimAntiClockWise.setInterpolator(new LinearInterpolator());  
      bitmap = BitmapFactory.decodeResource(getResources(), 
        R.drawable.rotate);  
     rAnimAntiClockWise.setDuration(100); 
     img_rotate.startAnimation(rAnimAntiClockWise); 
+0

grazie mille, non sapevo che questo potrebbe essere acheived da rotateanimazione. Ho solo dovuto modificare alcune parti del codice per farlo funzionare – KSubedi

3

Il problema è che la nuova immagine è in realtà più grande, a causa di angoli della fonte "spuntano", e così il la vista è ridimensionata per adattarsi.

alcuni approcci possibili:

  1. Dopo che il codice di cui sopra, chiamare Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height), copiando la regione centrale della dimensione corretta. Facile dato il codice che hai, ma crea una bitmap intermedia inutile.

  2. Invece di dare l'immagine di trasformare e di origine per CreateBitmap, basta creare una bitmap mutabile della dimensione corretta, avvolgerla in una tela, e dire al Canvas per rendere l'immagine ruotata.

    bMapRotate = Bitmap.createBitmap(
        bMap.getWidth(), bMap.getHeight(), bMap.getConfig()); 
    Canvas canvasRotate = new Canvas(bMap); 
    canvasRotate.drawBitmap(bMap, xMatrix, paint); // any opaque Paint should do 
    
  3. mantenere il codice che hai, ma dire al fine di ritagliare piuttosto che scala durante il rendering.

+0

grazie per avermi permesso di conoscere i modi .. sapevo che la mia alternative, ma ho solo non ha ancora sapere come realizzarle in quanto io sono nuovo alla vista di tela e personalizzati – KSubedi