Autore Topic: problema animazione  (Letto 600 volte)

Offline ms92ita

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
problema animazione
« il: 05 Luglio 2012, 13:17:38 CEST »
0
Salve a tutti, ho un piccolo enorme problema, anzi 2, cercando di creare un'animazione
vi posto l'immagine del problema così è subito ben chiaro cosa non va


i due problemi sono:

1) vorrei far partire dal centro del relative layout la barra ma sia quando gli passo i parametri del centro del RelativeLayout, sia se non glieli do, il risultato è sempre lo stesso: parte dall'alto e facendo un piccolo debug (system.out) getWidth() e getHeight() danno 0

2)la mia animazione consiste nel disegnare una barra che parte dal centro e continua ad allargarsi per poi cominciare a restringersi quando "impatta" con le pareti dello schermo fino al centro e così via, però quando arriva al suo massimo della larghezza, ecco che fa questa cosa, cioè resta "ferma" a metà (che se riesco a sistemare il primo problema, il limite sarebbe appunto la parete dello schermo)

intanto vi posto i sorgenti (i due bottoni serviranno in futuro, non fateci caso per ora)

Codice (Java): [Seleziona]
public class Speed {
   
   //parametri della barra
   public static final int INCREASE=1;
   public static final int DECREASE=-1;
   
   private int inc=INCREASE;
   //velocità barra
   private float xv=1;
   
   public Speed() {
      xv=1;
   }
   //prende velocità
   public float getXV() {
      return xv;
   }
   //prende direzione barra
   public int getDirection() {
      return inc;
   }
   //cambia direzione
   public void changeDrection() {
      inc=inc*-1;
   }
}

Codice (Java): [Seleziona]
public class Bar {
   
   int large;
   Speed speed;
   int middleX,middleY;
   Paint paint;
   
   public Bar(int x,int y,Paint p) {
      large=0;
      speed=new Speed();
      middleX=x;
      middleY=y;
      paint=p;
   }
   //larghezza barra
   public int getLarge() {
      return large;
   }
   
   public Speed getSpeed() {
      return speed;
   }
   //update larghezza barra
   public void update() {
      large+=(speed.getXV()*speed.getDirection())*2;
   }
   //disegna barra
   public void draw(Canvas c) {
      c.drawRect(middleX-(large/2), middleY-20, middleX+(large/2), middleY+20, paint);
   }
}

Codice (Java): [Seleziona]
public class SlidingBar extends SurfaceView implements SurfaceHolder.Callback {
   
   GameThread thread;
   Paint paint;
   Bar bar;

   public SlidingBar(Context context, int width, int height) {
      super(context);
      getHolder().addCallback(this);
      thread= new GameThread(getHolder(),this);
      paint=new Paint();
      paint.setColor(Color.RED);
      bar=new Bar(width/2,height/2,paint);
      System.out.println(width+","+height);
   }

   @Override
   public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {  
   }
   
   @Override
   public void surfaceCreated(SurfaceHolder holder) {
      this.setWillNotDraw(false);
      thread.setRunning(true);
      thread.start();
   }

   @Override
   public void surfaceDestroyed(SurfaceHolder holder) {
      thread.setRunning(false);
      boolean run=true;
         while(run) {
            try {
               thread.join();
               run=false;
            } catch (InterruptedException e) {
               e.printStackTrace();
            }
         }
   }
   
   protected void render(Canvas c) {
      bar.draw(c);
   }
   //se sbatte ai lati cambia direzione altrimenti mantiene la stessa direzione e fa l'update della larghezza
   public void updates() {
      if(bar.getSpeed().getDirection()==Speed.INCREASE && bar.getLarge()>=this.getWidth())
         bar.getSpeed().changeDrection();
      if(bar.getSpeed().getDirection()==Speed.DECREASE && bar.getLarge()<=0)
         bar.getSpeed().changeDrection();
      bar.update();
   }
}

Codice (Java): [Seleziona]
public class GameThread extends Thread {
   
   static long FPS=20;
   SurfaceHolder holder;
   SlidingBar bar;
   boolean running=false;
   
   public GameThread(SurfaceHolder surfaceHolder, SlidingBar thread) {
      super();
      this.bar=thread;
      holder=surfaceHolder;
   }
   
   public void setRunning(boolean running) {
      this.running=running;
   }
   
   public void run() {
      while(running) {
         long ticksPS = 1000 / FPS;
         long startTime;
         long sleepTime;
         Canvas c=null;
         startTime = System.currentTimeMillis();
         try {
               c = holder.lockCanvas(null);
               synchronized (holder) {
                  bar.updates();
                   bar.render(c);
               }
         } finally {
                if (c != null) {
                       holder.unlockCanvasAndPost(c);
                }
            }
         sleepTime = ticksPS-(System.currentTimeMillis() - startTime);
         try {
            if (sleepTime > 0)
               Thread.sleep(sleepTime);
                else
                   Thread.sleep(10);
         } catch (Exception e) {}
      }
   }
}

Codice (Java): [Seleziona]
public class SlidingBarActivity extends Activity {
   
   RelativeLayout rel;
   SlidingBar bar;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        rel=(RelativeLayout) this.findViewById(R.id.screen);
        bar=new SlidingBar(this,rel.getWidth(),rel.getHeight());
        rel.addView(bar);
    }
}

layout
Codice (XML): [Seleziona]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:id="@+id/LinearLayout1"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:background="#000000"
   android:orientation="vertical" >
   
    <Button
       android:id="@+id/button1"
       android:layout_width="fill_parent"
       android:layout_height="150dp"
       android:text="Button" />


    <RelativeLayout
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:layout_weight="0.55"
       android:id="@+id/screen" >

    </RelativeLayout>
   
    <Button
       android:id="@+id/button2"
       android:layout_width="fill_parent"
       android:layout_height="150dp"
       android:text="Button" />
   
</LinearLayout>
come posso risolvere questa cosa? :(

P.S. scusate per la qualità della gif ma era il massimo che potevo fare D:
« Ultima modifica: 05 Luglio 2012, 13:55:55 CEST da ms92ita »

Offline ms92ita

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
Re:problema animazione
« Risposta #1 il: 05 Luglio 2012, 14:34:35 CEST »
0
EDIT: primo problema risolto... in pratica ho tolto i parametri di lunghezza e larghezza nei costruttori e ho creato un metodo dentro la classe bar

Codice (Java): [Seleziona]
public void setLayout(int w,int h) {
                middleX=w;
                middleY=h;
        }

che verrà richiamato all'interno del metodo surfaceCreated

Codice (Java): [Seleziona]
public void surfaceCreated(SurfaceHolder holder) {
                this.setWillNotDraw(false);
                thread.setRunning(true);
                bar.setLayout(getWidth()/2,getHeight()/2);
                thread.start();
        }

infatti ora sono riuscito a centrare completamente la barra
però resta il secondo problema, cioè si blocca come prima e facendo un debug delle coordinate che drawrect deve ultilizzare, incrementa e diminuisce come dovrebbe fare, precisamente qui...

Codice (Java): [Seleziona]
public void draw(Canvas c) {
                c.drawRect(middleX-(large/2), middleY-20, middleX+(large/2), middleY+20, paint);
                System.out.println((middleX-(large/2))+","+ (middleY-20)+","+ (middleX+(large/2))+","+ (middleY+20));
        }

logica vorrebbe che anche quando disegna la barra facesse questa cosa, invece no, resta ferma in quel punto... non me lo so spiegare affatto  ???

ecco il logcat:
Codice: [Seleziona]
07-05 04:30:02.694: I/System.out(1468): 210,117,270,157
07-05 04:30:02.744: I/System.out(1468): 200,117,280,157
07-05 04:30:02.834: I/System.out(1468): 190,117,290,157
07-05 04:30:02.934: I/System.out(1468): 180,117,300,157
07-05 04:30:03.014: I/System.out(1468): 170,117,310,157
07-05 04:30:03.075: I/System.out(1468): 160,117,320,157
07-05 04:30:03.154: I/System.out(1468): 150,117,330,157
07-05 04:30:03.174: I/System.out(1468): 140,117,340,157
07-05 04:30:03.264: I/System.out(1468): 130,117,350,157
07-05 04:30:03.354: I/System.out(1468): 120,117,360,157
07-05 04:30:03.444: I/System.out(1468): 110,117,370,157
07-05 04:30:03.536: I/System.out(1468): 100,117,380,157
07-05 04:30:03.615: I/System.out(1468): 90,117,390,157
07-05 04:30:03.705: I/System.out(1468): 80,117,400,157
07-05 04:30:03.785: I/System.out(1468): 70,117,410,157
07-05 04:30:03.875: I/System.out(1468): 60,117,420,157
07-05 04:30:03.955: I/System.out(1468): 50,117,430,157
07-05 04:30:04.045: I/System.out(1468): 40,117,440,157
07-05 04:30:04.135: I/System.out(1468): 30,117,450,157
07-05 04:30:04.225: I/System.out(1468): 20,117,460,157
07-05 04:30:04.305: I/System.out(1468): -1
07-05 04:30:04.315: I/System.out(1468): 30,117,450,157
07-05 04:30:04.395: I/System.out(1468): 40,117,440,157
07-05 04:30:04.485: I/System.out(1468): 50,117,430,157
07-05 04:30:04.575: I/System.out(1468): 60,117,420,157
07-05 04:30:04.655: I/System.out(1468): 70,117,410,157
07-05 04:30:04.745: I/System.out(1468): 80,117,400,157
07-05 04:30:04.835: I/System.out(1468): 90,117,390,157
07-05 04:30:04.925: I/System.out(1468): 100,117,380,157
07-05 04:30:05.035: I/System.out(1468): 110,117,370,157
07-05 04:30:05.125: I/System.out(1468): 120,117,360,157
07-05 04:30:05.215: I/System.out(1468): 130,117,350,157
07-05 04:30:05.295: I/System.out(1468): 140,117,340,157
07-05 04:30:05.385: I/System.out(1468): 150,117,330,157
07-05 04:30:05.495: I/System.out(1468): 160,117,320,157
07-05 04:30:05.585: I/System.out(1468): 170,117,310,157
07-05 04:30:05.665: I/System.out(1468): 180,117,300,157
07-05 04:30:05.755: I/System.out(1468): 190,117,290,157
07-05 04:30:05.835: I/System.out(1468): 200,117,280,157
07-05 04:30:05.925: I/System.out(1468): 1
07-05 04:30:05.925: I/System.out(1468): 190,117,290,157
07-05 04:30:06.035: I/System.out(1468): 180,117,300,157
07-05 04:30:06.115: I/System.out(1468): 170,117,310,157
« Ultima modifica: 05 Luglio 2012, 16:35:33 CEST da ms92ita »