2012-01-16 16 views
10

मैं अपने स्वयं के कस्टम SurfaceView को लागू करने की कोशिश कर रहा हूं, जब स्पर्श किया जाता है, उस बिंदु पर एक सर्कल खींचता है जहां उपयोगकर्ता स्क्रीन को छुआ। हालांकि, जब मैं mSurfaceHolder.lockCanvas() पर कॉल करता हूं तो मुझे अपवाद मिलता है। कैनवास ताले जब भी एक अवैध तर्क की लाइनों के साथ कुछ। नमूना कोड नीचे पोस्ट किया गया है।एंड्रॉइड कैनवास लॉकिंग IllegalArgumentException

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) 

मदद बहुत सराहना की जाएगी:

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 

    } 
} 

नीचे मैं बार आ रही है त्रुटि लॉग कर रहे हैं।

+0

आप त्रुटि तुम हो रही है पोस्ट कर सकते हैं? मैंने एक एमुलेटर में बिना किसी समस्या के अपना कोड चलाया। या शायद कोड/एक्सएमएल पोस्ट करें जहां आप कस्टम SurfaceView को तुरंत चालू करने का प्रयास कर रहे हैं? यह भी ध्यान दिया जाना चाहिए कि आपका लॉग स्टेटमेंट गुम हो गया है; ड्रॉ सफल होने या नहीं, इस पर ध्यान दिए बिना इसे हमेशा बुलाया जाएगा। – Devunwired

+0

अरे, मैंने कोशिश/आखिरकार ब्लॉक हटा दिए हैं और त्रुटि अभी भी बनी हुई है और यह सतह पर कुछ भी नहीं खींच रही है। मैंने कोड अपडेट किया है और त्रुटि लॉग जोड़ा है। – Dan

+1

आपका नया पोस्ट कोड ड्राइंग के बाद कैनवास को अनलॉक नहीं करता है ('mSurfaceHolder.unlockCanvasAndPost (c)' गायब हो गया)। इसके अलावा, 'mandler' कभी भी कहीं भी घोषित नहीं किया जाता है। – Devunwired

उत्तर

9

आपको ड्राइंग के बाद कैनवास अनलॉक करने की आवश्यकता है। सही secuence है:

  1. प्राप्त डी कैनवास mSurfaceHolder.lockCanvas बुला();
  2. कैनवास पर आकर्षित करें।
  3. कैनवास को अनलॉक करें mSurfaceHolder.unlockCanvasAndPost (c);

अपने कोड में हो सकता है:

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

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

     return true; 
    } 
+1

मेरे पुराने कोड में ऐसा कुछ था (इसे ओपी में रखा जाना चाहिए था), 'लॉक कैनवास() 'को' try' block 'में छोड़कर और' अनलॉक कैनवास एंडपोस्ट (सी)' 'अंत में 'ब्लॉक में है। मैं इस कोड को एक शॉट दूंगा और आपको वापस ले जाऊंगा। – Dan

संबंधित मुद्दे