मैं अपने स्वयं के कस्टम 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
}
}
नीचे मैं बार आ रही है त्रुटि लॉग कर रहे हैं।
आप त्रुटि तुम हो रही है पोस्ट कर सकते हैं? मैंने एक एमुलेटर में बिना किसी समस्या के अपना कोड चलाया। या शायद कोड/एक्सएमएल पोस्ट करें जहां आप कस्टम SurfaceView को तुरंत चालू करने का प्रयास कर रहे हैं? यह भी ध्यान दिया जाना चाहिए कि आपका लॉग स्टेटमेंट गुम हो गया है; ड्रॉ सफल होने या नहीं, इस पर ध्यान दिए बिना इसे हमेशा बुलाया जाएगा। – Devunwired
अरे, मैंने कोशिश/आखिरकार ब्लॉक हटा दिए हैं और त्रुटि अभी भी बनी हुई है और यह सतह पर कुछ भी नहीं खींच रही है। मैंने कोड अपडेट किया है और त्रुटि लॉग जोड़ा है। – Dan
आपका नया पोस्ट कोड ड्राइंग के बाद कैनवास को अनलॉक नहीं करता है ('mSurfaceHolder.unlockCanvasAndPost (c)' गायब हो गया)। इसके अलावा, 'mandler' कभी भी कहीं भी घोषित नहीं किया जाता है। – Devunwired