Autore Topic: Rotate Animation e Custom View  (Letto 704 volte)

Offline Tunarock

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire S
  • Sistema operativo:
    Windows Vista
Rotate Animation e Custom View
« il: 22 Settembre 2013, 18:22:57 CEST »
0
Salve, il mio problema è il seguente:

Ho un immagine quadrata di dimensioni volutamente superiori allo schermo, che inserisco in una CustomView tramite l'uso di Canvas:

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

        private Bitmap mBmp;
        int w,h,bw,bh;
        int px=-1,py=-1;

        public Sunlight(Context context, AttributeSet attrs) {
                super(context, attrs);

                mBmp = BitmapFactory.decodeResource(context.getResources(), R.drawable.sunlight);
                bw=mBmp.getWidth();
                bh=mBmp.getHeight();

        }

        @Override
        protected void onDraw(Canvas canvas) {
                // TODO Auto-generated method stub
                super.onDraw(canvas);

                if(px==-1&&py==-1){
                        px=w/2-bw/2;
                        py=h/10-bh/2;
                }

                canvas.drawBitmap(mBmp,px,py,null);
        }

        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
                //registriamo le dimensioni della view
                w=MeasureSpec.getSize(widthMeasureSpec);
                h=MeasureSpec.getSize(heightMeasureSpec);
                setMeasuredDimension(w,h);
        }

}

quando applico la seguente animazione:

Codice (XML): [Seleziona]
<rotate android:fromDegrees="0"
       android:toDegrees="360"
       android:pivotX="50%"
       android:pivotY="10%"
       android:duration="100000"
       android:repeatCount="infinite"
       android:interpolator="@android:anim/cycle_interpolator"/>

la mia customView subisce una trasformazione indesiderata, ovvero si comprime in larghezza, dovuto al fatto che in qualche modo le dimensioni della view cambiano. L'immagine però ruota effettivamente nel punto desiderato, l'effetto non voluto quindi è che durante l'animazione parte dell'immagine non è visibile.

come posso fare per impedire che la mia view cambi dimensioni?

posto anche parte del layout:

Codice (XML): [Seleziona]
<RelativeLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/base"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical"
   android:background="@color/blue_ground" >
   
    <it.tunarock.undernet.Sunlight
               android:layout_width="fill_parent"
               android:layout_height="fill_parent"
               android:id="@+id/sunView" />    
 
    <RelativeLayout      
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:id="@+id/mainLevel"
       android:orientation="vertical">
"Quando fai le cose per bene, nessuno sospetterà che tu abbia fatto realmente qualcosa"

Offline Giak

  • Utente junior
  • **
  • Post: 52
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    transformer tf101
  • Sistema operativo:
    ubuntu 12.10
Re:Rotate Animation e Custom View
« Risposta #1 il: 22 Settembre 2013, 23:43:19 CEST »
0
la prima soluzione che mi viene in mente è implementare la rotazione da codice.

probabilmente però esiste una soluzione migliore

Offline Tunarock

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire S
  • Sistema operativo:
    Windows Vista
Re:Rotate Animation e Custom View
« Risposta #2 il: 22 Settembre 2013, 23:47:28 CEST »
0
Studiando bene il problema, ho capito che la soluzione migliore non prevede di ruotare l'intera View, ma bensi di effettuare la rotazione della bitmap direttamente nel metodo onDraw, sfruttando il canvas. purtroppo non riesco a capire come si fa a far si che la rotazione sia ciclica all'infinito.  :-\
"Quando fai le cose per bene, nessuno sospetterà che tu abbia fatto realmente qualcosa"

Offline Giak

  • Utente junior
  • **
  • Post: 52
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    transformer tf101
  • Sistema operativo:
    ubuntu 12.10
Re:Rotate Animation e Custom View
« Risposta #3 il: 23 Settembre 2013, 10:28:15 CEST »
0
devi usare un timer che ti notifichi ogni tot millisecondi e ci registri una funzione che incrementa un contatore modulo 360 che regola l'angolo e che usi nel metodo di drawing. dopodiche posta la invalidate()

in pseudocodice:

Timer.tick.add( function (){ angolo = (angolo+1)%360 ;  view.postInvalidete(); });

@Override onDraw(){ canvas.drawbitmap(bitmap, angolo, ecc...) ....}

Offline Tunarock

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire S
  • Sistema operativo:
    Windows Vista
Re:Rotate Animation e Custom View
« Risposta #4 il: 23 Settembre 2013, 10:31:59 CEST »
0
ma non devo ruotare il canvas con canvas.rotate() ?
il timer lo gestisco all'interno della creazione della view?
"Quando fai le cose per bene, nessuno sospetterà che tu abbia fatto realmente qualcosa"

Offline Giak

  • Utente junior
  • **
  • Post: 52
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    transformer tf101
  • Sistema operativo:
    ubuntu 12.10
Re:Rotate Animation e Custom View
« Risposta #5 il: 23 Settembre 2013, 17:21:19 CEST »
0
si hai ragione devi ruotare il canvas, per il timer dipende da quello che devi fare: io lo metterei nell'activity che usa la view. oppure lo puoi mettere anche internamente.