2012-11-13 3 views
0

설명 :캔버스의 터치 이벤트 On Android에서

캔버스를 사용하여 직사각형을 그렸고 해당보기에서 터치 이벤트를 구현 한 뷰를 생성했습니다.

새로운 활동을 시작하고 싶습니다.

문제 : "강제 닫기"오류가 팝업되는 사각형을 터치 할 때마다

지금 문제입니다.

다음은 PickCardView.java

public class PickCardView extends View 
    { 
    private Paint mCanvasPaint; 

    private Rect mScreenSize = new Rect(); 

    private Rect mCardSize = new Rect(); 
    private int mCardCap; 

    private Card MCards; 

    public PickCardView(Context context) 
    { 
     super(context); 

     mCanvasPaint = new Paint(); 
     mCanvasPaint.setColor(0xFF228B22); // Green background 
     mCanvasPaint.setAntiAlias(false); 
     mCanvasPaint.setFilterBitmap(false); 
    } 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) 
    { 
     super.onSizeChanged(w, h, oldw, oldh); 

     // Store current screen size 
     mScreenSize.set(0, 0, w, h); 

     // Calculate card and decks sizes and positions 
     int cw = w/11; 
     mCardSize.set(0, 0, cw, (int) (cw * 1.5)); 
     Log.v("card size", mCardSize.toString()); 

     int freeSize = w - cw * 7; //117 
     mCardCap = freeSize/(6 + 4 * 2);//5 

     int cy = (int) (mScreenSize.height() * 0.35); 

     //MIDDLE CARD HOLDER 
     MCards = new Card(Card.CardType.PickDeck, mCardCap * 2 + mCardSize.width()*4 - 15, cy - 20, mCardSize.width()+60, mCardSize.height()+60); 
    } 

    @Override 
    public void onDraw(Canvas canvas) 
    { 
     mCanvasPaint.setStyle(Style.FILL); 
     canvas.drawRect(mScreenSize, mCanvasPaint); 

     MCards.doDraw(canvas);  
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) 
    { 
     int action = event.getAction(); 

     if (action == MotionEvent.ACTION_DOWN) 
     { 
      int x = (int) event.getX(); 
      int y = (int) event.getY(); 

      Card card = getCardUnderTouch(x, y); 

      if(card != null) 
      { 
       Intent i = new Intent(null, BuildWord.class); 
       startActivity(i); 
      } 
     } 

     return true; 
    } 

    private void startActivity(Intent i) 
    { 
     //Intent i1 = new Intent(null, BuildWord.class);   
    } 

    private Card getCardUnderTouch(int x, int y) 
    { 
     Card ret = null; 

     if (MCards.isUnderTouch(x, y)) 
     { 
      return MCards; 
     } 

     return ret; 
    } 
} 

입니다 이것은 내가 그 사각형을 터치하면 로그 캣에 표시된 오류 : startActivity를 방법을 제거

@Override 
public boolean onTouchEvent(MotionEvent event) 
{ 
int action = event.getAction(); 

if (action == MotionEvent.ACTION_DOWN) 
{ 
    int x = (int) event.getX(); 
    int y = (int) event.getY(); 

    Card card = getCardUnderTouch(x, y); 

    if(card != null) 
    { 
     Context context = getContext(); 
     Intent i = new Intent(context, BuildWord.class); 
     context.startActivity(i); 
    } 
} 

return true; 
} 

11-13 21:07:12.037: E/InputEventReceiver(712): Exception dispatching input event. 
11-13 21:07:12.037: E/MessageQueue-JNI(712): Exception in MessageQueue callback: handleReceiveCallback 
11-13 21:07:12.138: E/MessageQueue-JNI(712): java.lang.NullPointerException 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.content.ComponentName.<init>(ComponentName.java:75) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.content.Intent.<init>(Intent.java:3301) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at apk.gameshufflewords.PickCardView.onTouchEvent(PickCardView.java:79) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.View.dispatchTouchEvent(View.java:7127) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1925) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1379) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.app.Activity.dispatchTouchEvent(Activity.java:2396) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1873) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.View.dispatchPointerEvent(View.java:7307) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3174) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3119) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4155) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4134) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4226) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:171) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.os.MessageQueue.nativePollOnce(Native Method) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.os.MessageQueue.next(MessageQueue.java:125) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.os.Looper.loop(Looper.java:124) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at android.app.ActivityThread.main(ActivityThread.java:4745) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at java.lang.reflect.Method.invokeNative(Native Method) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at java.lang.reflect.Method.invoke(Method.java:511) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
11-13 21:07:12.138: E/MessageQueue-JNI(712): at dalvik.system.NativeStart.main(Native Method) 
11-13 21:07:12.167: D/AndroidRuntime(712): Shutting down VM 
11-13 21:07:12.167: W/dalvikvm(712): threadid=1: thread exiting with uncaught exception (group=0x40a13300) 
11-13 21:07:12.267: E/AndroidRuntime(712): FATAL EXCEPTION: main 
11-13 21:07:12.267: E/AndroidRuntime(712): java.lang.NullPointerException 
11-13 21:07:12.267: E/AndroidRuntime(712): at android.content.ComponentName.<init>(ComponentName.java:75) 
11-13 21:07:12.267: E/AndroidRuntime(712): at android.content.Intent.<init>(Intent.java:3301) 
11-13 21:07:12.267: E/AndroidRuntime(712): at apk.gameshufflewords.PickCardView.onTouchEvent(PickCardView.java:79) 
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.View.dispatchTouchEvent(View.java:7127) 
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176) 
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877) 
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176) 
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877) 
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176) 
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877) 
11-13 21:07:12.267: E/AndroidRuntime(712): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1925) 
11-13 21:07:12.267: E/AndroidRuntime(712): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1379) 
11-13 21:07:12.267: E/AndroidRuntime(712): at android.app.Activity.dispatchTouchEvent(Activity.java:2396) 
11-13 21:07:12.267: E/AndroidRuntime(712): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1873) 
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.View.dispatchPointerEvent(View.java:7307) 
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3174) 
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3119) 
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4155) 
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4134) 
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4226) 
11-13 21:07:12.267: E/AndroidRuntime(712): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:171) 
11-13 21:07:12.267: E/AndroidRuntime(712): at android.os.MessageQueue.nativePollOnce(Native Method) 
11-13 21:07:12.267: E/AndroidRuntime(712): at android.os.MessageQueue.next(MessageQueue.java:125) 
11-13 21:07:12.267: E/AndroidRuntime(712): at android.os.Looper.loop(Looper.java:124) 
11-13 21:07:12.267: E/AndroidRuntime(712): at android.app.ActivityThread.main(ActivityThread.java:4745) 
11-13 21:07:12.267: E/AndroidRuntime(712): at java.lang.reflect.Method.invokeNative(Native Method) 
11-13 21:07:12.267: E/AndroidRuntime(712): at java.lang.reflect.Method.invoke(Method.java:511) 
11-13 21:07:12.267: E/AndroidRuntime(712): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
11-13 21:07:12.267: E/AndroidRuntime(712): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
11-13 21:07:12.267: E/AndroidRuntime(712): at dalvik.system.NativeStart.main(Native Method) 
+1

질문에 LogCat에 표시되는 오류 메시지를 포함시킬 수 있습니까? – TofferJ

+0

'MCards.isunderTouch (x, y)'에서 무슨 일이 일어나고 있습니까? 좌표가 겹치는 지 여부 만 확인할 수 있습니까? 'MCards'에 대해'Card()'생성자를 사용할 때 좌표를 설정합니까? 모든 매개 변수는 무엇을 의미합니까? – Jon

답변

1

변경 onTouchEvent를 마찬가지로

+0

감사합니다 Robin.Works like Gem – Kruise

0

당신이 만들고있는 followinf 라인 null 컨텍스트로 새 Intent :

Context mContext; 
public PickCardView(Context context) 
{ 
    super(context); 
    mContext = context; 
    ... 
} 

그리고에 의해 의도 라인을 교체 :

Intent i = new Intent(null, BuildWord.class); 

당신은 다음을 수행해야합니다

Intent i = new Intent(mContext, BuildWord.class); 

안부.