簡體   English   中英

嘗試畫線時出現NullPointerException-Android

[英]NullPointerException when trying to draw a line - android

我正在開發一個Android游戲,直到現在需要包含動畫為止,它都可以正常工作。

基本上我需要在2點之間畫一條線。 我在一個主要的相對布局中有1個相對布局(持有一個表格布局)。

他們將鼠標懸停在9個按鈕上並創建一個序列,我需要創建一條沿着手指從一個點到下一個點的線(使用塊坐標序列)。 我將塊的順序存儲在arraylist中-像這樣:[1,2,3,6,5,4,7,8,9]。 所以我必須從第一塊到第二塊畫一條線,依此類推。

現在我介紹使用動畫.drawLine()方法。 但是每次它崩潰時都會發生NullPointerException。

我是新手,是做錯了還是遺漏了什么? 有其他關於如何執行此操作的想法嗎?

這是游戲類:

public class Game extends Activity implements OnTouchListener{

TextView memorize, menu;
ImageButton b1, b2, b3, b4, b5, b6, b7, b8, b9;
Rect b1R, b2R, b3R, b4R, b5R, b6R, b7R, b8R, b9R;
int x, y;
ArrayList<String> arr = new ArrayList<String>();
ArrayList<String> fin = new ArrayList<String>();
ArrayList<String> fin2 = new ArrayList<String>();
Intent i;
String LEVEL;
int data;
String mainSequence, gameSequence;
Paint paint1, paint2, paint3, paint4, paint5, paint6, paint7, paint8, paint9;
Canvas canvas = new Canvas();
int b1X, b1Y;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.ingame);

    Bundle extras = getIntent().getExtras();
    LEVEL = extras.getString("level");

    DB ourdb = new DB(this);
    data = 0;
    ourdb.open();
    data = ourdb.getSequence(LEVEL);
    ourdb.close();

    setup();
}

private void setup(){
    // TextViews
    memorize = (TextView) findViewById(R.id.tvMemorize);
    menu = (TextView) findViewById(R.id.tvInGameMenu);

    // ImageButtons
    b1 = (ImageButton) findViewById(R.id.ib1);
    b2 = (ImageButton) findViewById(R.id.ib2);
    b3 = (ImageButton) findViewById(R.id.ib3);
    b4 = (ImageButton) findViewById(R.id.ib4);
    b5 = (ImageButton) findViewById(R.id.ib5);
    b6 = (ImageButton) findViewById(R.id.ib6);
    b7 = (ImageButton) findViewById(R.id.ib7);
    b8 = (ImageButton) findViewById(R.id.ib8);
    b9 = (ImageButton) findViewById(R.id.ib9);

    // onclick listeners

    // ontouch listeners
    b1.setOnTouchListener(this);
    b2.setOnTouchListener(this);
    b3.setOnTouchListener(this);
    b4.setOnTouchListener(this);
    b5.setOnTouchListener(this);
    b6.setOnTouchListener(this);
    b7.setOnTouchListener(this);
    b8.setOnTouchListener(this);
    b9.setOnTouchListener(this);

    // paint
    paint1 = new Paint();
    paint1.setARGB(255, 8, 45, 0);
    paint2 = new Paint();
    paint3 = new Paint();
    paint4 = new Paint();
    paint5 = new Paint();
    paint6 = new Paint();
    paint7 = new Paint();
    paint8 = new Paint();
    paint9 = new Paint();
}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    finish();
}

@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
    // TODO Auto-generated method stub
    try {
        Thread.sleep(16);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    x = (int) arg1.getRawX();
    y = (int) arg1.getRawY();

    if(b1R.contains(x, y)){
        arr.add("1");
//          Log.d("block", "1");
        b1.setImageResource(R.drawable.checkpoint_hover);
        b2.setImageResource(R.drawable.checkpoint);
        b3.setImageResource(R.drawable.checkpoint);
        b4.setImageResource(R.drawable.checkpoint);
        b5.setImageResource(R.drawable.checkpoint);
        b6.setImageResource(R.drawable.checkpoint);
        b7.setImageResource(R.drawable.checkpoint);
        b8.setImageResource(R.drawable.checkpoint);
        b9.setImageResource(R.drawable.checkpoint);
    }
    if(b2R.contains(x,y)){
        arr.add("2");
//          Log.d("block", "2");
        b1.setImageResource(R.drawable.checkpoint);
        b2.setImageResource(R.drawable.checkpoint_hover);
        b3.setImageResource(R.drawable.checkpoint);
        b4.setImageResource(R.drawable.checkpoint);
        b5.setImageResource(R.drawable.checkpoint);
        b6.setImageResource(R.drawable.checkpoint);
        b7.setImageResource(R.drawable.checkpoint);
        b8.setImageResource(R.drawable.checkpoint);
        b9.setImageResource(R.drawable.checkpoint);
    }
    if(b3R.contains(x,y)){
        arr.add("3");
//          Log.d("block", "3");
        b1.setImageResource(R.drawable.checkpoint);
        b2.setImageResource(R.drawable.checkpoint);
        b3.setImageResource(R.drawable.checkpoint_hover);
        b4.setImageResource(R.drawable.checkpoint);
        b5.setImageResource(R.drawable.checkpoint);
        b6.setImageResource(R.drawable.checkpoint);
        b7.setImageResource(R.drawable.checkpoint);
        b8.setImageResource(R.drawable.checkpoint);
        b9.setImageResource(R.drawable.checkpoint);
    }
    if(b4R.contains(x,y)){
        arr.add("4");
//          Log.d("block", "4");
        b1.setImageResource(R.drawable.checkpoint);
        b2.setImageResource(R.drawable.checkpoint);
        b3.setImageResource(R.drawable.checkpoint);
        b4.setImageResource(R.drawable.checkpoint_hover);
        b5.setImageResource(R.drawable.checkpoint);
        b6.setImageResource(R.drawable.checkpoint);
        b7.setImageResource(R.drawable.checkpoint);
        b8.setImageResource(R.drawable.checkpoint);
        b9.setImageResource(R.drawable.checkpoint);
    }
    if(b5R.contains(x,y)){
        arr.add("5");
//          Log.d("block", "5");
        b1.setImageResource(R.drawable.checkpoint);
        b2.setImageResource(R.drawable.checkpoint);
        b3.setImageResource(R.drawable.checkpoint);
        b4.setImageResource(R.drawable.checkpoint);
        b5.setImageResource(R.drawable.checkpoint_hover);
        b6.setImageResource(R.drawable.checkpoint);
        b7.setImageResource(R.drawable.checkpoint);
        b8.setImageResource(R.drawable.checkpoint);
        b9.setImageResource(R.drawable.checkpoint);
    }
    if(b6R.contains(x,y)){
        arr.add("6");
//          Log.d("block", "6");
        b1.setImageResource(R.drawable.checkpoint);
        b2.setImageResource(R.drawable.checkpoint);
        b3.setImageResource(R.drawable.checkpoint);
        b4.setImageResource(R.drawable.checkpoint);
        b5.setImageResource(R.drawable.checkpoint);
        b6.setImageResource(R.drawable.checkpoint_hover);
        b7.setImageResource(R.drawable.checkpoint);
        b8.setImageResource(R.drawable.checkpoint);
        b9.setImageResource(R.drawable.checkpoint);
    }
    if(b7R.contains(x,y)){
        arr.add("7");
//          Log.d("block", "7");
        b1.setImageResource(R.drawable.checkpoint);
        b2.setImageResource(R.drawable.checkpoint);
        b3.setImageResource(R.drawable.checkpoint);
        b4.setImageResource(R.drawable.checkpoint);
        b5.setImageResource(R.drawable.checkpoint);
        b6.setImageResource(R.drawable.checkpoint);
        b7.setImageResource(R.drawable.checkpoint_hover);
        b8.setImageResource(R.drawable.checkpoint);
        b9.setImageResource(R.drawable.checkpoint);
    }
    if(b8R.contains(x,y)){
        arr.add("8");
//          Log.d("block", "8");
        b1.setImageResource(R.drawable.checkpoint);
        b2.setImageResource(R.drawable.checkpoint);
        b3.setImageResource(R.drawable.checkpoint);
        b4.setImageResource(R.drawable.checkpoint);
        b5.setImageResource(R.drawable.checkpoint);
        b6.setImageResource(R.drawable.checkpoint);
        b7.setImageResource(R.drawable.checkpoint);
        b8.setImageResource(R.drawable.checkpoint_hover);
        b9.setImageResource(R.drawable.checkpoint);
    }
    if(b9R.contains(x,y)){
        arr.add("9");
//          Log.d("block", "9");
        b1.setImageResource(R.drawable.checkpoint);
        b2.setImageResource(R.drawable.checkpoint);
        b3.setImageResource(R.drawable.checkpoint);
        b4.setImageResource(R.drawable.checkpoint);
        b5.setImageResource(R.drawable.checkpoint);
        b6.setImageResource(R.drawable.checkpoint);
        b7.setImageResource(R.drawable.checkpoint);
        b8.setImageResource(R.drawable.checkpoint);
        b9.setImageResource(R.drawable.checkpoint_hover);
    }

    sort();

    if(fin.toString() != null){
        Log.d("log", fin.toString());
    }



    if(arg1.getAction() == MotionEvent.ACTION_UP){
        paintLine(x,y);
        b1.setImageResource(R.drawable.checkpoint);
        b2.setImageResource(R.drawable.checkpoint);
        b3.setImageResource(R.drawable.checkpoint);
        b4.setImageResource(R.drawable.checkpoint);
        b5.setImageResource(R.drawable.checkpoint);
        b6.setImageResource(R.drawable.checkpoint);
        b7.setImageResource(R.drawable.checkpoint);
        b8.setImageResource(R.drawable.checkpoint);
        b9.setImageResource(R.drawable.checkpoint);
        checkSequence();
        arr.clear();
        fin.clear();
    }

    return false;
}

private void paintLine(int x2, int y2) {
    // TODO Auto-generated method stub
//      Log.d("x2", ""+x2);
//      Log.d("y2", ""+y2);
    canvas.drawLine(78, 362, 100, 400, paint1);
}

private void checkSequence() {
    // TODO Auto-generated method stub

    mainSequence = "";

    for(String s : fin){
        mainSequence += s;
    }

    fin.clear();

    mainSequence = mainSequence.replace("null", "");

    gameSequence = ""+data;

    Log.d("main sequence", mainSequence);
    Log.d("game sequence", gameSequence);

    if(mainSequence.equals(gameSequence)){
        Log.d("game", "win");
    }
}

private void sort() {
    // TODO Auto-generated method stub
    for(int i=0; i<arr.size(); i++){
        if(!fin.contains(arr.get(i))){
            fin.add(arr.get(i));
        }
    }
}

@Override
public void onWindowFocusChanged (boolean hasFocus){
    super.onWindowFocusChanged(hasFocus);
    if(hasFocus){

        b1R = new Rect(b1.getLeft(), b1.getTop()+300, b1.getRight(), b1.getBottom()+300);
        b2R = new Rect(b2.getLeft(), b2.getTop()+300, b2.getRight(), b2.getBottom()+300);
        b3R = new Rect(b3.getLeft(), b3.getTop()+300, b3.getRight(), b3.getBottom()+300);
        b4R = new Rect(b4.getLeft(), b4.getTop()+420, b4.getRight(), b4.getBottom()+420);
        b5R = new Rect(b5.getLeft(), b5.getTop()+420, b5.getRight(), b5.getBottom()+420);
        b6R = new Rect(b6.getLeft(), b6.getTop()+420, b6.getRight(), b6.getBottom()+420);
        b7R = new Rect(b7.getLeft(), b7.getTop()+540, b7.getRight(), b7.getBottom()+540);
        b8R = new Rect(b8.getLeft(), b8.getTop()+540, b8.getRight(), b8.getBottom()+540);
        b9R = new Rect(b9.getLeft(), b9.getTop()+540, b9.getRight(), b9.getBottom()+540);

        b1X = b1R.width()/2;
        b1Y = b1R.height()/2;

        Log.d("b1X" , ""+b1X);
        Log.d("b1Y" , ""+b1Y);
    }
}

}

我要去哪里錯了? 提前致謝

更新

我logcat的:

01-11 19:52:34.384: E/AndroidRuntime(797): FATAL EXCEPTION: main
01-11 19:52:34.384: E/AndroidRuntime(797): java.lang.NullPointerException
01-11 19:52:34.384: E/AndroidRuntime(797):  at android.graphics.Canvas.drawLine(Canvas.java:809)
01-11 19:52:34.384: E/AndroidRuntime(797):  at com.docime.vamoose.patternz.Game.paintLine(Game.java:264)
01-11 19:52:34.384: E/AndroidRuntime(797):  at com.docime.vamoose.patternz.Game.onTouch(Game.java:242)
01-11 19:52:34.384: E/AndroidRuntime(797):  at android.view.View.dispatchTouchEvent(View.java:3762)
01-11 19:52:34.384: E/AndroidRuntime(797):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
01-11 19:52:34.384: E/AndroidRuntime(797):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
01-11 19:52:34.384: E/AndroidRuntime(797):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
01-11 19:52:34.384: E/AndroidRuntime(797):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
01-11 19:52:34.384: E/AndroidRuntime(797):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
01-11 19:52:34.384: E/AndroidRuntime(797):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
01-11 19:52:34.384: E/AndroidRuntime(797):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
01-11 19:52:34.384: E/AndroidRuntime(797):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671)
01-11 19:52:34.384: E/AndroidRuntime(797):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
01-11 19:52:34.384: E/AndroidRuntime(797):  at android.app.Activity.dispatchTouchEvent(Activity.java:2086)
01-11 19:52:34.384: E/AndroidRuntime(797):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1655)
01-11 19:52:34.384: E/AndroidRuntime(797):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1785)
01-11 19:52:34.384: E/AndroidRuntime(797):  at android.os.Handler.dispatchMessage(Handler.java:99)
01-11 19:52:34.384: E/AndroidRuntime(797):  at android.os.Looper.loop(Looper.java:123)
01-11 19:52:34.384: E/AndroidRuntime(797):  at android.app.ActivityThread.main(ActivityThread.java:4627)
01-11 19:52:34.384: E/AndroidRuntime(797):  at java.lang.reflect.Method.invokeNative(Native Method)
01-11 19:52:34.384: E/AndroidRuntime(797):  at java.lang.reflect.Method.invoke(Method.java:521)
01-11 19:52:34.384: E/AndroidRuntime(797):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-11 19:52:34.384: E/AndroidRuntime(797):  at  com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-11 19:52:34.384: E/AndroidRuntime(797):  at dalvik.system.NativeStart.main(Native Method)

您尚未初始化畫布,這就是為什么出現空指針異常的原因:

 canvas.drawLine(78, 362, 100, 400, null);

像這樣初始化畫布:

Bitmap canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
canvas = new Canvas(canvasBitmap);

並創建piant對象以繪制具有某些顏色和線條尺寸的線條:

Paint drawPaint=new Paint();
drawPaint.setAntiAlias(true);
drawPaint.setStrokeWidth(20);
drawPaint.setStyle(Paint.Style.STROKE);
drawPaint.setStrokeJoin(Paint.Join.ROUND);
drawPaint.setStrokeCap(Paint.Cap.ROUND);

然后畫線:

canva.drawLine(78, 362, 100, 400, drawPaint);

嘗試讓Paint對象初始化Paint paint = new Paint(); 而不是使用null。

來自http://developer.android.com/reference/android

public void drawLine (float startX, float startY, float stopX, float stopY, Paint paint)

Parameters
startX  The x-coordinate of the start point of the line
startY  The y-coordinate of the start point of the line
paint   The paint used to draw the line

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM