2014-01-11 3 views
-1

Я разрабатываю Android-игру, и я получил ее до тех пор, пока я не должен включать анимацию.NullPointerException при попытке нарисовать линию - андроид

В принципе, мне нужно нарисовать линию между двумя точками. У меня есть 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); 
    } 
} 

} 

Где я буду неправильно? Заранее спасибо

UPDATE

мой 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) 
+0

пожалуйста, напишите ваш LogCat –

+3

'' canvas' является null'. Тайна решена. –

+0

, пожалуйста, опубликуйте свой LogCat или, по крайней мере, проверьте режим отладки, если db инициализирован хорошо .. и проверьте свой холст. –

ответ

3

вы не инициализирован холст, поэтому вы получаете исключения нулевого указателя:

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

инициализирует холст например:

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

и создать Покрасочную объект для рисования линии с каким-либо цветом и размером строки:

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); 
+0

см. Обновление на logcat. Я также инициализировал холст – user3185528

+0

, если мой ответ решил вашу проблему, тогда примите его как ответ, нажав на отметку слева от ответа, для других тоже помогите! @ user3185528 ​​ – Hamad

+0

он все еще не рисует – user3185528

2

Попробуйте также имеющий объект 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 
Смежные вопросы