Autore Topic: Ruotare freccia in una view  (Letto 529 volte)

Offline brastolfo

  • Utente junior
  • **
  • Post: 77
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Htc Nexus One
  • Sistema operativo:
    Vista
Ruotare freccia in una view
« il: 27 Gennaio 2011, 16:12:42 CET »
0
Ciao a tutti,
ho creato una classe Compass che sfruttando le canvas mi disegna sulla mia view una freccia che si dovrebbe orientare in base al gps.
Il problema a questo punto è come faccio a ruotare questa freccia in modo dinamico sulla mia view?
Le classi sono le seguenti:
Codice (Java): [Seleziona]
public class Compass extends View {
        private Paint _paint;
        private Path mPath=new Path();
        public Compass(Context context) {
                super(context);
                mPath.moveTo(0, -50);
        mPath.lineTo(-20, 60);
        mPath.lineTo(0, 50);
        mPath.lineTo(20, 60);
        mPath.close();
                _paint=new Paint();
        }
        public Compass(Context context, AttributeSet attrs) {
                super(context,attrs);
                mPath.moveTo(0, -50);
        mPath.lineTo(-20, 60);
        mPath.lineTo(0, 50);
        mPath.lineTo(20, 60);
        mPath.close();
                _paint=new Paint();
        }
        @Override
        protected void onDraw(Canvas canvas) {         
                // Coloro lo sfondo su cui disegnare
                canvas.drawColor(Color.TRANSPARENT);
                // Attivo l'Antialiasing
                _paint.setAntiAlias(true);
                // Setto il colore con il quale andremo a disegnare sul Canvas
                _paint.setColor(Color.RED);
                // Imposto lo stile da utilizzare
                _paint.setStyle(Paint.Style.FILL);             
                int w = canvas.getWidth();
        int h = canvas.getHeight();
        int cx = w/3;
        int cy = h/3;
        canvas.translate(cx, cy);

        canvas.drawPath(mPath,_paint);    
        }
}
Codice (Java): [Seleziona]
public class NavigaActivity extends Activity {
        // Otteniamo i riferimenti alle coordinate della posizione da raggiungere
        public double lon;
        public double lat;
        // Otteniamo i riferimenti alla mia posizione attuale
        double geoLat;
        double geoLon;
        // Otteniamo i riferimenti alla Text View del mio layout
        private TextView latitudinePos;
    private TextView longitudinePos;
        // Otteniamo il riferimento al LocationManager
    LocationManager locationManager;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {        
        super.onCreate(savedInstanceState);
        setContentView(R.layout.naviga);
        Compass compass=(Compass)findViewById(R.id.compass);  
        Intent intent=getIntent();
        String pack=getPackageName();
        lat=intent.getDoubleExtra(pack+"lat",-1);
        lon=intent.getDoubleExtra(pack+"lon",-1);
        latitudinePos=(TextView)this.findViewById(R.id.tvLatitudine);
        longitudinePos=(TextView)this.findViewById(R.id.tvLongitudine);
        latitudinePos.setText(Double.toString(lat));
        longitudinePos.setText(Double.toString(lon));
        // Il LocationManager è uno strumento con cui è possibile ricevere notifiche sulla
        // posizione del dispositivo. Otteniamo il riferimento al Location Manager        
        locationManager=(LocationManager) getSystemService(Context.LOCATION_SERVICE);          
        // Verifichiamo se il GPS è abilitato altrimenti avvisiamo l'utente
        if(!locationManager.isProviderEnabled("gps")){
                Toast.makeText(this, "GPS è attualmente disabilitato. E' possibile abilitarlo dal menu impostazioni.", Toast.LENGTH_LONG).show();
        }        
        // Registriamo il locationListener al provider GPS
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
       
    }
    // Per ricevere la notifica delle variazioni di posizione è necessario creare l'implementazione
    // dell'interfaccia LocationListener e registrarsi a esso come ascoltatori.
    // Registriamo il LocationListener al provider GPS              
    LocationListener locationListener = new LocationListener() {
   
        // Invochiamo il seguente metodo in corrispondenza di una variazione della posizione
        // Le informazioni sono incapsulate in un oggetto di tipo Location
        public void onLocationChanged(Location location){
                // Aggiorna la location
                geoLat = location.getLatitude()*1E6;
                geoLon = location.getLongitude()*1E6;
        }        
        // Messaggio temporaneo che notifica abilitazione provider GPS
        public void onProviderEnabled(String provider) {
                Toast.makeText(NavigaActivity.this,"onProviderEnabled "+provider, Toast.LENGTH_SHORT).show();
        }
        // Messaggio temporaneo che notifica disabilitazione provider GPS
        public void onProviderDisabled(String provider) {
                Toast.makeText(NavigaActivity.this,"onProviderDisabled "+provider, Toast.LENGTH_SHORT).show();
        }        
        // Notifica sulle variazioni di stato del servizio
        public void onStatusChanged(String provider, int status,Bundle extras) {
                Toast.makeText(NavigaActivity.this,"onStatusChanged "+provider+" status: "+status, Toast.LENGTH_SHORT).show();
        }      
    };
    // Mi avverte quando il dispositivo si avvicina ad una particolare Location(forse da inserire nel listener)
    public void addProximityAlert() {
   
    }
}
Ho visto che c'è un metodo delle canvas rotate() che mi permette di ruotarla ma come faccio a richiamarlo in NavigaActivity per poi ruotare la mia freccia in maniera dinamica in base alle coordinate che ricevo dal GPS?
Grazie e scusate se non sono stato molto chiaro..

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +203
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Ruotare freccia in una view
« Risposta #1 il: 27 Gennaio 2011, 16:21:58 CET »
+1
1.crei campo degree nella Compass, che all'inizio vale 0, o puoi passargli il valore nel costruttore.
2.includi la chiamata rotate con quel valore nella onDraw.
3.crei un metodo nella Compass che assegna un valore al campo degree e successivamente chiama invalidate() => in questo modo onDraw viene richiamata, il valore di degree è cambiato. quindi....
4.chiami il metodo che hai creato dalla tua activity, passando il valore che vuoi.

Offline brastolfo

  • Utente junior
  • **
  • Post: 77
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Htc Nexus One
  • Sistema operativo:
    Vista
Re:Ruotare freccia in una view
« Risposta #2 il: 27 Gennaio 2011, 16:30:42 CET »
0
1.crei campo degree nella Compass, che all'inizio vale 0, o puoi passargli il valore nel costruttore.
2.includi la chiamata rotate con quel valore nella onDraw.
3.crei un metodo nella Compass che assegna un valore al campo degree e successivamente chiama invalidate() => in questo modo onDraw viene richiamata, il valore di degree è cambiato. quindi....
4.chiami il metodo che hai creato dalla tua activity, passando il valore che vuoi.
Grazie mille della risposta..sei stato molto chiaro ed esaustivo adesso ci provo e ti faccio sapere !!  :-)