La vista no se muestra en Touch

Estoy desarrollando una aplicación en la que me gustaría mostrar una vista cuando se registra un evento táctil. El problema es que la vista no se muestra y mi código deja de responder.

Aquí está mi punto de vista:

public class TouchFX extends View {

RectF oval;
float Tx, Ty;
Paint paint;
int longSide, numRun;
float top, left, right, bottom;
boolean removable;

public TouchFX(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
    Tx = TouchService.x;
    Ty = TouchService.y;
    paint = new Paint();
    paint.setColor(Color.WHITE);
    paint.setAntiAlias(true);
    paint.setStrokeJoin(Paint.Join.ROUND);
    numRun = 0;
    removable = false;
}

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

    if (canvas.getWidth() > canvas.getHeight())
        longSide = canvas.getWidth();
    else
        longSide = canvas.getHeight();

    if (numRun == 0) {
        left = Tx - (longSide / 15);
        top = Ty + (longSide / 15);
        right = Tx + (longSide / 15);
        bottom = Ty - (longSide / 15);
    } else if (numRun <= 8) {
        left += 2;
        top += 2;
        right += 2;
        bottom += 2;
    }
        oval = new RectF(left, top, right, bottom);

    if (numRun < 9)
        canvas.drawArc(oval, 0, 360, false, paint);
    else
        removable = true;

    numRun++;

    try {
        Thread.sleep(400);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
    }
}

Aquí está mi controlador onTouch:

public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub
    if (v == tv && event.getAction() == MotionEvent.ACTION_DOWN
            && isRunning == true) {
        x = event.getX();
        y = event.getY();

        tfx = new TouchFX(this);

        winmngr.addView(tfx, lpFX);


                    //Do some stuff, make some Toasts


        while(!tfx.removable) {
            //waiting for animation to end
        }

        winmngr.removeView(tfx);
    }
    return false;
}

Ahora, obviamente se está atascando dentro del ciclo while, pero ¿por qué no está dibujando el arco y actualizando el booleano?

preguntado el 27 de julio de 12 a las 19:07

¿Puede explicar por qué está congelando el subproceso de la interfaz de usuario durante 400 ms en onDraw ()? -

2 Respuestas

se atasca porque el evento onTouch opera en el subproceso de la interfaz de usuario (al igual que onDraw). Así que estás bloqueando tu subproceso de interfaz de usuario en while loop y onDraw() no obtienen tiempo de procesador.

Considere usar el mecanismo de devolución de llamada, por lo que removeView() las rutinas son desencadenadas por su onDraw método. También sleep(400) en el hilo de la interfaz de usuario es una idea extremadamente mala. Puede intentar usar el controlador y publicar la ejecución retrasada:

 public class YouCustomView extends View
 {

     Handler handler = new Handler();

     @Override
     protected onDraw(Canvas canvas){
         //your draw routine here
         .... 

         //wait 400 ms and remove view
         handler.postDelayed(new Runnable()
         {
             @Override
             public void run()
             {
                 //trigger callback to remove view
             }
         }, 400);

Respondido 27 Jul 12, 19:07

Gracias, intentaré usar un AsyncTask en su lugar. - Habitante

aquí está mi código, funciona completamente para mí, dibujará una cadena, espero que lo ayude a resolver un problema

@Override
public boolean onTouchEvent(MotionEvent event) {
    // draw text at touch
    try {
        canvas = getHolder().lockCanvas();
        synchronized (getHolder()) {
            if (event.getAction() == MotionEvent.ACTION_DOWN 
                    || event.getAction() == MotionEvent.ACTION_MOVE) {
                // clear the screen
                canvas.drawColor(Color.BLACK);
                // draw glyphs
                glyphs.drawString(canvas, "Drawing string at "
                        + (int) event.getX() + " " + (int) event.getY(),
                        (int) event.getX(), (int) event.getY());
            }
            if (event.getAction() == MotionEvent.ACTION_UP) {
                canvas.drawColor(Color.BLACK);
                glyphs.drawString(canvas, "Drawn string at "
                        + (int) event.getX() + " " + (int) event.getY(),
                        (int) event.getX(), (int) event.getY());
            }
        }
    } finally {
        if (canvas != null) {
            getHolder().unlockCanvasAndPost(canvas);
        }
    }
    // event was handled
    return true;
}

Respondido 27 Jul 12, 19:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.