Android 从布局中查看?

Android 从布局中查看?,android,eclipse,layout,view,android-layout,Android,Eclipse,Layout,View,Android Layout,我有一个从AndroidsAPI演示中复制的Finger paint程序,我对它做了一点修改,希望从调用视图的xml文件调用它,而不是直接调用主Java中的视图。我为MyView.java创建了一个新类,而不是将其直接放在主java文件中,以便将其调用到xml中。现在MyView.java被设置为extensedview,而保存视图的xml被设置为my.project.MyView。我的主java中的setContentView设置为setContentView(R.layout.main)。当

我有一个从AndroidsAPI演示中复制的Finger paint程序,我对它做了一点修改,希望从调用视图的xml文件调用它,而不是直接调用主Java中的视图。我为MyView.java创建了一个新类,而不是将其直接放在主java文件中,以便将其调用到xml中。现在MyView.java被设置为
extensedview
,而保存视图的xml被设置为
my.project.MyView
。我的主java中的
setContentView
设置为
setContentView(R.layout.main)
。当我试着运行程序时,我得到了一个FC。我不能这样做吗?MyView是否应设置为扩展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>
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;
}
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)
 // commit the path to our offscreen
    mCanvas.drawPath(mPath, mPaint);
}

MyMain java:

<?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>
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;
}
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)
 // commit the path to our offscreen
    mCanvas.drawPath(mPath, mPaint);
日志目录:

<?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>
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;
}
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)
 // commit the path to our offscreen
    mCanvas.drawPath(mPath, mPaint);
第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)
这是我的润色

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();
}
润色的第75行:

<?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>
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;
}
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)
 // 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;
}
touch_up();
第95行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;
}
touch_up();
程序现在也启动了,但我一触屏就收到了一个FC。
-谢谢,这只是一个初步的预感,但要开始自定义视图,构造函数还必须至少具有AttributeSet字段

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

这只是一个初步的预感,但从自定义视图构造函数开始,它至少还必须具有AttributeSet字段

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

是的,您可以这样做,扩展
视图是正确的,这是创建自定义视图的方式

如LogCat所示,您的错误是由自定义类的
onDraw
方法引起的-其中的某些内容为null


java.lang.NullPointerException
位于
www.hotapp.com.thepatch.html.MyView.onDraw(MyView.java:42)
是的,您可以这样做,扩展
视图是正确的,这是创建自定义视图的方式

如LogCat所示,您的错误是由自定义类的
onDraw
方法引起的-其中的某些内容为null



java.lang.NullPointerException
www.hotapp.com.thepatch.html.MyView.onDraw(MyView.java:42)
我找到了答案。这太简单了。在我的
MyView.Java
内部,我有
private Paint mPaint
private Paint mBitmapPaint
,这两个属性冲突,所以我拿出了
private Paint mPaint
,程序运行得很好。谢谢大家对我的帮助。

我想出来了。这太简单了。在我的
MyView.Java
内部,我有
private Paint mPaint
private Paint mBitmapPaint
,这两个属性冲突,所以我拿出了
private Paint mPaint
,程序运行得很好。谢谢大家对我的帮助。

像往常一样,使用FC时,logcat会很有帮助。发布你的onDraw方法,因为这是力闭合的来源。@ColdForged我添加了我的Log cat。@dmon添加了完整的onDraw方法。与往常一样,使用FC时,logcat会很有帮助。发布你的onDraw方法,因为这就是强制关闭的来源。@ColdForged我已经添加了我的日志cat。@dmon完整的onDraw方法已经添加。@MyView的Joseph Earl第42行是
canvas.drawPath(mPath,mPaint)我不确定its是否表示为null。@Joseph Earl我是否可以将log语句添加到onDraw()函数中。。。对不起,我是日志猫和日志记录的新手。是的,添加一个
log.d(“SOME_TAG”,“onDraw:mPath=“+mPath+”,mpain=“+mPaint”)在调用
canvas.drawPath
之前。
SOME_标记可以是任何东西,通常使用类的名称,这样很容易区分。@上面添加了Joseph Earl编辑。如果不太大,您可以将完整代码发布到MyView.java吗?@Joseph Earl MyView的第42行是
canvas.drawPath(mPath,mPaint)我不确定its是否表示为null。@Joseph Earl我是否可以将log语句添加到onDraw()函数中。。。对不起,我是日志猫和日志记录的新手。是的,添加一个
log.d(“SOME_TAG”,“onDraw:mPath=“+mPath+”,mpain=“+mPaint”)在调用
canvas.drawPath
之前。
SOME_标记
可以是任何东西,通常使用类的名称,这样很容易区分。@上面添加了Joseph Earl编辑。如果不太大,您可以将完整代码发布到MyView.java吗?