2011-05-05 105 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