Autore Topic: postInvalidate  (Letto 487 volte)

Offline rudj

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung s3 mini
  • Sistema operativo:
    mac os 10.75
postInvalidate
« il: 30 Luglio 2013, 21:19:09 CEST »
0
ciao a tutti, come esercizio sto provando a rifare il famoso giochino forza 4 ma ho difficoltà con le animazioni in onDraw:

Codice (Java): [Seleziona]
package rudy.lanzarini.FourInARow;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.util.Log;
import android.view.View;


public class Pedina{
    Paint green;
    Paint red;
    Paint colorePedina;
    Canvas canvas;
    float riga=5;  //parto da sopra per far cadere la pedina dall'alto
    float colonna;
    int player;
    Handler fallPedinaHandler;
    View view;
    int i;
    FallPedinaThread fallPedinaThread;

    public Pedina(Canvas canvas,View view, float colonna,int player ){  //player0==verde
        green=new Paint();
        red=new Paint();
        green.setColor(Color.GREEN);
        red.setColor(Color.RED);
        this.canvas=canvas;
        this.colonna=colonna;
        this.player=player;
        fallPedinaHandler=new Handler();
        this.view=view;
        fallPedinaThread=new FallPedinaThread();


    }
    public void drawPedina(){
        colorePedina=player==0?green:red;  //scelta del colore pedina in base al turno giocatore
        //calcolo coordinate pedina in base a colonna e riga
        float x=((StageView.screenWidth/8.9F)+(0.9F*-colonna)+5F)*(colonna);
        float y=StageView.screenHeight-((StageView.screenHeight/100F*(100F-StageView.bottomY-1))+(riga+1F)*StageView.screenHeight/100F*10.95F);
        canvas.drawRect(x,y,x+StageView.screenWidth/12,y+StageView.screenHeight/12,colorePedina);
        Log.i("coords","x="+x+"y="+y);

    }
    public void fallPedina(){
        i = 5;
        if (fallPedinaThread.getState()== Thread.State.NEW) {
            fallPedinaThread.start();
        }
        Log.i("threadinfo2","metodo partito");
    }
    public class FallPedinaThread extends Thread{
        @Override
        public void run() {
            super.run();
            Log.i("threadinfo2","thread partito");
            while(i>=0){
                try {
                    Thread.sleep(1000);
                    if(colonna<7 && StageView.arrayCelle[i][(int)colonna]==null){  //se le celle sono libere...
                        riga=i;
                        drawPedina();
                        view.postInvalidate();
                        i--;
                        Log.i("threadinfo2","i="+i);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        }
    }
il codice scritto così dovrebbe mostrare una pedina che "cade" cambiando riga ogni secondo verso il basso, invece non si vede assolutamente nessuna pedina, se invece aggiungo il metodo drawPedina fuori dal thread seguito dal classico View.invalidate() il rettangolino si vede per pochi istanti e scompare quasi subito appena incontra il postInvalidate del thread(ho provato infatti a togliere il metodo postinvalidate() dal thread e la pedina rimane ferma in alto e non scompare)
dove sbaglio?
PS: se potesse servire posto anche il codice della view principale
Codice (Java): [Seleziona]
package rudy.lanzarini.FourInARow;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;

import java.util.ArrayList;
import java.util.Random;

public class StageView extends View implements View.OnTouchListener {
    private final String turno1;
    private final String turno2;
    private String turno;
    private int turnoInt;
    private Paint textPaint;
    private Paint tableLine;
    public static final float leftX = 11F;
    public static final float topY = 19F;
    public static final float rightX = 88F;
    public static final float bottomY = 85F;
    ArrayList<Pedina> pedineArray;
    Canvas canvas;
    private boolean touched;
    private int tempColonna;
    private int tempGiocatore;
    public static Cella[][] arrayCelle;
    public static int screenWidth;
    public static int screenHeight;

    public StageView(Context context,Bundle strings) {
        super(context);

        pedineArray=new ArrayList<Pedina>();
        arrayCelle=new Cella[6][7];
        this.setOnTouchListener(this);

        turno1=strings.getString("turno1");
        turno2=strings.getString("turno2");

        textPaint=new Paint();
        textPaint.setTextSize(topY);
        textPaint.setColor(Color.WHITE);
        tableLine=new Paint();
        tableLine.setColor(Color.WHITE);
        tableLine.setStrokeWidth(5);

        //turno casuale
        Random rndPlayer=new Random();
        turnoInt=rndPlayer.nextInt(2);
        turno=turnoInt==0?turno1:turno2;

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        this.canvas=canvas;
        screenWidth= canvas.getWidth();
        screenHeight=canvas.getHeight();
        canvas.drawARGB(100,0,0,200);

        //disegna testo turno
        float sentenceWidth = textPaint.measureText(turno);
        canvas.drawText(turno,(canvas.getWidth()-sentenceWidth)/2,relativeCanvasY(canvas, 8),textPaint);

        //disegna griglia di gioco
        canvas.drawLine(relativeCanvasX(canvas, leftX),relativeCanvasY(canvas, topY),relativeCanvasX(canvas, leftX),relativeCanvasY(canvas, bottomY),tableLine);
        canvas.drawLine(relativeCanvasX(canvas, leftX),relativeCanvasY(canvas, topY),relativeCanvasX(canvas, rightX),relativeCanvasY(canvas, topY),tableLine);
        canvas.drawLine(relativeCanvasX(canvas, leftX),relativeCanvasY(canvas, bottomY),relativeCanvasX(canvas,rightX),relativeCanvasY(canvas, bottomY),tableLine);
        canvas.drawLine(relativeCanvasX(canvas,rightX),relativeCanvasY(canvas, topY),relativeCanvasX(canvas,rightX),relativeCanvasY(canvas, bottomY),tableLine);
        for(float i=topY;i<bottomY;i+=11){
            canvas.drawLine(relativeCanvasX(canvas,leftX),relativeCanvasY(canvas, i),relativeCanvasX(canvas,rightX),relativeCanvasY(canvas, i),tableLine);
        }
        for(float i=leftX;i<rightX;i+=11){
            canvas.drawLine(relativeCanvasX(canvas,i),relativeCanvasY(canvas, topY),relativeCanvasX(canvas,i),relativeCanvasY(canvas, bottomY),tableLine);
        }
        //disegna pedine
        mossa(touched,tempColonna,tempGiocatore);
        Log.i("threadinfo2","redrawed");


    }

    private void mossa(boolean touched, int colonna,int giocatore) {
        if (touched){
            if (colonna>0 && colonna<8) {
                pedineArray.add(new Pedina(canvas,this,colonna,giocatore));
            }
            if (!pedineArray.isEmpty()) {
                for(Pedina p:pedineArray){
                    p.fallPedina();
                }
            }
            this.touched=false;
        }
    }

    private float relativeCanvasX(Canvas canvas, float settore) {
        float x=(canvas.getWidth()/100F)*settore;
        return x;
    }
    private float relativeCanvasY(Canvas canvas, float settore) {
        float y=canvas.getHeight()/100F*settore;
        return y;
    }

    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        int colonna=(int)motionEvent.getX()/(800/9);
        tempColonna=colonna;
        tempGiocatore=turnoInt;
        touched=true;
        invalidate();
        turnoInt=turnoInt==0?1:0;
        return false;
    }
    public void debug(){
        for (int i=0;i<pedineArray.size();i++) {
            Log.i("pedinearray","pedinearray "+i+" = "+pedineArray.get(i));
        }
    }
}

Offline rudj

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung s3 mini
  • Sistema operativo:
    mac os 10.75
Re:postInvalidate
« Risposta #1 il: 31 Luglio 2013, 21:33:16 CEST »
0
Vi bastano o devo postare anche le altre classi?