entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

¿porque invalidate no refresca la pantalla dentro de un ciclo for next?

invalidate no refresca la pantalla dentro de un ciclo for next, con RelativeLayout, se trata de conseguir un efecto de movimiento en la pantalla.
Fuera del ciclo si funciona,pero obviamente no se consigue movimiento, he intentado poner un sleep y tampoco. ¿No es posible si no es con hilos?.
Un saludo Francisco

0voto

Leonardo-Tadei comentado

Podrías enviar la porción de código con el bucle que no funciona y alguna otra parte que consideres relevante?

0voto

IO comentado

Gracias por tu pronta respuesta.
Te envío el codigo, y abusando un poco de tu amabilidad te hago otra consulta.

Al principio del codigo si intento trabajar con TextView no es posible dibujar nada , ¿hay que declararalo de alguna forma especial?

Un saludo Francisco

public class MainActivity extends Activity implements OnTouchListener {
    private int corx, cory;
    private int Antcorx, Antcory, Direccionx, Direcciony;
    private Lienzo fondo;

    Paint pincel1 = new Paint();
     //In this test, handle maximum of 2 pointer
     final int MAX_POINT_CNT = 10;
     final int MAX_VELOCIDAD_CNT = 4;
     final int MED_VELOCIDAD_MLS = 20;
     final int DIF_CLIC = 150;
     final int DIF_ENTRE_CLIC = 200;
     final int DIF_TOLERANCIA_CLIC = 30;
     final int REDUCCION_RADIO = 5;
     final int  Colores[][] ={  {125,125,125},{255,0,0},   
                {128,64,255},{255,125,0}, {255,0,255},  {0,255,255},  
                {255,125,125},{255,0,125}, {0,255,125},   {255,128,180}};  
     int Ancho = 0, Alto = 0;    
int xPasos, xAVANCEx, xAVANCEy;
int xPasosCtrl=0;
boolean xAnimar = false;        

     String[] pointerAction = new String[MAX_POINT_CNT];
     float[] x = new float[MAX_POINT_CNT];
     float[] y = new float[MAX_POINT_CNT];
     TextView currentPointer;
     TextView pointerStatus_01, pointerStatus_02;
     TextView textDistance;
     public static float Radio =  0;
     public float Rad;
     LinearLayout MainLayout;
     int IdAct, DobleClic;
     boolean Dibujando= false;
     long  TmpAnterior, TmpActual, TmpDif;
     long [] Tiempos = new long[4];
     int NumPunt = 0, DentroCirculo = -1, PosVelocidad = 0, Eco = 0;
     long[][] Velocidad = new long[MAX_VELOCIDAD_CNT ][2];
     float  MediaVelocidad=0;
     long Tm=0;
     public int s=1, ss = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    /*
     *  Por cierto si activo este texviw no se puede dibuja en la pantalla ¿como lo tendría que declararlo para que funcionase?
     * layout:
     *      <TextView android:id="@+id/currentpointer" android:layout_width="fill_parent" android:layout_height="wrap_content">
     */

    //currentPointer.setVisibility(R.style.GONE); //0x00000004);    
    //visibility One of VISIBLE, INVISIBLE, or GONE.
    corx = cory = 100;
    DobleClic =  -2;
    Tiempos[ 0 ] = Tiempos[ 1 ] = Tiempos[ 2 ] = Tiempos[ 3 ] = 0;
    TmpActual = System.currentTimeMillis();
    RelativeLayout layout1 = (RelativeLayout) findViewById(R.id.layout1);
//  LinearLayout layout1 = (LinearLayout) findViewById(R.id.layout1);
    fondo = new Lienzo(this);
    fondo.setOnTouchListener(this);
    layout1.addView(fondo);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

public boolean onTouch(View v, MotionEvent motionEvent) {
//  int  Inx = motionEvent.getPointerCount();
    int pointerIndex = ((motionEvent.getAction() 
               & MotionEvent.ACTION_POINTER_INDEX_MASK)
              >> MotionEvent.ACTION_POINTER_INDEX_SHIFT);// ACTION_POINTER_ID_SHIFT);
    int pointerId = motionEvent.getPointerId(pointerIndex);
    int action = (motionEvent.getAction() & MotionEvent.ACTION_MASK);
    int pointCnt = motionEvent.getPointerCount();

    Eco =0;
    Antcorx = corx ;
    Antcory = cory ;
    corx = (int) motionEvent.getX();
    cory = (int) motionEvent.getY();
    if (pointCnt == 1 && DentroCirculo == -1)       
        DentroCirculo = EstaDentroCirculo(x, y, corx, cory, Radio);     
    if(DentroCirculo > 0 && NumPunt > 0)    
    {   x[DentroCirculo] = corx;
        y[DentroCirculo] = cory;
    }
    else
    {   if (pointerIndex <= MAX_POINT_CNT - 1 ){
            NumPunt=0;
            for (int i = 0; i < pointCnt; i++) {
                int id = motionEvent.getPointerId(i);
                NumPunt++;
                IdAct = id >=  MAX_POINT_CNT ?  MAX_POINT_CNT-1 : id   ; 
                x[IdAct] = (int)motionEvent.getX(i);
                    y[IdAct] = (int)motionEvent.getY(i);
            }
        }
    }
        pointerId=MAX_POINT_CNT-1 >  pointerId ? pointerId : MAX_POINT_CNT-1;

     switch (action)
     {  case MotionEvent.ACTION_DOWN:
             DobleClic += 2;    
             if  (DobleClic >= 2 && (System.currentTimeMillis() - Tiempos[ 0 ] ) > DIF_ENTRE_CLIC)
                    DobleClic = 0;
             Tiempos[ DobleClic ] = System.currentTimeMillis() ;
             break;
         case MotionEvent.ACTION_POINTER_DOWN:
             pointerAction[pointerId] = "ACTION_POINTER_DOWN";
             break;

         case MotionEvent.ACTION_MOVE:

             pointerAction[pointerId] = "ACTION_MOVE    :"+pointCnt;
             int distance = (int) Math.sqrt((x[0] - x[1]) * (x[0] - x[1]) +(y[0] - y[1]) * (y[0] - y[1])); 
             Radio = distance / REDUCCION_RADIO;
             PosVelocidad = PosVelocidad >= MAX_VELOCIDAD_CNT-1 ? 0 : ++PosVelocidad;
             Direccionx = corx - Antcorx;
             Direcciony = cory - Antcory;
             Velocidad [PosVelocidad ][0] = System.currentTimeMillis() - Tm;
             Velocidad [PosVelocidad ][1] = (int) Math.sqrt(Direccionx * Direccionx + Direcciony * Direcciony); ;
             Tm = System.currentTimeMillis();
             break;
         case MotionEvent.ACTION_UP: 
             Tiempos[ DobleClic + 1 ] = System.currentTimeMillis() ;
             if  (DobleClic >= 2) 
             {   DobleClic = - 2;
                 if(Math.abs(Tiempos[2] - Tiempos[1]) < DIF_ENTRE_CLIC )
                    if((Tiempos[1] - Tiempos[0]) < DIF_CLIC &&  (Tiempos[3] - Tiempos[2]) < DIF_CLIC )
                         BorraDedos(x);
                 x[0]=100; y[0]=100;
                 BorraTiempos(Tiempos);
             }
             MediaVelocidad= CalculaMediaVelocidad( Velocidad);
             Log.w("Valor", "Te pasasate en:  "  + MediaVelocidad  + " puntos/ms");
             Eco =  DentroCirculo ;    
             DentroCirculo = -1;
             pointerAction[pointerId] = "ACTION_UP:    "+pointCnt;
          break;
         case MotionEvent.ACTION_POINTER_UP:
             pointerAction[pointerId] = "ACTION_POINTER_UP";
          break;
         case MotionEvent.ACTION_CANCEL:
             pointerAction[pointerId] = "ACTION_CANCEL";
          break;
         default:
             pointerAction[pointerId] = "Unknown!";
     }

         fondo.invalidate();     
     /***    !!!!!   S Í     F U N C I N A   ***/    

    if( Eco > -1 && MediaVelocidad > 222) 
    {    CreaEco(x, y, Eco, MediaVelocidad, Direccionx, Direcciony);
         Eco = 0;
         MediaVelocidad=0;
    }
    return true;
}

public void  CreaEco(float[] x, float[] y, int Eco, float MediaV, int Dirx, int Diry){
    int CICLOS = 6; 
    int AVANCEx = (int) (Dirx / 20 *MediaV);
    int AVANCE = (int) (Diry / 10 *MediaV);
    int Pasos =Math.abs( (int) MediaV * (Dirx < 0 ? - CICLOS : CICLOS));     
    for (int t = 0; t < Pasos; t++)
    {   x[Eco] = x[Eco] >= Ancho ? Ancho : x[Eco] + AVANCEx;
        x[Eco] = x[Eco] <= 0 ? 0 : x[Eco];

        y[Eco] = y[Eco] >= Alto ? Alto : y[Eco] + AVANCEy;
        y[Eco] = y[Eco] <= 0 ? 0 : y[Eco];
            //SystemClock.sleep(20);

         fondo.invalidate();     
         /***    !!!!!   N  O    F U N C I N A   ***/    

        //SystemClock.sleep(20);
        // fondo.invalidateDrawable(null);
    }
        x[Eco] = x[Eco] <= 0 ? 1 : x[Eco];
        y[Eco] = y[Eco] <= 0 ? 1 : y[Eco];
}

Editado: movido a comentario de la pregunta. Es una ampliación de la misma, no una respuesta.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta