Autore Topic: Bussola (compass) accelerometro e magnetometro  (Letto 3356 volte)

Offline aury

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Sony Experia Mini Pro
  • Sistema operativo:
    Windows 7
Bussola (compass) accelerometro e magnetometro
« il: 12 Febbraio 2014, 22:38:06 CET »
0
Ragazzi ho un problema che devo urgentemente risolvere.

Ho trovato su internet due esempi di Bussola funzionanti che però hanno alcuni metodi deprecati:

Esempio 1

In questo caso TYPE_ORIENTATION è deprecato.
Chiedo una mano per modificare questo codice in modo tale di trovare un'alternativa a TYPE_ORIENTATION, mi potete aiutare ?

Codice (Java): [Seleziona]
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.TextView;

public class Bussola extends Activity implements SensorEventListener {

    // define the display assembly compass picture
    private ImageView image;

    // record the compass picture angle turned
    private float currentDegree = 0f;

    // device sensor manager
    private SensorManager mSensorManager;

    TextView tvHeading;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.bussola);

        //
        image = (ImageView) findViewById(R.id.imageViewCompass);

        // TextView that will tell the user what degree is he heading
        tvHeading = (TextView) findViewById(R.id.tvHeading);

        // initialize your android device sensor capabilities
        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    }

    @Override
    protected void onResume() {
        super.onResume();

        // for the system's orientation sensor registered listeners
        mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
                SensorManager.SENSOR_DELAY_GAME);
    }

    @Override
    protected void onPause() {
        super.onPause();

        // to stop the listener and save battery
        mSensorManager.unregisterListener(this);
    }

    @Override
    public void onSensorChanged(SensorEvent event) {

        // get the angle around the z-axis rotated
        float degree = Math.round(event.values[0]);

        tvHeading.setText("Heading: " + Float.toString(degree) + " degrees");

        // create a rotation animation (reverse turn degree degrees)
        RotateAnimation ra = new RotateAnimation(
                currentDegree,
                -degree,
                Animation.RELATIVE_TO_SELF, 0.5f,
                Animation.RELATIVE_TO_SELF,
                0.5f);

        // how long the animation will take place
        ra.setDuration(210);

        // set the animation after the end of the reservation status
        ra.setFillAfter(true);

        // Start the animation
        image.startAnimation(ra);
        currentDegree = -degree;

    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // not in use
    }
}

Codice (XML): [Seleziona]
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#fff" >

    <TextView
      android:id="@+id/tvHeading"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_centerHorizontal="true"
      android:layout_marginBottom="40dp"
      android:layout_marginTop="20dp"
      android:text="Heading: 0.0" />

    <ImageView
      android:id="@+id/imageViewCompass"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_below="@+id/tvHeading"
      android:layout_centerHorizontal="true"
      android:src="@drawable/bussola" />

</RelativeLayout>




Post unito: 12 Febbraio 2014, 22:41:55 CET
Esempio 2

SensorListener è deprecato.
Mi potete aiutare a modificare questo codice in modo tale da evitare metodi deprecati?

Codice (Java): [Seleziona]
import android.app.Activity;
import android.hardware.SensorListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

@SuppressWarnings("deprecation")
public class Bussola extends Activity implements SensorListener {
        SensorManager sensorManager;
        static final int sensor = SensorManager.SENSOR_ORIENTATION;
        ImmagineBussola ImmagineBussola;

       
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);

                getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                                WindowManager.LayoutParams.FLAG_FULLSCREEN);
                requestWindowFeature(Window.FEATURE_NO_TITLE);

                ImmagineBussola = new ImmagineBussola(this);

                setContentView(ImmagineBussola);

                sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        }

        @Override
        public void onResume() {
                super.onResume();
                sensorManager.registerListener(this, sensor);
        }

        @Override
        public void onPause() {
                super.onPause();
                sensorManager.unregisterListener(this);
        }

        public void onAccuracyChanged(int sensor, int accuracy) {
        }

        public void onSensorChanged(int sensor, float[] values) {
                if (sensor != Bussola.sensor)
                        return;
                int orientation = (int) values[0];
                ImmagineBussola.setDirection(orientation);
        }
}




import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.widget.ImageView;

public class ImmagineBussola extends ImageView {
         Paint mydPaint;
          int myddirection = 0;

          public ImmagineBussola(Context context) {
            super(context);

            mydPaint = new Paint();
            mydPaint.setColor(Color.WHITE);
            mydPaint.setStrokeWidth(2);
            mydPaint.setStyle(Style.STROKE);

            this.setImageResource(R.drawable.bussola);
          }

          @Override
          public void onDraw(Canvas canvas) {
            int height = this.getHeight();
            int width = this.getWidth();

            canvas.rotate(myddirection, width / 2, height / 2);
            super.onDraw(canvas);
          }

          public void setDirection(int direction) {
            this.myddirection = direction;
            this.invalidate();
          }

        }

Codice (Java): [Seleziona]
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.widget.ImageView;

public class ImmagineBussola extends ImageView {
         Paint mydPaint;
          int myddirection = 0;

          public ImmagineBussola(Context context) {
            super(context);

            mydPaint = new Paint();
            mydPaint.setColor(Color.WHITE);
            mydPaint.setStrokeWidth(2);
            mydPaint.setStyle(Style.STROKE);

            this.setImageResource(R.drawable.bussola);
          }

          @Override
          public void onDraw(Canvas canvas) {
            int height = this.getHeight();
            int width = this.getWidth();

            canvas.rotate(myddirection, width / 2, height / 2);
            super.onDraw(canvas);
          }

          public void setDirection(int direction) {
            this.myddirection = direction;
            this.invalidate();
          }

        }
« Ultima modifica: 12 Febbraio 2014, 22:41:55 CET da aury, Reason: Merged DoublePost »

Offline GuiZ

  • Nuovo arrivato
  • *
  • Post: 26
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    LG OPTIMUS ONE LP-500
  • Play Store ID:
    Geek-Blog.it
  • Sistema operativo:
    Ubuntu 10.10
Re:Bussola (compass) accelerometro e magnetometro
« Risposta #1 il: 13 Febbraio 2014, 09:49:00 CET »
0
Devi usare SensorEventListener come implementazione della MainActivity.
un esempio:

http://www.javacodegeeks.com/2013/09/android-compass-code-example.html

E' molto simile al tuo utilizzo!

Offline aury

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Sony Experia Mini Pro
  • Sistema operativo:
    Windows 7
Re:Bussola (compass) accelerometro e magnetometro
« Risposta #2 il: 13 Febbraio 2014, 09:52:35 CET »
0

Post unito: [time]13 Febbraio 2014, 09:58:55 CET[/time]
Ragazzi ho provato a utilizzare SensorEventListener ma quando avvio la mia applicazione la bussola non ruota ma si muove senza fermarsi mai.

Potete dirmi che cosa ho sbagliato nel codice ?

Grazie in anticipo

Codice (Java): [Seleziona]
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.TextView;

public class Bussola extends Activity implements SensorEventListener {

    // define the display assembly compass picture
    private ImageView image;

    // record the compass picture angle turned
    private float currentDegree = 0f;

    // device sensor manager
    private SensorManager mSensorManager;

    TextView tvHeading;
   
   
    private float[] gravity = new float[3];
    private float[] geomag = new float[3];
    private float[] rotationMatrix;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.bussola);

        //
        image = (ImageView) findViewById(R.id.imageViewCompass);

        // TextView that will tell the user what degree is he heading
        tvHeading = (TextView) findViewById(R.id.tvHeading);

        // initialize your android device sensor capabilities
        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    }

    @Override
    protected void onResume() {
       

        super.onResume();
        mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_GAME );
        mSensorManager.registerListener( this,
          mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
          SensorManager.SENSOR_DELAY_GAME );
    }

    @Override
    protected void onPause() {
        super.onPause();

        // to stop the listener and save battery
        mSensorManager.unregisterListener(this);
       
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        synchronized (this) {
            Log.i("aa", event.values[0]+"");
        // get the angle around the z-axis rotated
        float degree = Math.round(event.values[0]);

        tvHeading.setText("Heading: " + Float.toString(degree) + " degrees");

        // create a rotation animation (reverse turn degree degrees)
        RotateAnimation ra = new RotateAnimation(
                currentDegree,
                -degree,
                Animation.RELATIVE_TO_SELF, 0.5f,
                Animation.RELATIVE_TO_SELF,
                0.5f);

        // how long the animation will take place
        ra.setDuration(210);

        // set the animation after the end of the reservation status
        ra.setFillAfter(true);

        // Start the animation
        image.startAnimation(ra);
        currentDegree = -degree;
        }
    }      

Codice (XML): [Seleziona]
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="#fff" >

    <TextView
       android:id="@+id/tvHeading"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerHorizontal="true"
       android:layout_marginBottom="40dp"
       android:layout_marginTop="20dp"
       android:text="Heading: 0.0" />

    <ImageView
       android:id="@+id/imageViewCompass"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_below="@+id/tvHeading"
       android:layout_centerHorizontal="true"
       android:src="@drawable/bussola" />

</RelativeLayout>
« Ultima modifica: 13 Febbraio 2014, 10:00:38 CET da aury »

Offline GuiZ

  • Nuovo arrivato
  • *
  • Post: 26
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    LG OPTIMUS ONE LP-500
  • Play Store ID:
    Geek-Blog.it
  • Sistema operativo:
    Ubuntu 10.10
Re:Bussola (compass) accelerometro e magnetometro
« Risposta #3 il: 13 Febbraio 2014, 10:00:25 CET »
0
In questo esempio TYPE_ORIENTATION è deprecato

Cambi solo quello :)!


Ma devi usare SensorEventListener! In ogni caso non trovi mai un esempio cerca come fare le singole cose. Parti dall'esempio originale e pian piano ti modifichi tutto.
« Ultima modifica: 13 Febbraio 2014, 10:02:27 CET da GuiZ »

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Bussola (compass) accelerometro e magnetometro
« Risposta #4 il: 13 Febbraio 2014, 10:01:30 CET »
0
Googlando dicono di usare magnetometro e accellerometro...

Coding for Android: Using orientation sensors: Simple Compass sample

Offline aury

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Sony Experia Mini Pro
  • Sistema operativo:
    Windows 7
Re:Bussola (compass) accelerometro e magnetometro
« Risposta #5 il: 13 Febbraio 2014, 10:01:50 CET »
0
Cambi solo quello :)!

Display | Android Developers

Ma devi usare SensorEventListener! In ogni caso non trovi mai un esempio cerca come fare le singole cose. Parti dall'esempio originale e pian piano ti modifichi tutto.

Ho appena inserito il codice da me modificato ma sembra che non funzioni

Post unito: 13 Febbraio 2014, 10:04:33 CET
Googlando dicono di usare magnetometro e accellerometro...

Coding for Android: Using orientation sensors: Simple Compass sample

Ho già trovato quel codice e sembra che non mi funzioni
« Ultima modifica: 13 Febbraio 2014, 10:04:33 CET da aury, Reason: Merged DoublePost »

Offline GuiZ

  • Nuovo arrivato
  • *
  • Post: 26
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    LG OPTIMUS ONE LP-500
  • Play Store ID:
    Geek-Blog.it
  • Sistema operativo:
    Ubuntu 10.10
Re:Bussola (compass) accelerometro e magnetometro
« Risposta #6 il: 13 Febbraio 2014, 10:05:57 CET »
0
Mmm breakpoint?

Provo con Android

SI impazzisce metto due breakpoint e vediamo che succede
« Ultima modifica: 13 Febbraio 2014, 10:15:18 CET da GuiZ »

Offline aury

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Sony Experia Mini Pro
  • Sistema operativo:
    Windows 7
Re:Bussola (compass) accelerometro e magnetometro
« Risposta #7 il: 13 Febbraio 2014, 10:15:58 CET »
0
Mmm breakpoint?

Provo con Android

SI impazzisce metto due breakpoint e vediamo che succede

Grazie

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Bussola (compass) accelerometro e magnetometro
« Risposta #8 il: 13 Febbraio 2014, 10:46:12 CET »
0
Scusa ma non vorrei dire stupidate.
Se ogni volta lanci un animazione di rotazione di, dicamo, 90°, penso sia normale che ruoti e non si fermi più.

Io ho fatto un applicazione con una lancetta ed ho usato un approccio diverso.

Disegno due ImageView sovrapposte (sfondo e lancetta) e alla lancetta applico una matrice di rotazione.

Se ti può servire questo è il mio codice:

Codice: [Seleziona]
    private void setHandRotation( float angle )
    {
        mBackgroundView = (ImageView)findViewById(R.id.barom_background);
        mBarometerFrame = (FrameLayout)findViewById(R.id.barometer_frame);

        final float handWidth = (float)mHandView.getDrawable().getIntrinsicWidth();
        final float handHeight = (float)mHandView.getDrawable().getIntrinsicHeight();
        float frameHeight = mBarometerFrame.getHeight();
        float frameWidth = mBarometerFrame.getWidth();

        // Scale is calculated on background size, because hand has been drawn, centered, at same resolution
        // and background fit the barometer frame.
        float scale = ( frameHeight < frameWidth ) ?
                (frameHeight / (float)mBackgroundView.getDrawable().getIntrinsicHeight()) :
                (frameWidth / (float)mBackgroundView.getDrawable().getIntrinsicWidth());
        mHandMatrix.reset();
        mHandMatrix.postTranslate(-handWidth / 2.0f, -handHeight / 2.0f);
        mHandMatrix.postRotate((float) angle);
        mHandMatrix.postScale(scale, scale);
        mHandMatrix.postTranslate(frameWidth / 2, frameHeight / 2);
        mHandView.setImageMatrix(mHandMatrix);
        mHandView.setVisibility(View.VISIBLE);
    }


Offline aury

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Sony Experia Mini Pro
  • Sistema operativo:
    Windows 7
Re:Bussola (compass) accelerometro e magnetometro
« Risposta #9 il: 13 Febbraio 2014, 10:48:24 CET »
0
Scusa ma non vorrei dire stupidate.
Se ogni volta lanci un animazione di rotazione di, dicamo, 90°, penso sia normale che ruoti e non si fermi più.

Io ho fatto un applicazione con una lancetta ed ho usato un approccio diverso.

Disegno due ImageView sovrapposte (sfondo e lancetta) e alla lancetta applico una matrice di rotazione.

Se ti può servire questo è il mio codice:

Codice: [Seleziona]
    private void setHandRotation( float angle )
    {
        mBackgroundView = (ImageView)findViewById(R.id.barom_background);
        mBarometerFrame = (FrameLayout)findViewById(R.id.barometer_frame);

        final float handWidth = (float)mHandView.getDrawable().getIntrinsicWidth();
        final float handHeight = (float)mHandView.getDrawable().getIntrinsicHeight();
        float frameHeight = mBarometerFrame.getHeight();
        float frameWidth = mBarometerFrame.getWidth();

        // Scale is calculated on background size, because hand has been drawn, centered, at same resolution
        // and background fit the barometer frame.
        float scale = ( frameHeight < frameWidth ) ?
                (frameHeight / (float)mBackgroundView.getDrawable().getIntrinsicHeight()) :
                (frameWidth / (float)mBackgroundView.getDrawable().getIntrinsicWidth());
        mHandMatrix.reset();
        mHandMatrix.postTranslate(-handWidth / 2.0f, -handHeight / 2.0f);
        mHandMatrix.postRotate((float) angle);
        mHandMatrix.postScale(scale, scale);
        mHandMatrix.postTranslate(frameWidth / 2, frameHeight / 2);
        mHandView.setImageMatrix(mHandMatrix);
        mHandView.setVisibility(View.VISIBLE);
    }


Grazie allora ora provo a vedere il tuo codice e a cercare di provare a modificare il mio

Offline GuiZ

  • Nuovo arrivato
  • *
  • Post: 26
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    LG OPTIMUS ONE LP-500
  • Play Store ID:
    Geek-Blog.it
  • Sistema operativo:
    Ubuntu 10.10
Re:Bussola (compass) accelerometro e magnetometro
« Risposta #10 il: 13 Febbraio 2014, 10:51:10 CET »
0
Grazie

Codice: [Seleziona]
public class MainActivity extends Activity implements SensorEventListener {

    // define the display assembly compass picture
    private ImageView image;

    // record the compass picture angle turned
    private float currentDegree = 0f;

    // device sensor manager
    SensorManager mSensorManager;
    private Sensor sensorAccelerometer;
    private Sensor sensorMagneticField;

    TextView tvHeading;


    private float[] valuesAccelerometer;
    private float[] valuesMagneticField;

    private float[] matrixR;
    private float[] matrixI;
    private float[] matrixValues;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //
        image = (ImageView) findViewById(R.id.imageViewCompass);

        // TextView that will tell the user what degree is he heading
        tvHeading = (TextView) findViewById(R.id.tvHeading);

        // initialize your android device sensor capabilities
        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        sensorAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorMagneticField = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

        valuesAccelerometer = new float[3];
        valuesMagneticField = new float[3];

        matrixR = new float[9];
        matrixI = new float[9];
        matrixValues = new float[3];
    }

    @Override
    protected void onResume() {

        mSensorManager.registerListener(this,
                sensorAccelerometer,
                SensorManager.SENSOR_DELAY_NORMAL);
        mSensorManager.registerListener(this,
                sensorMagneticField,
                SensorManager.SENSOR_DELAY_NORMAL);
        super.onResume();

        /*
        mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_GAME );
        mSensorManager.registerListener( this,
                mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
                SensorManager.SENSOR_DELAY_GAME );
                */
    }

    @Override
    protected void onPause() {
        super.onPause();

        mSensorManager.unregisterListener(this,
                sensorAccelerometer);
        mSensorManager.unregisterListener(this,
                sensorMagneticField);
        super.onPause();

    }

    @Override
    public void onSensorChanged(SensorEvent event) {


        switch(event.sensor.getType()){
            case Sensor.TYPE_ACCELEROMETER:
                for(int i =0; i < 3; i++){
                    valuesAccelerometer[i] = event.values[i];
                }
                break;
            case Sensor.TYPE_MAGNETIC_FIELD:
                for(int i =0; i < 3; i++){
                    valuesMagneticField[i] = event.values[i];
                }
                break;
        }

        boolean success = SensorManager.getRotationMatrix(
                matrixR,
                matrixI,
                valuesAccelerometer,
                valuesMagneticField);

        if(success){
            SensorManager.getOrientation(matrixR, matrixValues);

            double azimuth = Math.toDegrees(matrixValues[0]);
            double pitch = Math.toDegrees(matrixValues[1]);
            double roll = Math.toDegrees(matrixValues[2]);

            /*
            readingAzimuth.setText("Azimuth: " + String.valueOf(azimuth));
            readingPitch.setText("Pitch: " + String.valueOf(pitch));
            readingRoll.setText("Roll: " + String.valueOf(roll));

            myCompass.update(matrixValues[0]);

*/
           
            // QUI BISOGNA CONVERTIRE IN GRADI
           
            float degree = Math.round(matrixValues[0]);

            tvHeading.setText("Heading: " + Float.toString(degree) + " degrees");

            // create a rotation animation (reverse turn degree degrees)
            RotateAnimation ra = new RotateAnimation(
                    currentDegree,
                    -degree,
                    Animation.RELATIVE_TO_SELF, 0.5f,
                    Animation.RELATIVE_TO_SELF,
                    0.5f);

            // how long the animation will take place
            ra.setDuration(210);

            // set the animation after the end of the reservation status
            ra.setFillAfter(true);

            // Start the animation
            image.startAnimation(ra);
            currentDegree = -degree;

        }
    }

    @Override
   public void onAccuracyChanged(Sensor sensor, int accuracy) {
       // not in use
   }
 }

Questo dovrebbe andare...sto cercando di calcolare i gradi dove c'è il commento:

            // QUI BISOGNA CONVERTIRE IN GRADI

bisogna convertire Azimuth Pitch e roll in gradi da passare all'animazione.

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Bussola (compass) accelerometro e magnetometro
« Risposta #11 il: 13 Febbraio 2014, 10:55:40 CET »
0
Ehm... mi son reso conto che il codice che ti ho dato è solo per impostare la posizione... non gestisce l'animazione.

In effetti l'animazione la gestisco in modo di avere accelerazione, rallentamento ed inerzia.
Giusto per vedere cosa intendo l'applicazione è https://play.google.com/store/apps/details?id=com.arlabsmobile.barometerfree

Se vuoi ti posso far vedere il codice che gestisce l'animazione, ma è un po' pasticciato...

Ciao.


Offline aury

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Sony Experia Mini Pro
  • Sistema operativo:
    Windows 7
Re:Bussola (compass) accelerometro e magnetometro
« Risposta #12 il: 13 Febbraio 2014, 10:58:17 CET »
0
Codice: [Seleziona]
public class MainActivity extends Activity implements SensorEventListener {

    // define the display assembly compass picture
    private ImageView image;

    // record the compass picture angle turned
    private float currentDegree = 0f;

    // device sensor manager
    SensorManager mSensorManager;
    private Sensor sensorAccelerometer;
    private Sensor sensorMagneticField;

    TextView tvHeading;


    private float[] valuesAccelerometer;
    private float[] valuesMagneticField;

    private float[] matrixR;
    private float[] matrixI;
    private float[] matrixValues;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //
        image = (ImageView) findViewById(R.id.imageViewCompass);

        // TextView that will tell the user what degree is he heading
        tvHeading = (TextView) findViewById(R.id.tvHeading);

        // initialize your android device sensor capabilities
        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        sensorAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorMagneticField = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

        valuesAccelerometer = new float[3];
        valuesMagneticField = new float[3];

        matrixR = new float[9];
        matrixI = new float[9];
        matrixValues = new float[3];
    }

    @Override
    protected void onResume() {

        mSensorManager.registerListener(this,
                sensorAccelerometer,
                SensorManager.SENSOR_DELAY_NORMAL);
        mSensorManager.registerListener(this,
                sensorMagneticField,
                SensorManager.SENSOR_DELAY_NORMAL);
        super.onResume();

        /*
        mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_GAME );
        mSensorManager.registerListener( this,
                mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
                SensorManager.SENSOR_DELAY_GAME );
                */
    }

    @Override
    protected void onPause() {
        super.onPause();

        mSensorManager.unregisterListener(this,
                sensorAccelerometer);
        mSensorManager.unregisterListener(this,
                sensorMagneticField);
        super.onPause();

    }

    @Override
    public void onSensorChanged(SensorEvent event) {


        switch(event.sensor.getType()){
            case Sensor.TYPE_ACCELEROMETER:
                for(int i =0; i < 3; i++){
                    valuesAccelerometer[i] = event.values[i];
                }
                break;
            case Sensor.TYPE_MAGNETIC_FIELD:
                for(int i =0; i < 3; i++){
                    valuesMagneticField[i] = event.values[i];
                }
                break;
        }

        boolean success = SensorManager.getRotationMatrix(
                matrixR,
                matrixI,
                valuesAccelerometer,
                valuesMagneticField);

        if(success){
            SensorManager.getOrientation(matrixR, matrixValues);

            double azimuth = Math.toDegrees(matrixValues[0]);
            double pitch = Math.toDegrees(matrixValues[1]);
            double roll = Math.toDegrees(matrixValues[2]);

            /*
            readingAzimuth.setText("Azimuth: " + String.valueOf(azimuth));
            readingPitch.setText("Pitch: " + String.valueOf(pitch));
            readingRoll.setText("Roll: " + String.valueOf(roll));

            myCompass.update(matrixValues[0]);

*/
           
            // QUI BISOGNA CONVERTIRE IN GRADI
           
            float degree = Math.round(matrixValues[0]);

            tvHeading.setText("Heading: " + Float.toString(degree) + " degrees");

            // create a rotation animation (reverse turn degree degrees)
            RotateAnimation ra = new RotateAnimation(
                    currentDegree,
                    -degree,
                    Animation.RELATIVE_TO_SELF, 0.5f,
                    Animation.RELATIVE_TO_SELF,
                    0.5f);

            // how long the animation will take place
            ra.setDuration(210);

            // set the animation after the end of the reservation status
            ra.setFillAfter(true);

            // Start the animation
            image.startAnimation(ra);
            currentDegree = -degree;

        }
    }

    @Override
   public void onAccuracyChanged(Sensor sensor, int accuracy) {
       // not in use
   }
 }

Questo dovrebbe andare...sto cercando di calcolare i gradi dove c'è il commento:

            // QUI BISOGNA CONVERTIRE IN GRADI

bisogna convertire Azimuth Pitch e roll in gradi da passare all'animazione.

Grazie mille

Offline GuiZ

  • Nuovo arrivato
  • *
  • Post: 26
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    LG OPTIMUS ONE LP-500
  • Play Store ID:
    Geek-Blog.it
  • Sistema operativo:
    Ubuntu 10.10
Re:Bussola (compass) accelerometro e magnetometro
« Risposta #13 il: 13 Febbraio 2014, 11:03:01 CET »
0
Grazie mille

Codice: [Seleziona]
            Double azimuth = Math.toDegrees(matrixValues[0]);
            Double pitch = Math.toDegrees(matrixValues[1]);
            Double roll = Math.toDegrees(matrixValues[2]);

            /*
            readingAzimuth.setText("Azimuth: " + String.valueOf(azimuth));
            readingPitch.setText("Pitch: " + String.valueOf(pitch));
            readingRoll.setText("Roll: " + String.valueOf(roll));

            myCompass.update(matrixValues[0]);

*/

            // QUI BISOGNA CONVERTIRE IN GRADI

            float degree = azimuth.floatValue();

Se converto ignoramente l'azimuth ad un float succede qualcosa sull'asse Y. Si dovrebbe trovare un modo per convertire in gradi. Tu hai qualche idea matematicamente?

Offline aury

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Sony Experia Mini Pro
  • Sistema operativo:
    Windows 7
Re:Bussola (compass) accelerometro e magnetometro
« Risposta #14 il: 13 Febbraio 2014, 11:06:08 CET »
0
Codice: [Seleziona]
            Double azimuth = Math.toDegrees(matrixValues[0]);
            Double pitch = Math.toDegrees(matrixValues[1]);
            Double roll = Math.toDegrees(matrixValues[2]);

            /*
            readingAzimuth.setText("Azimuth: " + String.valueOf(azimuth));
            readingPitch.setText("Pitch: " + String.valueOf(pitch));
            readingRoll.setText("Roll: " + String.valueOf(roll));

            myCompass.update(matrixValues[0]);

*/

            // QUI BISOGNA CONVERTIRE IN GRADI

            float degree = azimuth.floatValue();

Se converto ignoramente l'azimuth ad un float succede qualcosa sull'asse Y. Si dovrebbe trovare un modo per convertire in gradi. Tu hai qualche idea matematicamente?

In questo momento non mi viene in mente in niente ora provo a vedere se trovo su internet qualcosa