2012-04-02 5 views
10

Je dois créer une boussole sur une application sur laquelle je travaille. J'ai donc essayé de créer une nouvelle vue appelée CompassView qui étend essentiellement imageview, montre un bitmap qui a est pointé vers l'ouest, utilise des capteurs pour trouver les degrés le téléphone est pointé, et tourne l'image en conséquence de sorte qu'il créerait une boussole réelle. Mais le problème est que si j'essaie de faire pivoter l'image à certains angles de 45 degrés, elle rétrécit. Voici quelques images pour mieux l'expliquer.Faire pivoter l'image sans rétrécir sur Android

This is normal

This is shrinked

Comme vous pouvez le voir, la deuxième image est rétreint vers le bas lorsque je tente de tourner autour de 45. Ce que je veux faire est la suivante: this

Voici le code que j'utilise actuellement:

 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); 

Toute aide serait appréciée até. THanks

EDIT: (SOLUTION) Je l'ai finalement fait fonctionner grâce à la réponse acceptée. Voici le code que je utilise pour tous ceux qui veulent savoir comment cela a fonctionné:

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); 

Répondre

4

Vous pouvez utiliser une astuce alternative qui fonctionnera de la même manière que la rotation et ne redimensionne pas l'image. En fait, je fais tourner l'image avec un angle de 45 degrés et reste les changements après l'animation.

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

merci beaucoup, je ne savais pas que cela pourrait être acheived de rotateanimation. je devais juste modifier certaines parties du code pour le faire fonctionner – KSubedi

3

Le problème est que votre nouvelle image est en fait plus grande, en raison des coins de la source « qui sort », et donc le La vue est mise à l'échelle pour s'adapter.

Quelques approches possibles:

  1. Une fois le code ci-dessus, appelez Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height), copie la région centrale de la bonne taille. Facile étant donné le code que vous avez, mais crée un bitmap intermédiaire inutile. Au lieu de donner la transformation et l'image source à createBitmap, il suffit de créer une image bitmap mutable de la bonne taille, de l'emboîter dans un canevas et d'indiquer au canevas de rendre l'image pivotée.

    bMapRotate = Bitmap.createBitmap(
        bMap.getWidth(), bMap.getHeight(), bMap.getConfig()); 
    Canvas canvasRotate = new Canvas(bMap); 
    canvasRotate.drawBitmap(bMap, xMatrix, paint); // any opaque Paint should do 
    
  2. Gardez le code que vous avez, mais dire la vue de recadrer plutôt que l'échelle lors du rendu.

+0

Merci de me laisser connaître les moyens .. Je savais que mes alternatives mais je ne savaient pas comment les mettre en œuvre depuis que je suis nouveau sur toile et vues personnalisées – KSubedi

Questions connexes