La rotation d'une ImageView comme une boussole (avec le “pôle nord” jeu d'ailleurs)

Je suis perplexe quant à la façon de mettre en œuvre une sorte de "boussole", c'est à dire une boussole qui pointe vers un roulement spécifique au lieu de la norme "pôle nord"... malheureusement, ma tentative a sortir de mal (n'a pas de point à l'appui). Il est également connecté avec l'accélérateur pour être en mesure d'ajuster de façon dynamique, en fonction du sens dans lequel l'utilisateur est en train de tourner.

Voici ma tentative (le onSensorChanged()-méthode qui met à jour la flèche):

public void onSensorChanged( SensorEvent event ) {
//If we don't have a Location, we break out
if ( LocationObj == null ) return;
float azimuth = event.values[0];
float baseAzimuth = azimuth;
GeomagneticField geoField = new GeomagneticField( Double
.valueOf( LocationObj.getLatitude() ).floatValue(), Double
.valueOf( LocationObj.getLongitude() ).floatValue(),
Double.valueOf( LocationObj.getAltitude() ).floatValue(),
System.currentTimeMillis() );
azimuth += geoField.getDeclination(); //converts magnetic north into true north
//Correct the azimuth
azimuth = azimuth % 360;
//This is where we choose to point it
float direction = azimuth + LocationObj.bearingTo( destinationObj );
rotateImageView( arrow, R.drawable.arrow, direction );
//Set the field
if( baseAzimuth > 0 && baseAzimuth < 45 ) fieldBearing.setText("S");
else if( baseAzimuth >= 45 && baseAzimuth < 90 ) fieldBearing.setText("SW");
else if( baseAzimuth > 0 && baseAzimuth < 135 ) fieldBearing.setText("W");
else if( baseAzimuth > 0 && baseAzimuth < 180 ) fieldBearing.setText("NW");
else if( baseAzimuth > 0 && baseAzimuth < 225 ) fieldBearing.setText("N");
else if( baseAzimuth > 0 && baseAzimuth < 270 ) fieldBearing.setText("NE");
else if( baseAzimuth > 0 && baseAzimuth < 315 ) fieldBearing.setText("E");
else if( baseAzimuth > 0 && baseAzimuth < 360 ) fieldBearing.setText("SE");
else fieldBearing.setText("?"); 
}

Et voici la méthode qui fait pivoter l'ImageView (rotateImageView()):

private void rotateImageView( ImageView imageView, int drawable, float rotate ) {
//Decode the drawable into a bitmap
Bitmap bitmapOrg = BitmapFactory.decodeResource( getResources(),
drawable );
//Get the width/height of the drawable
DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm);
int width = bitmapOrg.getWidth(), height = bitmapOrg.getHeight();
//Initialize a new Matrix
Matrix matrix = new Matrix();
//Decide on how much to rotate
rotate = rotate % 360;
//Actually rotate the image
matrix.postRotate( rotate, width, height );
//recreate the new Bitmap via a couple conditions
Bitmap rotatedBitmap = Bitmap.createBitmap( bitmapOrg, 0, 0, width, height, matrix, true );
//BitmapDrawable bmd = new BitmapDrawable( rotatedBitmap );
//imageView.setImageBitmap( rotatedBitmap );
imageView.setImageDrawable(new BitmapDrawable(getResources(), rotatedBitmap));
imageView.setScaleType( ScaleType.CENTER );
}

Toute aide serait grandement apprécié, car je ne sais pas trop comment procéder. Les "lectures" je suis de tout essayer est un peu inexact et des points dans la mauvaise direction. Suis-je en train de faire quelque chose, ou ai-je juste avoir une vraiment de la mauvaise exécution de test?

  • Puis-je vous demander si cette méthode de mise à jour de l'image est trop CPU-costy? Comme quand je suis sur le code, l'écran est très lent et je ne peux même pas un zoom avant ou arrière.
  • Je n'ai pas remarqué quoi que ce soit, et cela faisait presque deux ans en arrière. Peut-être la combinaison de choses? 🙂
InformationsquelleAutor karllindmark | 2011-11-02