0

我正在开发一个应用程序,我想在注册触摸事件时显示一个视图。问题是视图不会显示并且我的代码变得无响应。

这是我的看法:

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();
        }
    }
}

这是我的 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;
}

现在,显然它被卡在了 while 循环中,但为什么它不绘制圆弧并更新布尔值呢?

4

2 回答 2

1

它卡住了,因为 onTouch 事件在 UI 线程中运行(如 onDraw)。所以你在while循环中阻塞了你的 UI 线程并且 onDraw() 没有得到处理器时间。

考虑使用回调机制,因此removeView()例程由您的onDraw方法触发。在sleep(400)UI 线程中也是非常糟糕的主意。您可以尝试使用处理程序并延迟执行:

 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);
于 2012-07-27T18:14:57.493 回答
-1

这是我的代码它完全适合我它会画一个字符串希望它能帮助你解决问题

@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;
}
于 2012-07-27T18:14:24.417 回答