2012-01-16 14 views
10

Estoy tratando de implementar mi propia SurfaceView personalizada que, cuando se toca, dibuja un círculo en el punto donde el usuario tocó la pantalla. Sin embargo, cuando llamo al mSurfaceHolder.lockCanvas() recibo una excepción. Algo parecido a un argumento ilegal siempre que el lienzo se traba. El código de muestra se publica a continuación.El bloqueo de la lona de Android arroja IllegalArgumentException

public class TapArea extends SurfaceView implements SurfaceHolder.Callback { 
    private static final int TAP_RADIUS = 4; 
    private boolean mLoaded = false; 
    private Paint mTapPaint; 
    private SurfaceHolder mSurfaceHolder; 

    protected OnTouchListener mTouchEvent = new OnTouchListener() { 
     @Override 
     public boolean onTouch(View arg0, MotionEvent arg1) { 
      if (!mLoaded) 
       return false; 

      Canvas c = null; 
      c = mSurfaceHolder.lockCanvas(); 
      drawTap(c, arg1); 

      return true; 
     } 
    }; 

    public TapArea(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     this.setOnTouchListener(mTouchEvent); 
     mHandler = new Handler(); 
     mSurfaceHolder = getHolder(); 
     mSurfaceHolder.addCallback(this); 
     mTapPaint = new Paint(); 
    } 

    public void drawTap(Canvas canvas, MotionEvent tap) { 
     canvas.drawCircle(tap.getX(), tap.getY(), TAP_RADIUS, mTapPaint); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void surfaceCreated(SurfaceHolder arg0) { 
     // TODO Auto-generated method stub 
     mLoaded = true; 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder arg0) { 
     // TODO Auto-generated method stub 

    } 
} 

A continuación se presentan los registros de errores me siguen dando:

01-17 00:19:44.703: E/Surface(9731): Surface::lock failed, already locked 
01-17 00:19:44.796: E/SurfaceHolder(9731): Exception locking surface 
01-17 00:19:44.796: E/SurfaceHolder(9731): java.lang.IllegalArgumentException 
01-17 00:19:44.796: E/SurfaceHolder(9731): at android.view.Surface.lockCanvasNative(Native Method) 
01-17 00:19:44.796: E/SurfaceHolder(9731): at android.view.Surface.lockCanvas(Surface.java:314) 
01-17 00:19:44.796: E/SurfaceHolder(9731): at android.view.SurfaceView$3.internalLockCanvas(SurfaceView.java:762) 
01-17 00:19:44.796: E/SurfaceHolder(9731): at android.view.SurfaceView$3.lockCanvas(SurfaceView.java:741) 
01-17 00:19:44.796: E/SurfaceHolder(9731): at com.frequency.FreqTapArea$2.onTouch(FreqTapArea.java:54) 
01-17 00:19:44.796: E/SurfaceHolder(9731): at android.view.View.dispatchTouchEvent(View.java:3897) 
01-17 00:19:44.796: E/SurfaceHolder(9731): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:869) 
01-17 00:19:44.796: E/SurfaceHolder(9731): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:869) 
01-17 00:19:44.796: E/SurfaceHolder(9731): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:869) 
01-17 00:19:44.796: E/SurfaceHolder(9731): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1737) 
01-17 00:19:44.796: E/SurfaceHolder(9731): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1153) 
01-17 00:19:44.796: E/SurfaceHolder(9731): at android.app.Activity.dispatchTouchEvent(Activity.java:2096) 
01-17 00:19:44.796: E/SurfaceHolder(9731): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1721) 
01-17 00:19:44.796: E/SurfaceHolder(9731): at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2200) 
01-17 00:19:44.796: E/SurfaceHolder(9731): at android.view.ViewRoot.handleMessage(ViewRoot.java:1884) 
01-17 00:19:44.796: E/SurfaceHolder(9731): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-17 00:19:44.796: E/SurfaceHolder(9731): at android.os.Looper.loop(Looper.java:130) 
01-17 00:19:44.796: E/SurfaceHolder(9731): at android.app.ActivityThread.main(ActivityThread.java:3835) 
01-17 00:19:44.796: E/SurfaceHolder(9731): at java.lang.reflect.Method.invokeNative(Native Method) 
01-17 00:19:44.796: E/SurfaceHolder(9731): at java.lang.reflect.Method.invoke(Method.java:507) 
01-17 00:19:44.796: E/SurfaceHolder(9731): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847) 
01-17 00:19:44.796: E/SurfaceHolder(9731): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
01-17 00:19:44.796: E/SurfaceHolder(9731): at dalvik.system.NativeStart.main(Native Method) 

ayuda sería muy apreciada.

+0

Se puede publicar el error que está recibiendo? Acabo de ejecutar su código sin problema en un emulador. ¿O tal vez publicar el código/XML en el que intentas crear una instancia del SurfaceView personalizado? También se debe tener en cuenta que su declaración de registro está fuera de lugar; siempre se llamará independientemente de si el sorteo tuvo éxito o no. – Devunwired

+0

Oye, he eliminado los bloques try/finally y el error aún persiste y no está dibujando nada en la superficie. Actualicé el código y agregué el registro de errores. – Dan

+1

Su código recién publicado no desbloquea el lienzo después de que el dibujo ('mSurfaceHolder.unlockCanvasAndPost (c)' desapareció). Además, 'mHandler' nunca se declara en ningún lado. – Devunwired

Respuesta

9

Deberá desbloquear el lienzo después de dibujar sobre él. El secuence derecha es:

  1. get de lienzo llamando mSurfaceHolder.lockCanvas();
  2. dibujar en lienzo.
  3. Desbloquear canvas llamando a mSurfaceHolder.unlockCanvasAndPost (c);

En su código podría ser:

public boolean onTouch(View arg0, MotionEvent arg1) { 
     if (!mLoaded) 
      return false; 

     Canvas c = mSurfaceHolder.lockCanvas(); 
     drawTap(c, arg1); 
     mSurfaceHolder.unlockCanvasAndPost(c); 

     return true; 
    } 
+1

Mi código anterior tenía algo así (debería haberlo guardado en el OP), excepto que 'lockCanvas()' está en un bloque 'try' y' unlockCanvasAndPost (c) 'está en un bloque' finally'. Daré un tiro a este código y te responderé. – Dan

Cuestiones relacionadas