Autore Topic: Problema Rotazione Oggetto Canvas  (Letto 2042 volte)

Offline cioppy

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: +3
    • giancarlo985
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S Plus
  • Play Store ID:
    Team Android
  • Sistema operativo:
    Linux Mint 12 - 64bit
Problema Rotazione Oggetto Canvas
« il: 12 Aprile 2011, 21:57:51 CEST »
0
Buonasera a tutti!!!
Mi sono da poco avvicinato all'oggetto Canvas, e vorrei capire meglio come è possibile far ruotare un'immagine (ad esempio una lancetta) su di un'altra immagine.
Posto qui di seguito il codice che ho utilizzato, ma quando effettuo la rotazione, la lancetta non solo ruota ma si sposta anche !!!

Tutorial2D.java
Codice (Java): [Seleziona]
public class Tutorial2D extends Activity {

        public CustomView cv;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
               
                cv = (CustomView) findViewById(R.id.customView);       
        }
}

CustomView.java :
Codice (Java): [Seleziona]
public class CustomView extends View {

    Bitmap mBmp;
    Random mRnd;
    Random mRnd2;
    Paint mPaint;
   
    Bitmap bitmap;
    Paint mPaint2;
    int bww, bhh;
   
    int w,h,bw,bh;
   
    int px=-1,py=-1;
   
    int pxx=-1, pyy=-1;
   
    public CustomView(Context context, AttributeSet attrs) {
            super(context, attrs);
           
           
            mBmp=BitmapFactory.decodeResource(context.getResources(), R.drawable.speedometer);      //carichiamo l'immagine in una bitmap
            bw=mBmp.getWidth(); //larghezza bitmap
            bh=mBmp.getHeight();//altezza  
            mPaint=new Paint(); // pennello
            mPaint.setColor(Color.RED);    
           
            bitmap=BitmapFactory.decodeResource(context.getResources(), R.drawable.pointer);
            bww=bitmap.getWidth();
            bhh=bitmap.getHeight();
            mPaint2=new Paint(); // pennello
           
    } // fine costruttore
   
    @Override
    protected void onDraw(Canvas canvas) {
           
            super.onDraw(canvas);
         
            if(px==-1&&py==-1){ // se non abbiamo ancora settato le coordinate, posizioniamo la bmp al centro
                   
                px=w/2-bw/2; //metà della larghezza view, meno metà della figura
                py=h/2-bh/2; //metà dell'altezza view, meno metà della figura
                 
               pxx=w/2-bww/2;
               pyy=h/2-bhh/2;
            }

            canvas.drawCircle(px+(bw/2), py+(bh/2), 140, mPaint); //disegnamo un cerchio con centro al centro della bitmap
           
            canvas.drawBitmap(mBmp, px, py, null); // speedometer
     
            canvas.save();
            canvas.rotate(20, pxx, pyy);
            canvas.drawBitmap(bitmap,pxx,pyy+20,null); // pointer
            //canvas.restore();
            }

    public void updatePosition(){    
                invalidate();
    }
   
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
       
        w=MeasureSpec.getSize(widthMeasureSpec);
        h=MeasureSpec.getSize(heightMeasureSpec);
               
        setMeasuredDimension(w,h);
       
    } // fine metodo OnMeasure  
}

main.xml :
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   >
<TextView  
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="@string/hello"
   />
        <it.giancarlo.tutorial2d.CustomView
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:id="@+id/customView" />
</LinearLayout>

Inoltre ho  notato che se commento la riga  "canvas.rotate(20, pxx, pyy);" la lancetta è al centro dell'immagine sottostante, cioè del tachimetro.
Come posso risolvere ???
Grazie.

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Problema Rotazione Oggetto Canvas
« Risposta #1 il: 13 Aprile 2011, 09:58:43 CEST »
0
disegna lo sfondo del tachimetro sul canvas di base.
crei un nuovo canvas e la lancetta la disegni/ruoti lì.
successivamente disegni la bitmap della nuova canvas su quella di base.
dovrebbe andare.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline cioppy

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: +3
    • giancarlo985
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S Plus
  • Play Store ID:
    Team Android
  • Sistema operativo:
    Linux Mint 12 - 64bit
Re:Problema Rotazione Oggetto Canvas
« Risposta #2 il: 14 Aprile 2011, 23:21:31 CEST »
0
ciao a tutti. Da poco mi sono avvicinato al mondo Android, e naturalmente ho non pochi dubbi.
In particolare vorrei realizzare un'applicazione con all'interno alcuni oggetti . Vorrei un modo per poter gestire questi oggetti (ciascuno composto da un0'immagine di sfondo e da un'altra immagine che ruota) in modo indipendente. Ho pensato di usare i canvas, anche se non ho capito benissimo cosa sono !!!

Per poter utilizzare la classe canvas, devo sovrascrivere il metodo onDraw() della view che utilizzo .

Se ho più canvas, come faccio a scegliere a quale canvas applicare le modifiche ??? Devo per caso creare un canvas per ogni  view?

Per esempio voglio realizzare un tachimetro dell'automobile e un indicatore del livello della benzina, sempre con lancetta.
Ho pensato di creare due view : la prima con un oggetto canvas composto dall'immagine del tachimetro e dalla lancetta (che ruota in base all'input)  e poi creare una seconda view composta dall'immagine di sfondo del livello carburante e dall'immagine della lancetta (che ruota anch'essa in base ad un altro input) ed integrare entrambe queste view in un'actitivy tramite ViewGroup.

Secondo voi questa può essere una buona soluzione per poter avere in un'unica activity più "oggetti" che ruotano in base ad alcuni parametri d'ingresso, oppure esiste una soluzione migliore per gestire ciascun oggetto in maniera indipendente dagli altri ?
Spero mi possiate dare qualche consiglio !!!!
Grazie.
« Ultima modifica: 15 Aprile 2011, 00:40:46 CEST da cioppy »

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Problema Rotazione Oggetto Canvas
« Risposta #3 il: 15 Aprile 2011, 06:44:55 CEST »
0
Il canvas è una "lavagna" sulla quale scrivere.
Ogni metodo che scrive sul canvas è un metodo dell'oggetto, per cui da ogni canvas invochi la drawText, la drawCircle.....
Se vuoi "registrare" tutto quello che fai su un canvas, allora gli associ una bitmap in fase di creazione oppure successivamente.
Personalmente non ho mai usato le viewgroup e non saprei dirti se la tua idea funziona, ma in teoria puoi seguire quello che ti ho detto nella risposta precedente. Se non hai dimestichezza con l'utilizzo di canvas e bitmap, prova a seguire qualche tutorial (qui su anddev li trovi) e poi riaffronta il tuo problema.
Se penai di essere già a posto cosí, devi solo entrare nello specifico per ogni problema che incontri.
Io sono qui.
Un saluto.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline cioppy

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: +3
    • giancarlo985
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S Plus
  • Play Store ID:
    Team Android
  • Sistema operativo:
    Linux Mint 12 - 64bit
Re:Problema Rotazione Oggetto Canvas
« Risposta #4 il: 19 Aprile 2011, 17:35:35 CEST »
0
Ho modificato il mio codice e sono riuscito ad effettuare la rotazione dell'oggetto :

CustomView.java


Codice (Java): [Seleziona]
public class CustomView extends View {

    Bitmap speedometer;
    Bitmap puntatore;
    Paint mPaint;
    Paint mPaint2;
    int speedometer_width;
    int speedometer_height;
    int pointer_width;
    int pointer_height;
    private int velocità=0;
    int speed=0;
    int bww, bhh;
    int w,h,bw,bh;
    int pos_x=-1,pos_y=-1;
    int pxx=-1, pyy=-1;
    int x, y;

    public CustomView(Context context, AttributeSet attrs) {
            super(context, attrs);
            speedometer=BitmapFactory.decodeResource(context.getResources(), R.drawable.speedometer);      //carichiamo l'immagine in una bitmap
            speedometer_width=speedometer.getWidth(); //larghezza speedometer
            speedometer_height=speedometer.getHeight();//altezza  
                       
            puntatore=BitmapFactory.decodeResource(context.getResources(), R.drawable.pointer); // era pointer
            pointer_width=puntatore.getWidth();
            pointer_height=puntatore.getHeight();
   } // fine costruttore
   
    @Override
    protected void onDraw(Canvas canvas) {
           
            super.onDraw(canvas);
            int height = canvas.getHeight();
            int width= canvas.getWidth();
            if(pos_x==-1&&pos_y==-1){ // se non abbiamo ancora settato le coordinate, posizioniamo la bmp al centro
                   
                pos_x=w/2-speedometer_width/2; //metà della larghezza view, meno metà della figura
                pos_y=h/2-speedometer_height/2; //metà dell'altezza view, meno metà della figura
                pxx=w/2-pointer_width/2;
                pyy=h/2-pointer_height/2;  // funziona con freccia

            }
           
          canvas.drawBitmap(speedometer,pos_x,pos_y,null);
           
            if (velocità <= 0)
                speed=200;
            else if (velocità >0 && velocità <= 10)
                speed=velocità+200;
            else if (velocità>10 && velocità<=20)
                speed=velocità+220;
            else if (velocità > 20 && velocità<=40)
                speed=velocità+230;            
            else if (velocità > 40 && velocità<=60)
                speed=velocità+240;
            else if (velocità > 60 && velocità<=80)
                speed=velocità+250;
            else if (velocità > 80 && velocità<=100)
                speed=velocità+260;
            else if (velocità > 100 && velocità<=120)
                speed=velocità+275;
            else if (velocità > 120 && velocità<=140)
                speed=velocità+280;
           
            canvas.rotate(speed,pxx+pointer_width/2,pyy+pointer_height/2);//va bene per freccia
           
           canvas.drawBitmap(puntatore,pxx,pyy,null); // va bene per freccia
            }
 
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
       
       
            // registriamo le dimensioni della view
        w=MeasureSpec.getSize(widthMeasureSpec);
        h=MeasureSpec.getSize(heightMeasureSpec);

        setMeasuredDimension(w,h);

   } // fine metodo OnMeasure  
   
    public void setVelocità(int veloc) {
        velocità=veloc;
    }

    public int getVelocità() {
        return velocità;
    }

    public void aggiorna() {
               
        setVelocità(getVelocità()+10);
        setVelocità(getVelocità()+10);
        setVelocità(getVelocità()+10);
        setVelocità(getVelocità()+10);
        setVelocità(getVelocità()+10);
            }
}

Tutorial2D.java
Codice (Java): [Seleziona]
public class Tutorial2D extends Activity {

        public CustomView cv;
        public CustomView2 cv2;

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

                setContentView(R.layout.main);

                 cv = (CustomView) findViewById(R.id.customView);

                cv.aggiorna();

        }
}

Se imposto la velocità, il puntatore si porta sulla velocità selezionata.
Adesso vorrei creare un'animazione che mi permette di muovere il puntatore in base alla velocità in ingresso.
Come posso fare ?
Grazie.
« Ultima modifica: 20 Aprile 2011, 11:21:33 CEST da cioppy »

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Problema Rotazione Oggetto Canvas
« Risposta #5 il: 20 Aprile 2011, 09:09:07 CEST »
0
Un paio di cose:
1. edita il tuo recente post in modo da scegliere codice java e non codice generico (per leggibilità)
2. non usare lettere accentate nei nomi di oggetti/properties/metodi.....mai se non all'interno di stringhe.
3. visto che velocità è un parametro della tua customview, puoi renderla visibile all'esterno (la rendi di tipo static) e ne cambi il valore ad ogni onDraw; ti ho suggerito di renderla static, ma potresti farlo in altri modi: il mio è solo un suggerimento atto a renderti funzionante l'idea e sta a te migliorarla.

saluti.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/