2011-05-05 84 views
1

我有一個手指畫圖程序,我從androids API演示中複製出來的,我已經改變了一點點,並且希望從調用視圖的xml文件中調用,而不是直接調用視圖到主Java中。我爲MyView.java創建了一個新類,而不是直接在主java文件中,以便我可以將它調用到xml中。現在MyView.java設置爲extends View,我有我的xml保存視圖設置爲my.project.MyView。和我的主要java裏面的setContentView,設置爲setContentView(R.layout.main)。當我嘗試運行該程序時,我正在獲得一個FC。我無法做到這一點嗎? MyView應設爲extends SurfaceView主要XML:從佈局查看?

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 
<my.project.MyView 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
/> 
</LinearLayout> 

MyView.java:

public class MyView extends View { 

private static final String TAG = "MyApp"; 

private Bitmap mBitmap; 
private Canvas mCanvas; 
private Path mPath; 
private Paint mBitmapPaint; 

private Paint  mPaint; 

public MyView(Context c, AttributeSet attr) { 
    super(c, attr); 
    //**size of drawing area.**\\ 
    mBitmap = Bitmap.createBitmap(480,650, Bitmap.Config.ARGB_8888); 
    mCanvas = new Canvas(mBitmap); 
    mPath = new Path(); 
    mBitmapPaint = new Paint(Paint.DITHER_FLAG); 

} 

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

@Override 
protected void onDraw(Canvas canvas) { 

    canvas.drawColor(0xFFAAAAAA); 

    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 

    try{ 
    canvas.drawPath(mPath, mPaint); 
    }catch(Exception exception){ 
     Log.d(TAG, "mPath=" + mPath + ", mPaint=" + mPaint); 
    } 

} 

private float mX, mY; 
private static final float TOUCH_TOLERANCE = 4; 

private void touch_start(float x, float y) { 
    mPath.reset(); 
    mPath.moveTo(x, y); 
    mX = x; 
    mY = y; 
} 
private void touch_move(float x, float y) { 
    float dx = Math.abs(x - mX); 
    float dy = Math.abs(y - mY); 
    if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
     mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
     mX = x; 
     mY = y; 
    } 
} 
private void touch_up() { 
    mPath.lineTo(mX, mY); 
    // commit the path to our offscreen 
    mCanvas.drawPath(mPath, mPaint); 
    // kill this so we don't double draw 
    mPath.reset(); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    float x = event.getX(); 
    float y = event.getY(); 

    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      touch_start(x, y); 
      invalidate(); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      touch_move(x, y); 
      invalidate(); 
      break; 
     case MotionEvent.ACTION_UP: 
      touch_up(); 
      invalidate(); 
      break; 
    } 
    return true; 
} 

}

MyMain的java:

public class MyMain extends GraphicsActivity 
    implements ColorPickerDialog.OnColorChangedListener {  

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
} 
} 

登錄貓:

05-05 09:26:30.668: ERROR/AndroidRuntime(8104): FATAL EXCEPTION: main 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104): java.lang.NullPointerException 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at android.graphics.Canvas.drawPath(Canvas.java:950) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at www.hotapp.com.thepatch.html.MyView.onDraw(MyView.java:42) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at android.view.View.draw(View.java:6740) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at android.view.ViewGroup.drawChild(ViewGroup.java:1640) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at android.view.ViewGroup.drawChild(ViewGroup.java:1638) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at android.view.View.draw(View.java:6743) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at android.widget.FrameLayout.draw(FrameLayout.java:352) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at android.view.ViewGroup.drawChild(ViewGroup.java:1640) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at android.view.ViewGroup.drawChild(ViewGroup.java:1638) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at android.view.View.draw(View.java:6743) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at android.widget.FrameLayout.draw(FrameLayout.java:352) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1842) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at android.view.ViewRoot.draw(ViewRoot.java:1407) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at android.view.ViewRoot.performTraversals(ViewRoot.java:1163) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1727) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at android.os.Handler.dispatchMessage(Handler.java:99) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at android.os.Looper.loop(Looper.java:123) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at java.lang.reflect.Method.invoke(Method.java:521) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
05-05 09:26:30.668: ERROR/AndroidRuntime(8104):  at dalvik.system.NativeStart.main(Native Method) 

線42

canvas.drawPath(mPath, mPaint); 

編輯

我把

try{ 
    canvas.drawPath(mPath, mPaint); 
    }catch(Exception exception){ 
     Log.d(TAG, "mPath=" + mPath + ", mPaint=" + mPaint); 
    } 

在我的日誌我的貓凸輪Ë了

05-05 10:15:03.418: ERROR/AndroidRuntime(8596): FATAL EXCEPTION: main 
05-05 10:15:03.418: ERROR/AndroidRuntime(8596): java.lang.NullPointerException 
05-05 10:15:03.418: ERROR/AndroidRuntime(8596):  at android.graphics.Canvas.drawPath(Canvas.java:950) 
05-05 10:15:03.418: ERROR/AndroidRuntime(8596):  at www.hotapp.com.thepatch.html.MyView.touch_up(MyView.java:75) 
05-05 10:15:03.418: ERROR/AndroidRuntime(8596):  at www.hotapp.com.thepatch.html.MyView.onTouchEvent(MyView.java:95) 
05-05 10:15:03.418: ERROR/AndroidRuntime(8596):  at android.view.View.dispatchTouchEvent(View.java:3766) 
05-05 10:15:03.418: ERROR/AndroidRuntime(8596):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
05-05 10:15:03.418: ERROR/AndroidRuntime(8596):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
05-05 10:15:03.418: ERROR/AndroidRuntime(8596):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
05-05 10:15:03.418: ERROR/AndroidRuntime(8596):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936) 
05-05 10:15:03.418: ERROR/AndroidRuntime(8596):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671) 
05-05 10:15:03.418: ERROR/AndroidRuntime(8596):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 
05-05 10:15:03.418: ERROR/AndroidRuntime(8596):  at android.app.Activity.dispatchTouchEvent(Activity.java:2086) 
05-05 10:15:03.418: ERROR/AndroidRuntime(8596):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1655) 
05-05 10:15:03.418: ERROR/AndroidRuntime(8596):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1785) 
05-05 10:15:03.418: ERROR/AndroidRuntime(8596):  at android.os.Handler.dispatchMessage(Handler.java:99) 
05-05 10:15:03.418: ERROR/AndroidRuntime(8596):  at android.os.Looper.loop(Looper.java:123) 
05-05 10:15:03.418: ERROR/AndroidRuntime(8596):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
05-05 10:15:03.418: ERROR/AndroidRuntime(8596):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-05 10:15:03.418: ERROR/AndroidRuntime(8596):  at java.lang.reflect.Method.invoke(Method.java:521) 
05-05 10:15:03.418: ERROR/AndroidRuntime(8596):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
05-05 10:15:03.418: ERROR/AndroidRuntime(8596):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
05-05 10:15:03.418: ERROR/AndroidRuntime(8596):  at dalvik.system.NativeStart.main(Native Method) 

這是我touch_up

private void touch_up() { 
    mPath.lineTo(mX, mY); 
    // commit the path to our offscreen 
    mCanvas.drawPath(mPath, mPaint); 
    // kill this so we don't double draw 
    mPath.reset(); 
} 

線的touch_up 75:

// commit the path to our offscreen 
    mCanvas.drawPath(mPath, mPaint); 

我的onTouchEvent

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    float x = event.getX(); 
    float y = event.getY(); 

    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      touch_start(x, y); 
      invalidate(); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      touch_move(x, y); 
      invalidate(); 
      break; 
     case MotionEvent.ACTION_UP: 
      touch_up(); 
      invalidate(); 
      break; 
    } 
    return true; 
} 

線95的onTouchEvent

touch_up(); 

另外的程序開始了,但只要我觸摸屏幕,我收到了FC。 - 感謝

+0

像往常一樣使用FC,logcat會有所幫助。 – 2011-05-05 15:08:17

+0

發佈您的onDraw方法,因爲這是Force Close的來源。 – dmon 2011-05-05 15:38:37

+0

@ColdForged我已經添加了我的日誌貓。 – Christian 2011-05-05 15:40:13

回答

0

我想通了什麼 -

作爲logcat的節目,你的錯誤是由您的自定義類的onDraw方法造成的。它非常簡單。我的MyView.Java裏面有private Paint mPaintprivate Paint mBitmapPaint這是衝突的,所以我拿出private Paint mPaint,程序運行的很好。謝謝大家對我給予的幫助。

1

只是一個初始的預感,但要開始您的自定義視圖構造函數,還必須至少具有AttributeSet字段。

public class MyView extends View { 
.............. 
.............. 
    public MyView(Context c, AttributeSet attr) { 
    super(c, attr); 
    .............. 
    .............. 
    } 
+0

我添加它仍然是一個FC。感謝您的迴應。 – Christian 2011-05-05 15:25:48

0

是的,你可以做到這一點,這是正確的延長View,它是你如何創建自定義視圖。在那裏是空

java.lang.NullPointerExceptionwww.hotapp.com.thepatch.html.MyView.onDraw(MyView.java:42)

+0

@ MyView的約瑟夫厄爾第42行是'canvas.drawPath(mPath,mPaint);'我不知道它說它是否爲null。 – Christian 2011-05-05 15:39:37

+0

@Joseph伯爵我只是將日誌語句添加到onDraw()函數中...對不起,我是新來的日誌貓和日誌記錄的東西。 – Christian 2011-05-05 16:03:56

+0

是在你調用canvas.drawPath之前添加'Log.d(「SOME_TAG」,「onDraw:mPath =」+ mPath +「,mPaint =」+ mPaint);' 'SOME_TAG'可以是任何東西,通常使用班級名稱,因此很容易將事情分開。 – 2011-05-05 16:10:23